跳至正文

I2C总线规范详解及其Verilog实现03——读写过程与时序要求

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位同样是从设备地址中借,如下图所示。

总结:

  1. 当设备的容量≥1Mbit时,数据地址≥17位,需要从设备地址的低位借位。1Mbit借1位,2Mbit借2位;
  2. 目前I2C设备的最大容量为2Mbit,如下图所示,因I2C读写速率的关系,未来可能也不会出现4Mbit或者更大容量的I2C器件。

1.3 数据地址

I2C读写需要进行数据寻址。

  1. 当 I2C器件存储容量 ≤ 2kbit 时,只需要8位数据地址;

  2. 当 4kbit ≤ I2C器件存储容量 ≤ 512kbit 时,需要16位数据地址;

  3. 当 I2C器件存储容量 ≥ 1Mbit 时,需要17 / 18位数据地址

下图为EEPROM-AT24C01DEEPROM-AT24C02D的数据地址。

下图为EEPROM-AT24C512C的数据地址,有16位。

1.4 应答与非应答

发送方在第九个时钟脉冲期间释放SDA线,以便接收方可以将SDA线拉低,并在该时钟脉冲的高电平期间保持稳定低电平,如下图所示。视为应答(ACK)。

反之,当SDA在第九个时钟脉冲期间保持高电平时,视为不应答(NACK)。

1.5 其它基本概念

  1. scl, sda均接有外部上拉电阻,默认状态为高电平,主机只需释放总线即可,而不应该直接给总线赋值高电平
  2. sda数据变化: 除开始/停止条件外, sda数据变化必须在scl低电平期间进行
  3. I2C通信流程: 开始条件 → 9个scl周期 → … → 9个scl周期 → 停止条件

二. I2C读写过程

2.1 写操作

写操作分两种,字节写(Byte Write)与 页写(Page Write)。

2.1.1 字节写

8位数据地址的字节写:

9~18位数据地址的字节写:

字节写过程总结:

  1. 开始
  2. 7位器件寻址 + 写标志(0)+ 从机应答,这一过程称为设备地址写
  3. 8/16位数据地址写,AT24C02D是8位,数据地址写只需要一次 ,+ 从机应答,这一过程称为写数据地址1;而AT24C512C是16位,数据地址需要写2次,+ 从机应答,这一过程称为写数据地址2
  4. 8位数据写入 + 从机应答,这一过程称为写数据1
  5. 停止

2.1.2 页写

页写过程总结:

  1. 开始

  2. 7位器件寻址 + 写标志(0)+ 从机应答,这一过程称为设备地址写

  3. 8/16位数据地址写,AT24C02D是8位,数据地址写只需要一次 ,+ 从机应答,这一过程称为写数据地址1;而AT24C512C是16位,数据地址需要写2次,+ 从机应答,这一过程称为写数据地址2

  4. 8位数据写入 + 从机应答,另8位数据写入 + 从机应答,…,第n个8位数据写入 + 从机应答,这一过程称为写数据1 + 写数据2 + … + 写数据n

  5. 停止

可见页写与字节写的唯一区别在于写数据的数量,字节写仅写数据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 当前地址读

当前地址读总结:

  1. 开始

  2. 7位器件寻址 + 读标志(1)+ 从机应答,这一过程称为设备地址读

  3. 8位读数据 + 主机不应答,这一过程称为读数据1,注意这里应答或不应答都称为读数据1

  4. 停止

每个I2C器件内部都有一个自动增量地址寄存器,直接读就能读出自动增量地址寄存器中地址对应的8位数据。

2.2.2 随机读

随机读总结:

  1. 开始
  2. 7位器件寻址 + 写标志(0)+ 从机应答,设备地址写
  3. 写数据地址1 + 写数据地址2(仅超过8位地址)
  4. 开始
  5. 设备地址读
  6. 读数据1 + 读数据2 + … + 读数据n(最后一个数据不应答),这个一次读多个数据的过程也称为页读,和页写对应
  7. 停止

可见随机读存在一个先写数据地址的过程,这个过程就改变了自动增量地址寄存器的值,所以就能够读出写数据地址对应的值。

另外,读数据每进行一次,自动增量地址寄存器的值+1,但同样局限于一页,与页写同理。更深层一点来说,写数据和读数据其实是共用同一个自动增量地址寄存器的

2.2.3 当前地址连续读

当前地址连续读,也称为顺序读(Sequential Read)。

顺序读总结:

  1. 开始
  2. 设备地址读
  3. 读数据1 + 读数据2 + … + 读数据n(不应答)
  4. 停止

2.2.4 读操作总结

对I2C主机来说,最常用读操作是随机读,因为主机通常不知道从机的当前数据地址是多少,此时当前地址读/连续读没什么意义。随机读过程:

开始 → 设备地址写 → 写数据地址1 → (写数据地址2) → 开始 → 设备地址读 → 读数据1 → (读数据2 → … → 读数据n(不应答)) → 停止。

2.3 其它关于I2C读写的说明

需要注意并不是所有的I2C器件都支持页写和页读,部分I2C器件只支持字节读/写。


三. I2C读写时序

3.1 AT24C02D的时序要求


注意:

  1. 交流测量条件:

    • 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。

  2. 这些参数是通过产品特性表征确定的,在生产中并未 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时钟时序分析:

  1. 上升时间,由总线上的寄生电容、上拉电阻和电源电压决定,也就是完全由硬件决定,上升时间可能较长,但FPGA无需关注此参数;

  2. 下降时间,因为FPGA下拉能力很强,下降时间非常短,无需关注,总是能够满足;

  3. 高电平脉宽大于0.4个周期SCL周期即可;

  4. 低电平脉宽中需要注意的是,快速模式周期为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

开始条件时序分析:

  1. 开始条件建立时间tSU.STA,从SCL上升沿到SDA下降沿,设定为0.5个SCL周期即可;
  2. 开始条件保持时间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

停止条件时序分析:

  1. 停止条件建立时间tSU.STO,从SCL上升沿到SDA上升沿的时间,设定为0.5个SCL周期即可;
  2. 停止条件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 时序总结

  1. 以SCL周期为参考标准,三种模式的时序要求都可统一为在SCL周期的某个时刻去变换SCL与SDA的值。

  2. 从开始到停止,一次读写总是持续n个SCL周期。


四. I2C软复位

软复位:soft reset,指的是当I2C从机一直在驱动sda=0,不释放sda的控制权时,主机可发送多个scl时钟周期来使从机释放sda,回到正常状态。

说明:软复位并不总是能解决问题,有些问题只能通过断电重启才能解决。

ADI公司的LTC4307芯片是带有总线卡死恢复功能的I2C缓冲器,当scl或sda的低电平持续30ms时,此芯片会在scl线上生成8.5kHz的16个scl周期,以此来复位总线。


五. 参考文档分享

欢迎大家关注我的公众号:徐晓康的博客,回复以下四位数字获取。

0310

建议复制过去不会码错字!


如果本文对你有所帮助,欢迎点赞、转发、收藏、评论让更多人看到,赞赏支持就更好了。

如果对文章内容有疑问,请务必清楚描述问题,留言评论或私信告知我,我看到会回复。


徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。

0 0 投票数
文章评分
订阅评论
提醒
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
目录