
FPGA的IIC编程
自己回顾
秘术师和二娃
小白
展开
-
6.IIC驱动模块的读时序图
rd_en:高电平 表示开始一次读,当rd_en为高时延迟一段时间i2c_start会拉高,当我们读的字节数满足要求时,同时i2c_end信号为低,wr_en拉低,其实这个信号现在不用多考虑,在i2c_wr_data模块我们会仔细讲解。re_data_reg[7:0]:因为sda时串行发送一个byte数据,所以我们需要把串行数据转为并行数据。rd_data[7:0]:当我们成功接受一个byte数据时候,发送该数据。和写时序差不多,多了几个信号,这里讲解一下。原创 2023-04-03 23:01:53 · 263 阅读 · 0 评论 -
11.顶层代码
注意:小梅哥fpga把hc595串行转并行芯片的使能管脚oe已经在硬件上拉高了,所以在seg_595_dynamic模块的列化中我们不需要引出oe管脚。原创 2023-03-20 20:01:38 · 137 阅读 · 0 评论 -
10.整体模块框架
我们需要两个按键去控制从eeprom写入和读取数据,并且每隔0.5s把从eeprom读出的数据用数码管动态显示。IIC驱动模块和IIC读写模块上文都已经介绍过了,按键模块和数码管动态显示模块都比较简单,这里不再阐述。所以我们需要两个按键模块,一个数码管动态显示模块,一个IIC驱动模块,和一个IIC读写模块。原创 2023-03-20 19:57:42 · 104 阅读 · 0 评论 -
12.整个工程进行仿真
在对顶层模块进行仿真的时候,我们需要列化一个eeprom的仿真模型,给我们发送响应信号。这个模型在网上可以下载但是注意这个eeprom的仿真模型有一个bug,就是我们在仿真代码中列化该模块,设置该eeprom仿真模块A0,A1,A2的地址的时候必须配置为000,否则会有问题。所以在仿真的时候我们顶层模块代码,配置IIC设备地址的时候,最后三位地址也要是000。原创 2023-03-20 20:01:15 · 290 阅读 · 0 评论 -
7.IIC驱动模块的代码
这里讲一下r_ack的赋值,野火的代码逻辑是一到ACK_1,ACK_2,ACK_3,ACK_4,ACK_5,就采样信号的输入,然后保持不变。但是我们在时序逻辑中r_ack的赋值时ACK_1,ACK_2,ACK_3,ACK_4,ACK_5状态下信号稳定的时候再去采样,感觉会更好一点,同时能产生锁存器的问题。如果用野火的代码,它用的是组合逻辑赋值的方式,但是在组合逻辑中如果把自己的值赋值给自己会产生锁存器,这是我们不想要的,在编译的时候会报警告。原创 2023-03-20 19:55:28 · 380 阅读 · 0 评论 -
13.整体工程
注意:在小梅哥的板子上,scl和sda并没有接上拉电阻,这里需要我们自己去在软件中去配置,进行一个上拉。原创 2023-03-20 20:02:29 · 131 阅读 · 0 评论 -
5.IIC驱动模块的读时序
(9) 数据接收完成后,主机产生应答信号回传给从机,从机接收到应答信号开始下一字节数据的传输,若数据接收完成,执行下一操作步骤;(2) 从机接收到控制指令后,回传应答信号,主机接收到应答信号后开始存储地址的写入。(4) 待接收到从机回传的应答信号,再写入低 8 位地址,且高位在前低位在后,若为 2字节地址,跳转到步骤(6);(6) 地址写入完成,主机接收到从机回传的应答信号后,主机再次向从机发送一个起始信号;(8) 主机接收到从机回传的应答信号后,开始接收从机传回的第一个单字节数据;原创 2023-03-20 19:51:22 · 496 阅读 · 0 评论 -
9.IIC收发模块rtl代码
这里简易的画一下IIC收发模块的结构。原创 2023-03-20 19:56:55 · 286 阅读 · 0 评论 -
8.IIC收发模块框图
整体思路就是:外部写有效信号r_read_valid传入之后,我们的rd_en信号拉高,然后等待5000个时钟周期之后,把i2c_start拉高,然后等待数据发送结束信号i2c_end,当接到i2c_end信号后,把读取设备的存粗地址byte_addr[15:0]改变,这里我们都加1即可,r_rd_i2c_data_num表示接受到数据的个数,当接到i2c_end信号后,加1。当w_data_num的值为3的时候,表示我们所有的数据已经全部写入到fifo中,此时我们把r_fifo_rd_vlid信号拉高。原创 2023-03-20 19:58:10 · 298 阅读 · 0 评论 -
2.EEPROM介绍
AT24C64 EEPROM 存储芯片的器件地址包括厂商设置的高 4 位 1010 和用户需自主设置的低 3 位 A0、A1、A2。在硬件设计时,通过将芯片的 A0、A1、A2 这 3 个引脚分别连接到 VCC 或 GND 来实现器件地址低 3位的设置,若 3 个引脚均连接到 VCC,则设置后的器件地址为 1010_111;而 AT24C64 的存储空间为64 Kbit(8Kbyte),需要 13 位存储地址才可满足所有存储单元的寻址,存储地址为 2 字节。原创 2023-03-17 22:15:52 · 4260 阅读 · 0 评论 -
1.IIC理论学习
(2) 图中标注②表示“起始信号”,在 I2C 总线处于“空闲状态”时,SCL 依旧保持高电平时, SDA 出现由高电平转为低电平的下降沿,产生一个起始信号,此时与总线相连的所有 I2C 设备在检测到起始信号后,均跳出空闲状态,等待控制字节的输入。由图可知,I2C 协议整体时序图分为 4 个部分,图中标注的①②③④表示 I2C 协议的 4个状态,分别为“总线空闲状态”、“起始信号”、“数据读/写状态”和“停止信号”,针对这 4 个状态,我们来做一下详细介绍。数据线即用来表示数据,时钟线用于数据收发同步。原创 2023-03-17 22:16:08 · 192 阅读 · 0 评论 -
3.IIC的写时序
对传入从机的控制命令最低位读写控制位写入不同数据值,主机可实现对从机的读/写操作,读写控制位为 0 时,表示主机要对从机进行数据写入操作;读写控制位为 1 时,表示主机要对从机进行数据读出操作。对于 I2C 协议的读/写操作,我们将其分为读操作和写操作两部分进行讲解。首先讲解 I2C 写操作,由于一次写入数据量的不同,I2C 的写操作可分为单字节写操作和页写操作,详细讲解如下。原创 2023-03-17 22:19:28 · 1182 阅读 · 0 评论 -
4.写时序的时序图
通过看 AT24C64的芯片手册,知道 AT24C64的最大时钟scl为400K,这里我们不妨用250K。原创 2023-03-17 22:20:54 · 310 阅读 · 0 评论