I2C(Inter-IntegratedCircuit Bus)
常用标准
I2C(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发。 主要是用来方便微控制器与外围器件的数据传输。
目前最新的协议版本是2021版:NXP:I2C-bus specification and user manual(UM10204)
标准相关介绍见网站:I2C-Bus
版本差异
常用版本为Standard和Fast-mode (Fm),其他版本很少用,另速率最快的版本Ultra-fast mode (UFm)和其他版本差异大,主要用于LED驱动器1)。
I2C Mode | Maximum Speed | Maximum Bus Capacitance | Drive |
Standard | 100kbit/s | 400pF | Open drain |
Fast-mode (Fm) | 400kbit/s | 400pF | Open drain |
Fast-mode Plus (Fm+) | 1Mbit/s | 550pF | Open drain |
High-speed mode (Hs) | 1.7Mbit/s | 400pF | Open drain |
High-speed (Hs) | 3.4Mbit/s | 100pF | Open drain |
Ultra-fast mode (UFm) | 5Mbit/s | n/a | Push-pull |
信号和连接
I2C有两个信号,单向的时钟SCL(主 > 从)和双向的数据SDA。连接拓扑如下图2)。
I2C总线允许多主机,但同一时刻只能有一个主机,通过SCL时钟同步和SDA线仲裁来决定谁是主机,其他设备则均为从机。
如需扩展或及中继则可以参考下图3)。
SCL/SDA内部电路如下图,写的同时可以读,以确认是否写成功,如下图:
硬件设计注意事项
上下拉电阻
除Ultra-fast mode (UFm)外,均是开漏输出,外部需要加上下拉电阻,阻值范围一般为1~10kΩ,常用为4.7kΩ4)
地址
同一I2C总线上的地址需不同,常用的为7位地址,拓展的为10位地址(不是所有的器件都支持)。
电平转换
主从器件之间是否需要电平转换?
1.8/3.3/5V之间的电平转换:用三极管(400KHz以下)、MOS管(1MHz以下)搭建转换电路,或直接用转换芯片(参考 Voltage Translation Buying Guide)
死锁
在通讯过程中,当从设备把SDA拉低,而此时主设备异常重启,主设备检测到SDA拉低,认为SDA被占用,同时主设备初始化SCL被拉高,从设备则一直等待SCL被拉低,从而陷入主从设备互锁的状态。
解决方案:
- 硬件:复位主设备的同时,硬件复位从设备
- 软件:主设备复位后,控制主设备的SDA和SCL,模拟正常的通讯,使得从设备释放SDA。具体步骤见mbedded: I2C Communication Protocol > Stuck I2C Buses
协议
- 起始条件:时钟信号线(SCL)为高电平时,数据线(SDA)产生一个下降沿5)。
- 停止条件:时钟信号线(SCL)为高电平时,数据线(SDA)产生一个上升沿。
- 数据有效性:当时钟信号为高电平的时候,数据线上的信号需要保持不变。
- 应答位:当主机传送8位数据结束后,主机拉高SDA,如果从机拉低SDA并在SCL高电平时保持低电平,这个信号为ACK信号(从机正确接收数据)。
- 非应答位:当主机传送8位数据结束后,主机拉高SDA,如果SDA保持高电平则该信号为NACK(数据传输出错)。
读写操作如下图6):
上述为常用的7为地址的读写,对于拓展的10位地址的读写,区别为前两个字节为10位地址(前缀11110表示这两个字节为10位地址),7位和10位对比如下图7)。
测试
逻辑分析仪和示波器均可以测试I2C,软件工程师看协议推荐用逻辑分析仪,硬件工程师看信号推荐用示波器,带解码的示波器则可以兼顾软硬件工程师的需求。
单独逻辑分析仪的测试说明见DreamSourceLab:利用逻辑分析仪进行I2C总线的全面分析 “3. 逻辑分析仪准备”至“5.进阶分析”
评论