找回密码
 立即注册
首页 业界区 安全 I2C总线协议

I2C总线协议

章海 2025-6-1 20:33:58
IIC总线协议

1.0 IIC总线结构


  • 数据线SDA:传输数据
    时钟线SCL:同步时钟
  • 总线每个上每个器件地址唯一
  • 总线上数据的传输速率(比特率)
    在标准模式      (Sm ) 下可达 100 kbit/s
    在快速模式      (Fm ) 下可达 400 kbit/s
    在快速增强模式   (Fm+) 下可达 1   Mbit/s
    在高速模式      (HSm) 下可达 3.4 Mbit/s
  • IIC总线传输时高位先行(MSB First)
    下图源自 AT24C02 Datasheet
    1.png

  • SDA线为了实现总线的线与特性需要设置为开漏+上拉结构,由外部上拉电阻决定,上拉电阻越大,信号上升时间越长,总线最大速率越低,抗干扰能力越弱,反之。(一般取4.7k,10k,100k) 同时上拉电阻过小,会导致低电平实际电压过高,影响数据传输
    I2C总线上的电阻 - 功能与阻值范围的确定_哔哩哔哩_bilibili
1.1 逻辑线与

2.png

1.2 起始位

在SCL高电平时,向SDA发送下降沿
3.png

1.3 寻址

发送从机地址(7位 or 10位)
4.png

(7位地址)
R/W#位:填写数据传输的方向
R/W# = 0, 写
R/W# = 1, 读
0 - Ack - Acknowledge
1 - NAK - Not Acknowledge
为什么NAK要设置为1生效?

因为当iic总线空闲时, SDA线会被上拉电阻拉至高电平, 所以当NAK(无回复)时, NAK = 1;
寻址阶段出现NAK的原因:


  • 地址错误
  • 从机为忙状态
  • 从机故障
1.4 数据传输

I2C以字节为单位传输数据
5.png

每个字节传输后,接收方需发送 ACK(低电平)或NAK(高电平) 信号。
1.5 停止位

在SCL高电平时,向SDA发送上升沿
6.png

与起始位对比:都是在SCL为高电平时操作SDA,但是起始位为拉低(下降沿),停止位是拉高(上升沿)
1.6 示例

7.png

1.7 I2C总线死锁


  • 在主机与从机通信器件,主机异常复位导致的死锁   环境:软件模拟I2C协议,SDA使用开漏输出
解决方法:总线访问忙检测超过设置时间进行总线恢复操作 总线恢复操作:手动输出SCL脉冲,使得从设备结束通信释放总线 1. 发送至少 9 个 SCL 脉冲(对应 I2C 规范中的 “时钟延展” 恢复流程)。 2. 发送一个 STOP 条件(SDA 从低→高,SCL 保持高)。
2. 死锁原因:
其一:
主机: I2C主机检测SDA信号为, 认为总线处于忙状态等待总线释放
从机: I2C从机等待SCL信号从高至低,释放应答信号
总结: 主机等待从机释放SDA, 从机等待主机释放SCL, 互相等待造成死锁
(13)I2C死锁解决方式二选一_哔哩哔哩_bilibili
以上图片源自B站UP主-铁头山羊


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册