目录
🌈你好呀!我是 程序猿
🌌 2025感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!
引言
在嵌入式系统的广阔天地中,通信协议犹如连接各个组件的桥梁,而 IIC(Inter - Integrated Circuit)协议无疑是其中一座极为重要且应用广泛的桥梁。它以其简洁高效的设计,在众多嵌入式设备通信场景中发挥着关键作用。无论是传感器数据的采集,还是芯片间的协同工作,IIC 都无处不在。
1. IIC简介
IIC通信协议,也称为I2C(Inter-Integrated Circuit),是一种简单、高效、多主多从的双向二线制同步串行的半双工总线,由Philips公司(现NXP)于1980年代开发,广泛应用于嵌入式系统中连接各种低速外围设备。主要用于近距离、低速的芯片(如传感器、存储器、显示屏等)之间的通信。
I2C协议采用两根双向的信号线进行通信:
- 串行数据线(SDA):用于传输数据的双向线路。
- 串行时钟线(SCL):由主设备产生,用于同步数据传输。
这种协议支持多主多从架构,多主设备(多个微控制器或主控制器)和多从设备(外部设备)的连接。每个设备都有一个唯一的7位或10位地址,主设备通过地址选择需要通信的从设备进行数据传输。
I2C协议的优点包括简单、灵活、成本低廉,适合在资源有限的嵌入式系统中使用。

SDA和SCL都是双向的,所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。
2. IIC 总线的电气特性
2.1 IIC电气特性
I2C 总线上的 SDA 和 SCL 线均采用开漏输出结构。这意味着总线设备无法直接驱动线路为高电平,而是通过总线上外接的上拉电阻将线路拉高。当设备需要输出低电平时,通过将对应的引脚接地来实现。这种设计允许多个设备共享同一总线,并且在同一时刻只有一个设备能够拉低总线,避免了信号冲突。
2.2 开漏输出结构
开漏输出是一种只有下拉晶体管(通常是MOSFET或BJT)的输出结构,没有上拉晶体管。
当设备需要输出低电平时,下拉晶体管导通,将信号线拉低到地(GND)。
当设备需要输出高电平时,下拉晶体管关闭,信号线通过外部上拉电阻拉到高电平(VCC)。
2.3 为什么使用开漏输出
多设备共享总线:I2C支持多主多从架构,多个设备可以共享同一组SDA和SCL线。开漏输出允许多个设备同时控制总线,而不会造成短路。
电平兼容性:开漏输出可以适应不同的电源电压(VCC),只要上拉电阻连接到相应的VCC即可。
总线仲裁:在多个主设备同时尝试控制总线时,开漏输出可以通过“线与”逻辑实现仲裁。如果一个设备输出低电平,总线就会被拉低,其他设备检测到总线被拉低后会停止发送数据。
2.4 上拉电阻
外部上拉电阻是I2C总线正常工作的重要组成部分。
它的作用是在没有设备拉低总线时,将总线拉到高电平。
上拉电阻的阻值需要根据总线电容、通信速率和电源电压来选择。通常,阻值在4.7kΩ到10kΩ之间。
2.4 电平标准
I2C 总线的电平标准与所连接的设备电源电压相关。常见的有 3.3V 和 5V 电平系统。在混合使用不同电平设备的系统中,需要注意电平转换问题,以确保通信的可靠性。

3. IIC总线的解析
3.1 IIC总线的寻址方式
在I2C(IIC)通信协议中,寻址是确定要发送或接收数据的目标设备的过程。以下是关于I2C寻址的关键点:
地址格式:
- 每个I2C设备都有一个唯一的7位或10位地址。
- 7位地址是最常见的,但有些设备支持10位地址,这取决于设备的制造商和规范要求。
地址类型:
- 写地址(写操作):主设备(通常是微控制器)向从设备发送数据。写地址的最低位为0。
- 读地址(读操作):主设备从从设备接收数据。读地址的最低位为1。
地址传输:
- 在I2C通信的起始阶段,主设备通过SDA线发送目标设备的地址。
- 主设备发送一个字节的数据,包括从设备的地址和读写位(最低位),告诉从设备是发送数据还是接收数据。
- 如果设备支持10位地址,首先发送两个字节的扩展地址,然后再发送读写位。
地址确认:
- 每当主设备发送完设备地址和读写位后,接收设备会发送一个应答信号(ACK)来确认它被正确地寻址和准备好进行数据传输。
- 如果没有设备响应(应答),或者设备拒绝通信,则没有应答(NACK)信号被发送,通信将中止或重新尝试。
多主设备冲突:
- I2C支持多主设备的连接,但是在多主模式下,会出现地址冲突的情况。
- 主设备在发送地址后,会监视SDA线的状态,如果检测到其他主设备也在发送,则会停止发送,并等待总线空闲。
3.2 IIC总线的起始信号
当 SCL 线为高电平时,SDA 线由高电平跳变为低电平,这个跳变信号被定义为 IIC 通信的起始信号。起始信号标志着一次 IIC 通信的开始,主机在发送起始信号后,开始传输后续的地址和数据。

