自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 18 EEPROM读写

EEPROM (Electrically Erasable Progammable Read Only Memory,E2PROM)即电可擦除可编程只读存储器,是一种常用的非易失性存储器(掉电数据不丢失),EEPROM 有多种类型的产品,此次实验使用的是ATMEL 公司生产的 AT24C 系列的 AT24C64 这一型号。AT24C64 具有高可靠性,可对所存数据保存 100 年,并可多次擦写,擦写次数达一百万次。

2024-06-02 18:56:03 1039

原创 17 SPI FLASH读写

SPI 协议简介SPI 即 Serial Periphera linterface 的缩写,顾名思义就是串行外围设备接口,主要用于与FLASH、实时时钟、AD 转换器等外设模块的通信,它是一种高速的全双工同步的通信总线。SPI 设备分为主设备和从设备,SPI 通信必须由主设备发起,主设备通过片选引脚(CSn)来选择对应的从设备,通过时钟引脚(SCK)向从设备提供时钟,通过数据输出引脚(MOSI)引脚向从设备发送数据,通过数据输入引脚(MISO)引脚来读取从设备返回的数据,如下是 SPI 的总线拓扑图(分

2024-05-12 22:14:06 1086

原创 16 RGB-LCD 彩条显示

TFT-LCD 的全称是 Thin Film Transistor-Liquid Crystal Display,即薄膜晶体管液晶显示屏,它显示的每个像素点都是由集成在液晶后面的薄膜晶体管独立驱动,因此 TFT-LCD 具有较高的响应速度以及较好的图像质量。液晶显示器是现在最常用的显示器,如手机、电脑等各种人机交互设备基本都用到了 LCD。

2024-04-03 23:13:43 953

原创 15 UART回环

常用的通信方式可分为为串行通信(serial communication)和并行通信(parallel communication)两种。并行通信是多比特数据同时通过并行线进行传送(一般以字或字节为单位并行进行传输),这种传输方式用的线多、成本高、速率高、要考虑时延匹配,不宜进行长距离通信,因此并行通信一般用于板载外设的通信。串行通信是数据在一条线上一比特接一比特地按顺序进行传送,这种传输方式线少、成本低、速率低,事宜用于长距离通信,因此串行通信常用于不同设备之间的通信。

2024-03-24 20:59:28 785

原创 14 FIFO IP核

FIFO(First In First Out,即先入先出)是一种数据缓存器,用来实现数据先入先出的读写方式。FIFO由 RAM 加读写控制逻辑构成,其与普通 RAM 的区别在于 FIFO 没有外部读写地址线,使用起来非常简单,但 FIFO 只能顺序写入数据,并按顺序读出数据,其数据地址由内部读写指针自动加 1 完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。根据 FIFO 工作的时钟域,可以将 FIFO 分为同步 FIFO 和异步 FIFO。

2024-03-10 12:53:25 1041

原创 13 双口 RAM IP 核

双口 RAM IP 核有两个端口,它又分为伪双端口 RAM 和真双端口 RAM,伪双端口 RAM 一个端口只能读,另一个端口只能写,真双端口 RAM 两个端口都可以进行读写操作。同时对存储器进行读写操作时就会用到双端口 RAM,例如有一个 FIFO 存储器,需要同时对其进行数据的写入和读出,这时候就需要一个写端口和一个读端口。

2024-03-02 21:36:26 1463

原创 12 单口RAM IP核

RAM 是随机存取存储器(Random Access Memory)的简称,它是一种易失性存储器,RAM 工作时可以随时从任意一个合法地址写入或读取数据。Vivado 软件自带的 Block Memory Generator IP 核(缩写为 BMG,中文名为块 RAM 生成器),可以用来配置单口RAM、伪双口RAM、真双口RAM、ROM( ROM 是一种只读存储器,也就是说,在工作时只能读出数据,而不能写入数据)。对于单端口 RAM,读写操作共用一组地址端口和数据端口,因此读写操作不能同时进行;对于伪双

2024-02-29 21:43:55 992

原创 11 PLL IP核

锁相环(PLL)作为一种反馈控制电路,其特点是利用外部输入的参考信号来控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。锁相环拥有强大的性能,可以对输入到 FPGA 的时钟信号进行任意分频、倍频、相位调整、占空比调整,从而输出一个期望时钟;

2024-02-27 21:42:37 1100

原创 10 在线逻辑分析仪的使用

传统的 FPGA 板级调试是将逻辑分析仪连接到 FPGA 的 IO 引脚上 ,然后将内部信号引出至 IO 引脚,再进行板级调试,这种方法的缺点是我们需要一个逻辑分析仪,且还要在 PCB 中预留测试点。

2024-02-25 19:05:52 1238

原创 09 呼吸灯

呼吸灯实际展示的效果就是一个 LED 灯的亮度由亮到暗,再由暗到亮的变化过程,并且该过程是循环往复的,像呼吸一样那么有节奏。呼吸灯通常是采用 PWM(Pulse Width Modulation,即脉冲宽度调制) 的方式实现,在 PWM 频率固定的情况下,通过调整其占空比来控制 LED 灯亮度的变化。在固定周期的 PWM 信号下,如果其占空比为 0,则 LED 灯不亮;如果其占空比为100%,则 LED 灯最亮。

2024-02-25 10:54:09 1430

原创 08 按键消抖

蜂鸣器按照结构原理不同可分为压电式蜂鸣器和电磁式蜂鸣器。压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成;电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。压电式蜂鸣器是利用压电效应原理工作的,当对其施加交变电压时它会产生机械振动发声;电磁式蜂鸣器是接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。蜂鸣器按照驱动方式不同又可分为有源蜂鸣器和无源蜂鸣器,其主要区别为蜂鸣器内部是否含有震荡源。

2024-02-21 20:33:35 819

原创 07 按键控制 LED

按键开关是一种电子开关,属于电子元器件类。常见的按键开关有两种,第一种是轻触式按键开关(简称轻触开关),使用时以向开关的操作方向施加压力使内部电路闭合接通,当撤销压力时开关断开,其内部结构是靠金属弹片受力后发生形变来实现通断的;第二种是自锁按键,自锁按键第一次按下后保持接通,即自锁,第二次按下后,开关断开,同时开关按钮弹出来。

2024-02-18 17:11:45 1289

原创 06 分频器设计

实现分频一般有两种方法,一种方法是直接使用 PLL 进行分频,比如在 FPGA 或者 ASIC 设计中,都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性,无法得到频率很低的时钟信号,比如输入 100Mhz 时钟,很多PLL 都无法得到 1Mhz 以下的时钟信号。另外一种方法是直接使用 Verilog 代码来实现分频。

2024-02-18 12:11:52 1182

原创 05 状态机

Verilog 是硬件描述语言,它所生成的电路都是并行执行的,当需要按照流程或者步骤来完成某个功能时,可以使用多个 if 嵌套语句来实现,但是这样就增加了代码的复杂度,使得代码可读性差、维护困难,此时若通过状态机来控制程序流程即可解决这个问题。状态机相当于一个控制器,它将一项复杂流程的流程分解为若干步,每步对应于一个状态,通过预先设计的规则在各状态之间进行跳转,从而控制程序执行流程的目的。

2024-02-02 19:49:31 917

原创 04 避免 Latch 的产生

latch 即锁存器,是一种对电平敏感的存储单元电路,和寄存器一样都是基本存储单元,但是寄存器是边沿触发的存储器,锁存器是电平触发的存储器。

2024-01-31 21:13:29 647

原创 03 Verilog HDL 语法

Verilog HDL(Hardware Description Language)是在 C 语言的基础上发展起来的一种硬件描述语言(用它可以表示逻辑电路图、逻辑表达式、数字逻辑系统所完成的逻辑功能等)具有灵活性高、易学易用等特点。Verilog HDL 可以在较短的时间内学习和掌握,目前已经在 FPGA 开发/IC 设计领域占据绝对的领导地位。

2024-01-29 21:30:32 1593

原创 02体验FPGA开发流程

发光二极管的原理图如下所示,发光二极管LED0阴极连到 S8050(NPN三极管)的集电极上,阳极通过电阻与 3.3V 电压相连,三极管的基极与 FPGA 的V9脚相连。可以通过改变三极管的状态来控制 LED 的亮灭,当 FPGA 输出到为高电平时,三极管导通,LED 灯亮,当 FPGA 输出到为低电平时,三极管截止,LED 灯灭。

2024-01-23 21:00:14 1072

原创 1 FPGA开发环境安装

Vivado 设计套件是 FPGA 厂商赛灵思(Xilinx)公司于 2012 年发布的全新集成开发环境,以提升生产力、缩短产品上市时间、实现可编程系统集成等为目的而设计的软件,是设计开发赛灵思(Xilinx)FPGA必不可少的软件根据,Modelsim 是 Mentor 公司设计的业界最优秀的语言仿真工具,它支持 VHDL 与 Verilog 混合仿真,具有编译仿真速度快、编译的代码与平台无关等特性。

2024-01-21 15:39:14 1155

原创 12.5在Linux中编写队列模式的SPI控制器驱动

在Linux内核中更加推荐使用队列模式的SPI控制器驱动,而且队列模式的SPI控制器驱动也更加简单,只需要在驱动中实现单个spi_transfer的传输即可,将spi_message拆解为spi_transfer、片选GPIO控制、统计信息更新等均由SPI核心去完成。

2024-01-20 12:52:50 989

原创 12.4在Linux中编写阻塞模式的SPI控制器驱动

用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- dtbs -j8编译设备树,用新的.dtb文件启动系统。这里编写一个虚拟的SPI控制器驱动,通过printk来输出SPI控制器的工作状态。

2024-01-14 21:04:17 909

原创 12.3在应用层使用SPI总线

在SPI总线驱动框架中提供了一个spidev 的字符设备驱动,在应用层可以通过它来访问SPI总线。

2024-01-14 13:12:42 539

原创 12.2内核空间基于SPI总线的OLED驱动

显存被分为8页、128列,要写某个字节时,需要先指定地址(哪页、哪列),然后写入1字节的数据。OLED上有128*64个像素(128列,64行),每个像素只有2种状态:亮、灭。OLED驱动程序基于SPI总线驱动框架和缓冲帧驱动框架编写,有关缓冲帧的内容参考。注意:没有MISO引脚,因为主控只能向OLED写数据,不能读取OLED的数据。SCL(D0):CLK 时钟 (高电平 2.2V~5.5V)SDA(D1):MOSI 数据(高电平 2.2V~5.5V)D/C:数据/命令(高电平 2.2V~5.5V)

2024-01-14 12:05:49 897

原创 12.1SPI驱动框架

DO(MOSI):Master Output, Slave Input, SPI主控用来发出数据,SPI从设备用来接收数据DI(MISO) :Master Input, Slave Output, SPI主控用来发出数据,SPI从设备用来接收数据SCK: Serial Clock,时钟CS:Chip Select,芯片选择引脚。

2024-01-10 22:02:53 965

原创 11.3编写Linux串口驱动

这里以一个虚拟串口为例来介绍串口驱动的编写,它在 proc 文件系统中创建了一个文件,通过向这个文件写入数据来模拟串口硬件的接收(写入数据时先将数据写入到虚拟串口接收FIFO中,然后调度工作队列,用以模拟串口中断处理函数来处理写入到虚拟串口接收FIFO中的数据),通过串口发送的数据会写入虚拟串口发送FIFO中,然后可以通过这个文件来读取虚拟串口发送FIFO中的数据,用于模拟串口硬件发送。中编写的串口回环用于程序。

2024-01-07 14:37:31 1152

原创 11.2 Linux串口驱动框架

注册 uart_driver 的本质就是注册 tty_driver ,只是这个 tty_driver 属于uart_driver ,且对应的的操作函数集合具体操作对象为 uart_driver ( uart_driver 继承于 tty_driver )。在 uart_driver 下添加 uart_port 的本质就是在其对应的 tty_driver 下添加 tty_port ,只不过事先通过 uart_state 将 uart_port 和 tty_port 进行了关联。且在内核配置选项中使能。

2024-01-05 23:56:06 1190

原创 11.1Linux串口应用程序开发

UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。

2023-12-25 22:04:49 1104

原创 10.3 uinput

uinput 是一个内核驱动,应用程序通过它可以在内核中模拟一个输入设备,其设备文件名是 /dev/uinput 或 /dev/input/uinput。

2023-12-24 20:03:13 463

原创 10.2多点触摸屏驱动

配置信息:其中配置信息的byte1~4表示触摸屏尺寸:产品ID:触摸坐标:虽然一共有10组触摸点坐标寄存器组,但是它最多支持同时跟踪5个触摸点。

2023-12-24 16:31:14 1153

原创 10.1Linux输入子系统介绍

鼠标、键盘、按键、触摸屏等提供输入支持的设备都属于输入设备,在Linux也提供了一套驱动框架“input 子系统”与之对应,用于抽象输入设备,并提供管理输入设备驱动和输入事件处理程序的功能。

2023-12-15 21:18:36 96

原创 9.5I2C适配器驱动

此章节利用GPIO模拟I2C时序实现一个I2C适配器驱动,有关I2C时序相关内容可以参考博文。

2023-12-07 21:23:05 34

原创 9.4在内核空间使用I2C总线

此章节以AP3216C驱动为例子演示如何在内核空间使用I2C总线。

2023-12-06 20:45:21 42

原创 9.3在应用层使用I2C总线

AP3216C集成了光强(Ambilent Light Sensor,ALS)、距离(Proximity Sensor,PS)和红外传感器(Infrared Radiation LED,IR),该芯片通过IIC接口与主控芯片交互。从原理图中可以看出AP3216C接在控制器的I2C5 I2C接口上,所复用的GPIO分别是PA11和PA12。

2023-11-19 20:34:56 270

原创 9.2I2C-Tools的移植和使用

I2C-Tools 是一套在应用层通过命令行访问 IIC 设备的命令集合,它基于 Linux 内核提供的 I2C-dev 驱动实现,源代码可在“https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/“下载。

2023-11-18 19:33:16 106

原创 9.1 I2C总线数据结构

在那条 I2C 总线下挂载设备就在那条总线的设备树节点下添加对应设备的子节点,节点命名规则“ [标签:]名称[@地址]”,节点内容必须包含 reg 属性和 compatible 属性, reg 属性用于描述设备地址, compatible 属性用于设备和驱动的匹配,如下是在 i2c5 中添加一个 ap3216c 设备节点的示例。I2C 设备可以使用i2c_transfer函数传输数据包,另外内核中页提供了其他的数据传输函数,不过基本都是基于i2c_transfer进行封装的。

2023-11-18 17:36:53 114

原创 8.2LCD-TFT显示控制器驱动 (LCD驱动)

LCD-TFT显示控制器 (LTDC)驱动。

2023-09-07 21:03:23 858

原创 8.1缓冲帧(Framebuffer)驱动框架

【代码】8.1缓冲帧(Framebuffer)驱动框架。

2023-09-05 20:05:24 98

原创 7.3 虚拟GPIO驱动

GPIO控制器驱动的核心就是创建struct gpio_chip对象,并初始化其中内容,然后利用devm_gpiochip_add_data或gpiochip_add_data注册GPIO控制器驱动(它会在内部创建并注册一个struct gpio_devic对象)

2023-09-04 21:17:45 197

原创 7.2 GPIO子系统的数据结构

如果设备树没有提供 gpio-ranges 属性还可以通过 gpiochip_add_pin_range 等函数进行关联(实际上设备树增加gpio-ranges属性后,在注册GPIO控制器过程中便会自动会调用gpiochip_add_pin_range 函数)。

2023-09-02 23:10:51 77

原创 7.1使用Linux的GPIO驱动

引脚复用为 GPIO 功能后(可以通过 pinctrl 子系统配置,默认情况下 pinctrl 子系统会将引脚复用为 GPIO 模式),便可使用 GPIO 子系统提供的函数来控制引脚(大多数芯片厂家已经在 GPIO 子系统中实现了相应 GPIO 控制器的驱动,对于使用者可以不关心驱动实现), GPIO 子系统可方便驱动开发者使用 GPIO ,驱动开发者在设备树中添加 GPIO 相关信息后就可以在驱动程序中使用 GPIO 子系统提供的 API 函数来操作 GPIO。

2023-08-29 20:59:48 351

原创 6.3 虚拟pinctrl驱动

Pinctrl子系统主要有三大作用,分别是引脚枚举与命名(获取单个引脚或引脚组、设备树解析等)、引脚复用功能配置(比如用作GPIO、I2C或其他功能)、引脚电气特性配置(比如上拉、下拉、open drain、驱动强度等)

2023-08-02 21:26:40 68

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除