I2C简介及时序
I2C 总线由数据线 SDA 和时钟线 SCL 两根线构成通信线路,既可用于发送数据,也可接收数据。I2C_SCL 和 I2C_SDA 均需接上拉电阻,也正因此,当总线空闲时,这两条线路都处于高电平状态。
图1 I2C整体时序图
图2 I2C具体时序图
在串行时钟线 SCL 为低电平状态时, SDA 允许改变传输的数据位,在 SCL 为高电平状态时, SDA 要求保持稳定,相当于一个时钟周期传输 1bit 数据,经过 8 个时钟周期后,传输了 8bit 数据,即一个字节,第 8 个时钟周期末,主机释放 SDA 以使从机应答。在第 9 个时钟周期,从机将 SDA 拉低以应答;如果第 9 个时钟周期, SCL 为高电平时, SDA 未被检测到为低电平,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。
EEPROM简介
EEPROM (Electrically Erasable Progammable Read Only Memory, E2PROM)即电可擦除可编程只读存储器,是一种常用的非易失性存储器(掉电数据不丢失)。
本次实验所用的 AT24C64 存储容量为 64Kbit,内部分成 256 页,每页 32 字节, 共有 8192 个字节,且其读写操作都是以字节为基本单位。
器件地址和字节地址
器件地址
当多个 I2C 器件挂接在总线上时,需要对不同器件进行区分,这就这涉及到器件地址。总线上的每个器件都是有地址的,有些地址是固定的,有些地址是可编程的。
进行数据传输时,主机首先向总线上发出开始信号,对应开始位 S,然后按照从高到低的位序发送器件地址,一般为 7bit,第 8bit 位为读写控制位 R/W,该位为 0 时表示主机对从机进行写操作,当该位为 1时表示主机对从机进行读操作,然后接收从机响应,对于 AT24C64 来说,其传输器件地址格式如下图所示。
图3 器件地址格式示意图
字地址
发送完第一个字节(7 位器件地址和一位读写控制位)并收到从机正确的应答后就开始发送字地址(Word Address) 。本次实验用到的 EEPROM 存储器,内部就是一系列顺序编址的存储单元。AT24C64 的存储单元容量为 64Kb=8KB,需要 13 位(2^13=8KB)的地址位,因此需要双字节地址。AT24C64的字节地址为0~8191。
图4 单字节地址
图5 双字节地址
I2C写操作EEPROM
I2C写操作EEPROM有两种方式,一种是单次写,一种是连续写,具体时序图如图6、7所示。对于 AT24C64 的页写,是不能发送超过一页的单元容量的数据的,而AT24C64 的一页的单元容量为 32Byte,当写完一页的最后一个单元时,地址指针指向该页的开头,如果再写入数据,就会覆盖该页的起始数据
图6 单次写(字节写)时序
图7 连续写时序
I2C读操作EEPROM
I2C读操作EEPROM有三种方式:1、当前地址读时序;2、随机(任意)地址读时序;3、顺序读时序。
图8 当前地址读时序
图9 随机(任意)地址读时序
图10 顺序读时序
四段式状态机实现I2C驱动
本次实验采用四段式状态机完成单次写和随机(任意)读的方式进行 EEPROM 读写测试
图11 I2C驱动模块状态跳转图
在清楚了实现I2C驱动的状态跳转图以后,我们在用四段式状态机来实现改功能。
定义接口信号:
参数 | ||
CLK_FRE | 系统时钟频率,默认50MHz | |
SCL_FRE | I2C时钟频率,默认250KHz,最大400KHz | |
信号 | ||
clk | in | 输入时钟频率 |
rst_n | in | 复位信号,低有效 |
scl | out | I2C时钟信号 |
sda | inout | I2C数据信号 |
slave_device_addr | in | 从机器件地址 |
bit_ctrl | in | 字地址位控制,1为双字节0为单字节 |
i2c_done | out | I2C读/写一次操作完成 |
i2c_ask | out | I2C应答标志 0:应答 1:未应答 |
user_wr_rd_addr | in | 写地址或读地址 |
user_wr_en | in | 写使能,1个时钟周期脉冲 |
user_wr_data | in | 写数据 |
user_rd_en | in | 读使能,1个时钟周期脉冲 |
user_rd_data | out | 读到的数据 |
状态机实现程序:
FIRST:同步时序的 always 模块,格式化描述次态迁移到现态寄存器。
SECOND:组合逻辑的 always 模块,描述状态转移判断条件。
THIRD:用 assign 定义转移条件
FOURTH:设计输出信号
SCL:
SDA:
仿真结果
工程利用VIO来设置写入/读取地址、写入数据、写使能、读使能测试EEPROM。
写时序:
读时序:
如有问题欢迎讨论:1149239185@qq.com