3.3 IIC总线的停止信号
与起始信号相反,当 SCL 线为高电平时,SDA 线由低电平跳变为高电平,这个跳变信号即为停止信号。停止信号表示一次 IIC 通信的结束,主机在发送完所有数据后,会发送停止信号,通知从机通信已完成。

起始信号和停止信号都是由主机发送的,起始信号产生之后,总线处于被占用的状态(BUSY),在终止信号产生之后,总线就处于空闲状态(IDLE)。
3.4 IIC总线的应答信号
在每传输一个字节数据后,接收方需要发送一个应答信号来告知发送方数据已成功接收。应答信号在 SCL 线的第 9 个时钟周期产生,若接收方将 SDA 线拉低,则表示应答成功(ACK);若 SDA 线保持高电平,则表示非应答(NACK)。发送方在接收到 NACK 信号后,通常会认为数据传输失败,可能会采取重发等措施。

3.5 IIC总线的数据有效性
在I2C总线上,数据的有效性是一个关键概念,它确保了通信的可靠性和正确性。I2C协议通过严格的时序规则来定义数据的有效性。
在I2C总线上,数据(SDA线)的有效性是由时钟信号(SCL线)控制的。具体规则如下:
数据在SCL高电平期间必须保持稳定:
当SCL线为高电平时,SDA线上的数据必须保持稳定,不能发生变化。
只有在SCL线为低电平时,SDA线上的数据才允许发生变化。
数据采样时机:
接收设备(无论是主设备还是从设备)会在SCL线的上升沿对SDA线上的数据进行采样。
因此,发送设备必须确保在SCL上升沿到来之前,SDA线上的数据已经稳定。
3.5 IIC总线的字节顺序
在I2C通信中,数据传输是以字节为单位进行的,每个字节中的位顺序通常是MSB优先。
示例:I2C传输一个8位数据
0b10101100
传输顺序为:
1 → 0 → 1 → 0 → 1 → 1 → 0 → 0
。
3.6 IIC总线的数据帧格式
在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。
4. IIC 通信流程
4.1 写操作流程
- 主机发送起始信号(S)。
- 主机发送 7 位从机地址和写操作位(从设备地址 + W)。
- 主机等待从机的应答信号(ACK)。
- 若接收到应答信号,主机开始发送数据字节(数据)。
- 每发送一个数据字节后,主机等待从机的应答信号(ACK)。
- 重复步骤 4 和 5,直到所有数据发送完毕。
- 主机发送停止信号,结束写操作(P)。

4.2 读操作流程
- 主机发送起始信号(S)。
- 主机发送 7 位从机地址和读操作位(从机地址 + R)。
- 主机等待从机的应答信号(ACK)。
- 若接收到应答信号,从机开始发送数据字节(数据)。
- 主机在每接收一个数据字节后,向从机发送应答信号(除了最后一个字节,主机发送非应答信号以结束数据接收)(ACK/NACK)。
- 重复步骤 4 和 5,直到主机接收到所有需要的数据。
- 主机发送停止信号,结束读操作(P)。

4.3 特殊的操作流程(ReStart)
I2C 的 Restart 是指在一次 I2C 通信过程中,主机在发送了起始信号(S)、设备地址及相关数据后,在不发送停止信号(P)的情况下,再次发送一个起始信号,以开始新一轮的数据传输或改变数据传输方向等操作。它主要用于在一次连续的通信中,需要与同一个或多个从机进行多次数据交互,且中间不希望释放总线让其他设备占用的场景,避免了每次重新建立通信都要发送完整的起始、地址等信号的开销,提高了通信效率和灵活性。
4.3.1 场景 1:写后读操作
主设备发送起始条件(S)。
主设备发送从设备地址(从机地址 + W)。
主设备发送寄存器地址(数据)。
主设备发送Restart条件(RS)。
主设备发送从设备地址(从机地址 + R)。
主设备读取数据(数据)。
主设备发送停止条件(P)。
4.3.2 场景 2:访问多个从设备
主设备发送起始条件(S)。
主设备发送第一个从设备地址,并进行通信(从机地址1 + W/R + 数据)。
主设备发送Restart条件(RS)。
主设备发送第二个从设备地址,并进行通信(从机地址2 + W/R + 数据)。
主设备发送停止条件(P)。
期待批评指正,共同进步~