一文速通 IIC I2C子系统驱动 通信协议原理 硬件 时序 深度剖析
本文作为一个引入,作用是让读者理解熟知IIC协议关键内容,结合实际手册内容,深度解析协议本质,作为后续嵌入式linux驱动IIC子系统的一个铺垫。
目录
1. 硬件连接
2. IIC传输时序
2.1.写操作
2.2.读操作
2.3.I2C信号
3.IIC协议细节
4.IIC协议类比 SPI、UART
1. 硬件连接
I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻。(之前在我们的硬件篇有提到上拉电阻 还想系统性的了解上拉电阻的可以参考学习 接下来我们也会对IIC硬件中的上拉电阻进行分析)
由此我们可以得知以下信息,这些都是重点,读者需要牢牢记住。
同步、串行、半双工、多主机总线、近距离、低速、芯片与芯片之间的通信;
接口:两线制:SDA数据线、SCL时钟线 成本低
可以挂载多设备、主机是使用总线权利者、从机只可以听取从机、被主机管理;
我们接下来就是分析下上拉电阻的问题了。
我们知道由于芯片在输出高低电平的时候,内部通常会有两个mos管(针对mos管的知识在硬件篇也有系统的讲 不懂的读者也可以回顾学习),上面的MOS管导通输出高电平,下方的MOS管导通输出低电平。
因此我们熟知IIC是需要多设备通信,假设我们把两个IO口都挂在到一个总线上,很简单的可以发现当一个芯片输出高电平,一个芯片输出低电平,此时就短路了,因此IIC对于设备的IO口做了一些阉割,去掉了上面的mos管,只保留下方的mos管,但是问题也暴露出来了,虽然解决了短路的问题,但是设备只可以输出低电平,另一种情况的电平就是未知的状态,浮空,为了避免这种情况,我们需要引入上拉电阻,这样完美了解决这个问题,同时也体现了IIC硬件设计的驱动能力。
同时我通过IIC手册对于IIC硬件设计规范图图例进行实例的调研,如下所示:
可以清楚的看出,正如我们先前总结的一样,这就是IIC的上拉电阻的作用。
2. IIC传输时序
2.1.写操作
流程如下:
-
主芯片要发出一个start信号
-
然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
-
从设备回应(用来确定这个设备是否存在),然后就可以传输数据
-
主设备发送一个字节数据给从设备,并等待回应
-
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
-
数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
2.2.读操作
流程如下:
-
主芯片要发出一个start信号
-
然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
-
从设备回应(用来确定这个设备是否存在),然后就可以传输数据
-
从设备发送一个字节数据给主设备,并等待回应
-
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
-
数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
2.3.I2C信号
I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。
-
开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。
-
结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
-
响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
-
SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化
I2C协议信号如下:
3.IIC协议细节
-
如何在SDA上实现双向传输? 主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。
-
主、从设备都可以通过SDA发送数据,肯定不能同时发送数据,怎么错开时间? 在9个时钟里, 前8个时钟由主设备发送数据的话,第9个时钟就由从设备发送数据; 前8个时钟由从设备发送数据的话,第9个时钟就由主设备发送数据。
4.IIC协议类比 SPI、UART
特性 | I2C | UART | SPI |
---|---|---|---|
通信方式 | 多主多从同步通信 | 全双工异步通信 | 主从同步通信 |
通信线数 | 2 条(SCL、SDA) | 2 条(TX、RX,可能附加GND) | 4 条(SCLK、MOSI、MISO、CS) |
通信速率 | 标准模式:100kbps; 快速模式:400kbps; 高速模式:3.4Mbps | 通常 9600bps - 1Mbps | 通常最高几十Mbps,依设备支持而定 |
拓扑结构 | 菊花链总线 | 点对点 | 主从结构,支持多从设备 |
总线仲裁 | 支持,基于时序和逻辑(多主控制) | 不支持 | 不支持 |
时钟信号 | 由主设备提供 | 不需要(内部分频产生波特率) | 由主设备提供 |
传输效率 | 较高,支持多个从设备,但有协议开销 | 较低,数据包中通常有起始位、停止位和校验位 | 高,直接传输数据 |
硬件复杂性 | 适中,依赖外部上拉电阻 | 简单,仅需基本串口硬件 | 较高,需额外的片选线和主控支持 |
多设备支持 | 支持多个从设备(地址唯一) | 每个 UART 端口仅支持一对设备 | 支持多个从设备(需独立片选信号) |
全双工支持 | 不支持(半双工) | 支持 | 支持 |
数据传输可靠性 | 较高,有 ACK/NACK 确认机制 | 依靠硬件/协议,无确认机制 | 较高,无明确协议确认机制 |
典型应用场景 | 传感器(如温湿度、气压传感器)、EEPROM | 调试接口、低速外设通信 | 高速外设(如显示屏、ADC、DAC) |
易用性 | 中等,需要配置设备地址 | 简单,常用于调试与低速数据传输 | 复杂,需要主控与从设备紧密配合 |