1、I2C 原理
I2C(Inter - Integrated Circuit)是由飞利浦公司开发的一种简单、双向二线制同步串行总线 。它通过两根线,即串行数据线 SDA(Serial Data Line)和串行时钟线 SCL(Serial Clock Line),来实现设备之间的通信。I2C 采用主从架构,总线上可以挂载一个或多个主设备以及多个从设备。主设备负责发起通信,控制 SCL 时钟信号,并在 SDA 上传输数据;从设备则响应主设备的请求,根据 SCL 时钟信号从 SDA 上接收或发送数据 。
1.1 信号状态
在空闲状态下,SDA 和 SCL 都保持高电平,这是因为它们都通过上拉电阻连接到电源电压 VDD 。
起始条件(Start Condition)
当主设备想要发起通信时,会产生起始条件。其定义为:在 SCL 线保持高电平期间,SDA 线从高电平向低电平发生跳变(下降沿)。这个下降沿是 I2C 总线通信的开始标志,总线上的所有从设备都会检测到这个起始条件,并准备接收后续的地址和数据信息。起始条件的时序要求较为严格,SDA 线的下降沿必须在 SCL 线为高电平时完成,以确保所有从设备都能可靠识别。起始条件产生后,总线就从空闲状态进入到活跃状态,主设备开始控制总线进行数据传输。
停止条件(Stop Condition)
当通信结束时,主设备会产生停止条件。其定义为:在 SCL 线保持高电平期间,SDA 线从低电平向高电平发生跳变(上升沿)。这个上升沿是 I2C 总线通信结束的标志,告知总线上的从设备本次通信已完成。同样,停止条件的时序也有明确要求,SDA 线的上升沿必须在 SCL 线为高电平时出现。停止条件产生后,总线从活跃状态恢复到空闲状态,等待下一次通信的起始条件。
需要注意的是,在一次完整的通信过程中,起始条件之后可以有多次数据传输,最后以一个停止条件结束。此外,主设备还可以在通信过程中产生重复起始条件(Repeated Start Condition),其时序与起始条件相同,用于在不释放总线控制权的情况下,切换与不同从设备的通信或改变数据传输方向。
1.2 数据传输
数据传输以字节为单位,每个字节包含 8 位数据。在传输过程中,高位在前,低位在后 。每发送一个字节数据后,发送方会释放 SDA 线,接收方会在第 9 个时钟脉冲期间将 SDA 拉低,作为应答信号(ACK,Acknowledge),表示已经成功接收该字节数据 。如果接收方无法接收数据(例如,接收缓冲区已满),则会在第 9 个时钟脉冲期间保持 SDA 为高电平,作为非应答信号(NACK,Not Acknowledge) 。
1.3 设备寻址
I2C 总线上