I2C总线规范详解及其Verilog实现系列文章:
I2C总线规范详解及其Verilog实现01——电路特性与原理 – 徐晓康的博客(myhardware.top)
I2C总线规范详解及其Verilog实现02——通信协议 – 徐晓康的博客(myhardware.top)
I2C总线规范详解及其Verilog实现03——读写过程与时序要求 – 徐晓康的博客(myhardware.top)
I2C总线规范详解及其Verilog实现04——I2C主机Verilog功能模块 – 徐晓康的博客(myhardware.top)
前言
前面两篇文章已经详细介绍了I2C的电路原理与通信协议,本文将参考具体I2C器件的数据手册对I2C的读写过程和时序要求进行解析。
本文基于多个具体的I2C器件,包括EEPROM-AT24C02D,EEPROM-AT24C64D,EEPROM-AT24C512C,EEPROM-AT24CM01,EEPROM-AT24CM02。
一. I2C协议基本概念说明
前面两篇文章已经将I2C的所有概念都说明了,此处将一些重要概念结合具体的芯片数据手册,重新简要的说明一下,以便更好的理解本文的后续内容。
1.1 开始条件与结束条件
I2C中一次读/写总是以开始条件发起,以结束条件结束
。
开始条件:SCL高电平时,SDA出现下降沿。简写为S。
结束条件:SCL高电平时,SDA出现上升沿。简写为P。
1.2 设备地址与读写控制位
I2C读写需要先进行设备寻址。
I2C总线上的每个设备都有自身独一无二的设备地址,且通常这个地址是固定的。
下图为EEPROM-AT24C02D
的设备地址,高4位Bit7~4为设备类型标识,是固定的;Bit3-1为硬件从机地址;Bit0为读写控制位,1表示读,0表示写。
下图为EEPROM-AT24CM02
的设备地址,与上述EEPROM-AT24C02D
不同的点在于Bit3为硬件从机地址,只有一位;Bit2~1为数据地址的最高2位
。
这是因为AT24CM02的容量为2Mbit,所需的数据地址位宽为log2(2Mbit / 8bit) = 18,而绝大部分的I2C数据地址只有16位,所以多余的两位Microchip公司的策略是从设备地址中借2位
,这样凑出了18位数据地址。这样凑地址的好处是不影响原本I2C的读写策略。
EEPROM-AT24CM01
也是一样,它的容量为1Mbit,需要17位,多的1位同样是从设备地址中借,如下图所示。
总结:
-
当设备的容量≥1Mbit时,数据地址≥17位,需要从设备地址的低位借位。1Mbit借1位,2Mbit借2位; -
目前I2C设备的最大容量为2Mbit
,如下图所示,因I2C读写速率的关系,未来可能也不会出现4Mbit或者更大容量的I2C器件。
1.3 数据地址
I2C读写需要进行数据寻址。
-
当 I2C器件存储容量 ≤ 2kbit 时,只需要8位数据地址;
-
当 4kbit ≤ I2C器件存储容量 ≤ 512kbit 时,需要16位数据地址;
-
当 I2C器件存储容量 ≥ 1Mbit 时,需要17 / 18位数据地址
下图为EEPROM-AT24C01D
与EEPROM-AT24C02D
的数据地址。
下图为EEPROM-AT24C512C
的数据地址,有16位。
1.4 应答与非应答
发送方在第九个时钟脉冲期间释放SDA线,以便接收方可以将SDA线拉低
,并在该时钟脉冲的高电平期间保持稳定低电平,如下图所示。视为应答(ACK)。
反之,当SDA在第九个时钟脉冲期间保持高电平时,视为不应答(NACK)。
1.5 其它基本概念
-
scl, sda均接有外部上拉电阻,默认状态为高电平,主机只需释放总线即可,而不应该直接给总线赋值高电平 -
sda数据变化: 除开始/停止条件外, sda数据变化必须在scl低电平期间进行 -
I2C通信流程: 开始条件 → 9个scl周期 → … → 9个scl周期 → 停止条件
二. I2C读写过程
2.1 写操作
写操作分两种,字节写(Byte Write)与 页写(Page Write)。
2.1.1 字节写
8位数据地址的字节写:
9~18位数据地址的字节写:
字节写过程总结:
-
开始
-
7位器件寻址 + 写标志(0)+ 从机应答,这一过程称为 设备地址写
-
8/16位数据地址写,AT24C02D是8位,数据地址写只需要一次 ,+ 从机应答,这一过程称为 写数据地址1
;而AT24C512C是16位,数据地址需要写2次,+ 从机应答,这一过程称为写数据地址2
-
8位数据写入 + 从机应答,这一过程称为 写数据1
-
停止
2.1.2 页写
页写过程总结:
-
开始
-
7位器件寻址 + 写标志(0)+ 从机应答,这一过程称为
设备地址写
-
8/16位数据地址写,AT24C02D是8位,数据地址写只需要一次 ,+ 从机应答,这一过程称为
写数据地址1
;而AT24C512C是16位,数据地址需要写2次,+ 从机应答,这一过程称为写数据地址2
-
8位数据写入 + 从机应答,另8位数据写入 + 从机应答,…,第n个8位数据写入 + 从机应答,这一过程称为
写数据1
+写数据2
+ … +写数据n
-
停止
可见页写与字节写的唯一区别在于写数据的数量,字节写仅写数据1
,页写是写数据1,写数据2,...,写数据n
。
页写,顾名思义,是主机可以对从机的一页进行连续写,但要注意不能超过一页
,具体一页如何划分,不同I2C器件划分会不一样。对于AT24C512C,一次页面写入操作允许在同一写入周期内写入最多 128 个字节
,前提是所有字节都在存储器阵列的同一行中(其中地址位 A15 ~ A7
是相同的,A6 ~ A0可以不同)。小于 128 字节的部分页面写入也是允许的。
页写中,每一次从机应答写数据后,从机内部的自动增量地址寄存器
的值+1,但范围仍局限在这一页的数据地址,高位地址是固定不变的。对于AT24C512C,一页是128字节,那么就是A6~A0这低7位的数据地址+1,高9位是不变的;
2.1.3 物理数据实际写入时间
自定时写入周期的长度(tWR)定义为从启动内部写入周期的停止条件到发送给 AT24C512C 的第一个设备地址字节的起始条件之间的时间量,随后 AT24C512C 以一个确认信号响应,如下图所示。
这也是物理数据实际写入器件内部存储器的时间,在此期间内,器件不会进行任何应答
。
2.1.4 写操作总结
开始 → 设备地址写 → 写数据地址1 → (写数据地址2) → 写数据1 → (写数据2 → … → 写数据n) → 停止。
2.2 读操作
2.2.1 当前地址读
当前地址读总结:
-
开始
-
7位器件寻址 + 读标志(1)+ 从机应答,这一过程称为
设备地址读
-
8位读数据 + 主机不应答,这一过程称为
读数据1
,注意这里应答或不应答都称为读数据1 -
停止
每个I2C器件内部都有一个自动增量地址寄存器
,直接读就能读出自动增量地址寄存器中地址对应的8位数据。
2.2.2 随机读
随机读总结:
-
开始 -
7位器件寻址 + 写标志(0)+ 从机应答, 设备地址写
-
写数据地址1
+写数据地址2
(仅超过8位地址) -
开始 -
设备地址读 -
读数据1
+读数据2
+ … +读数据n(最后一个数据不应答)
,这个一次读多个数据的过程也称为页读
,和页写
对应 -
停止
可见随机读存在一个先写数据地址的过程,这个过程就改变了自动增量地址寄存器的值
,所以就能够读出写数据地址对应的值。
另外,读数据每进行一次,自动增量地址寄存器的值+1
,但同样局限于一页,与页写同理。更深层一点来说,写数据和读数据其实是共用同一个自动增量地址寄存器的
。
2.2.3 当前地址连续读
当前地址连续读,也称为顺序读(Sequential Read)。
顺序读总结:
-
开始 -
设备地址读 -
读数据1 + 读数据2 + … + 读数据n(不应答) -
停止
2.2.4 读操作总结
对I2C主机来说,最常用读操作是随机读,因为主机通常不知道从机的当前数据地址是多少
,此时当前地址读/连续读没什么意义。随机读过程:
开始 → 设备地址写 → 写数据地址1 → (写数据地址2) → 开始 → 设备地址读 → 读数据1 → (读数据2 → … → 读数据n(不应答)) → 停止。
2.3 其它关于I2C读写的说明
需要注意并不是所有的I2C器件都支持页写和页读,部分I2C器件只支持字节读/写。
三. I2C读写时序
3.1 AT24C02D的时序要求
注意:
-
交流测量条件:
-
CL(负载电容):100 pF。
-
RPUP(SDA 总线线路上拉电阻到 VCC):1.3 kΩ(1000 kHz)、4 kΩ(400 kHz)、10 kΩ(100 kHz)。
-
输入脉冲电压:0.3×VCC 至 0.7×VCC。
-
输入上升和下降时间:≤50 ns。
-
输入和输出定时参考电压:0.5×VCC。
-
-
这些参数是通过产品特性表征确定的,在生产中并未 100%测试。
I2C总线时序图:
3.2 时序要求解析
3.2.1 对SCL时钟的时序要求
时序要求类型\I2C模式 | 标准模式 | 快速模式 | 快速+模式 |
---|---|---|---|
时钟频率fSCL | ≤100kHz | ≤400kHz | ≤1000kHz |
时钟周期tSCL | ≥10us | ≥2.5us | ≥1us |
低电平脉宽tLOW | ≥4.7us | ≥1.3us | ≥0.5us |
高电平脉宽tHIGH | ≥4.0us | ≥0.6us | ≥0.4us |
上升时间tR | ≤1us | ≤300ns | ≤100ns |
下降时间tF | ≤1us | ≤300ns | ≤100ns |
SCL时钟时序分析:
-
上升时间,由总线上的寄生电容、上拉电阻和电源电压决定,也就是完全由硬件决定,上升时间可能较长,但FPGA无需关注此参数;
-
下降时间,因为FPGA下拉能力很强,下降时间非常短,无需关注,总是能够满足;
-
高电平脉宽大于0.4个周期SCL周期即可;
-
低电平脉宽中需要注意的是,快速模式周期为2.5us时,低电平脉宽要求≥1.3us,为0.52个SCL周期,留一定裕量,低电平脉宽始终取0.55个SCL即可,考虑到0.55在FPGA中不好实现,且考虑到上升时间可能较长的问题,这里低电平脉宽选用
17/32
=0.53125个SCL,此时高电平脉宽为0.46875个SCL。
总结:SCL低电平取17/32个SCL周期,即可满足所有对于SCL的时序要求
。
3.2.2 对开始条件的时序要求
时序要求类型\I2C模式 | 标准模式 | 快速模式 | 快速+模式 |
---|---|---|---|
开始条件建立时间tSU.STA | ≥4.7us | ≥0.6us | ≥0.25us |
开始条件保持时间tHD.STA | ≥4.0us | ≥0.6us | ≥0.25us |
开始条件时序分析:
-
开始条件建立时间tSU.STA,从SCL上升沿到SDA下降沿,设定为0.5个SCL周期即可; -
开始条件保持时间tHD.STA,从SDA下降沿到SCL下降沿,设定为0.5个SCL周期即可。
总结:开始条件设定为2个SCL周期
,前0.5个SCL周期,SCL=0,SDA=1;0.5 ~ 1个SCL周期,SCL=1,SDA=1;1 ~ 2个SCL周期,SCL=1,SDA=0。这样就能满足对开始条件的所有时序要求。
3.2.3 对SDA数据输入的时序要求
时序要求类型\I2C模式 | 标准模式 | 快速模式 | 快速+模式 |
---|---|---|---|
输入数据建立时间tSU.DAT | ≥200ns | ≥100ns | ≥100ns |
输入数据保持时间tHD.DAT | ≥0ns | ≥0ns | ≥0ns |
总结:保持时间无要求,建立时间要求很容易满足,I2C主机只需在SCL低电平中点变换SDA上的数据
,然后一直保持SDA数据不变,直到SCL结束高电平到下一个周期的低电平,释放SDA即可。
3.2.4 SDA数据输出的时序性能
SDA数据输出就不能说要求了,而是反映了此器件的SDA输出性能
。
数据输出性能\I2C模式 | 标准模式 | 快速模式 | 快速+模式 |
---|---|---|---|
SCL低电平到输出数据开始更新的时间tDH | ≥100ns | ≥50ns | ≥50ns |
SCL低电平到输出数据更新完成的时间tAA | ≥4.5us | ≥0.9us | ≥0.45us |
总结:主机无需关心SDA输出时序性能,只需在SCL高电平时去读取从机输出的数据即可。这里选择在SCL高电平的中点处读取SDA的数据
。
3.2.5 对停止条件的时序要求
时序要求类型\I2C模式 | 标准模式 | 快速模式 | 快速+模式 |
---|---|---|---|
停止条件建立时间tSU.STO | ≥4.7us | ≥0.6us | ≥0.45us |
停止条件SDA高电平持续时间tBUF | ≥4.7us | ≥1.3us | ≥0.5us |
停止条件时序分析:
-
停止条件建立时间tSU.STO,从SCL上升沿到SDA上升沿的时间,设定为0.5个SCL周期即可; -
停止条件SDA高电平持续时间tBUF,设定为1个SCL周期即可。
总结:停止条件设定为2个SCL周期
,前0.5个SCL周期,SCL=0,SDA=0;0.5 ~ 1个SCL周期,SCL=1,SDA=0;1 ~ 2个SCL周期,SCL=1,SDA=1。这样就能满足对开始条件的所有时序要求。
3.2.6 写周期时间
对于此EEPROM芯片,一次写入指令完成(开始条件→停止条件)后,EEPROM需要tWR的时间去将收到的数据实际写入到EEPROM中,在此器件EEPROM不会响应任何输入。tWR可称为从机写入执行时间
。
时序表中显示:tWR≤5ms。
3.3 时序总结
-
以SCL周期为参考标准,三种模式的时序要求都可统一为在SCL周期的某个时刻去变换SCL与SDA的值。
-
从开始到停止,一次读写总是持续n个SCL周期。
四. I2C软复位
软复位:soft reset,指的是当I2C从机一直在驱动sda=0,不释放sda的控制权时,主机可发送多个scl时钟周期来使从机释放sda,回到正常状态。
说明:软复位并不总是能解决问题
,有些问题只能通过断电重启才能解决。
ADI公司的LTC4307
芯片是带有总线卡死恢复功能的I2C缓冲器,当scl或sda的低电平持续30ms时,此芯片会在scl线上生成8.5kHz的16个scl周期,以此来复位总线。
五. 参考文档分享
欢迎大家关注我的公众号:徐晓康的博客,回复以下四位数字获取。
0310
建议复制过去不会码错字!
如果本文对你有所帮助,欢迎点赞、转发、收藏、评论让更多人看到,赞赏支持就更好了。
如果对文章内容有疑问,请务必清楚描述问题,留言评论或私信告知我,我看到会回复。
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。