IIC通信协议在实际的工程项目中应用很多,作为一名FPGA工程师是必须要掌握IIC,下面就开始学习吧,let's go!
第一,E2PROM简介
作为初学者会购买一块FPGA开发板进行学习,开发板上一般都有E2PROM这个器件设备,该设备就是通过IIC协议进行通信的。
EEPROM (E2PROM,Electrically Erasable Progammable Read Only Memory)即电可擦除可编程只读存储器,是一种常用的非易失性存储器。
我自己手里的开发板搭载的E2PROM型号AT24C64的,芯片管脚如下图所示。
第二,IIC通信协议简介
IIC (I2C,Inter-Integrated Circuit)即集成电路总线,是一种两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。
I2C总线由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接收数据。
I2C的通信速度:
标准模式:100Kbit/s
快速模式:400kbit/s
高速模式:3.4Mbit/s
I2C的通信方式:
IIC是半双工通信方式。
I2C的写时序图
从上图可以知道,完成一条写操作,包含 START、DEVICE_ADDRESS(设备地址写)、FIRST_word_ADDRESS(通常叫做寄存器高地址)、 SECOND_WORS_ADDRESS(通常叫做寄存器低地址)、DATA、STOP组成。
I2C的写时序图
从上图可以知道,完成一条读操作,包含 START、DEVICE_ADDRESS(设备地址写)、FIRST_word_ADDRESS(通常叫做寄存器高地址)、 SECOND_WORS_ADDRESS(通常叫做寄存器低地址)、START、DEVICE_ADDRESS(设备地址读)、RD_DATA、STOP组成。
从读写时序图中,我们可以发现一个规律,每次发送8bit数据中间都会跟着发送1bit的ACK或者NoACK,我们可以总结一个结论就是IIC是按照9bit为一个整体进行发送。
START和STOP的实现如下图所示。
START:当SCL信号为高电电平时,SDA数据线由高拉低,代表START;
STOP:当SCL信号为高电平时,SDA数据线由低拉高,代表STOP。
明白IIC的重要知识后,下面就开始设计程序,该程序可以通过串口下发指令实时的对E2PROM进行读写操作,并在串口助手上可以显示结果。
IIC_IP的程序采用三段式状态机方式实现,状态转移图如下所示。
- 1. i2c_ip程序接口
名称 | 方向 | 位宽 | 说明 |
clk | I | 1 | 工作时钟25M |
reset | I | 1 | 复位信号(active high) |
scl | O | 1 | I2c的时钟信号 |
sda | IO | 1 | I2c的数据信号 |
i2c_cmd_done | O | 1 | I2c传输完成信号 |
i2c_addr | I | 16 | I2c寄存器地址 |
i2c_wr_data | I | 8 | I2c写数据 |
i2x_rd_valid_en | O | 1 | I2c读取数据的有效信号 |
i2c_bit_ctrl | I | 1 | I2c选择16bit or 8bit 控制信号 |
i2c_rw_ctrl | I | 1 | I2c读写控制信号(1:read 0:write) |
i2c_cmd_en | O | 1 | I2c命令使能信号 |
I2C的写时序仿真结果
I2C的读时序仿真结果