I2C(Inter-Integrated Circuit,集成电路间通信)是一种常见的串行通信协议,广泛用于微控制器与外设之间的数据传输。类似于 UART,I2C 也可以从 物理层、协议层和应用层 进行分析。
基础概念
-
主机(Master):通常是微控制器,负责发起通信、生成时钟信号(SCL),并控制数据传输的开始和结束。
-
从机(Slave):响应主机的请求,接收并执行主机的指令。每个从机都有唯一的地址,主机通过该地址来选择目标设备。典型的从机设备包括传感器、存储芯片等。
当然,主机可以向从机发送命令,从机也可以向主机返回数据,数据的发送方和接收方的角色都是动态变化的。
-
发送器(Transmitter):在通信过程中负责发送数据的设备,可以是主机也可以是从机,取决于当前数据流的方向。
-
接收器(Receiver):负责接收数据的设备,可以是主机也可以是从机,同样取决于当前数据流的方向。
ESP32 I2C 外设
ESP32 内置两个 I2C 硬件控制器(I2C0 和 I2C1),它们具有相同的功能,可以同时用于不同的任务。例如,一个 I2C 接口可以用于连接传感器,另一个则可以用于存储设备或显示模块,大大提高了系统的灵活性。
IIC物理层
IIC接口
IIC(Inter-Integrated Circuit,集成电路间通信)具有以下显著特点:它是串行、同步、半双工的,只需要两根线就能完成数据传输,这使得 I2C 成为非常高效且易于实现的通信协议,尤其适用于低速率设备或引脚资源受限时。
这两根线就是:
SCL(Serial Clock Line,串行时钟线)
-
作用:SCL 用于在 I2C 总线上传输的时钟信号。它由主机控制,生成时钟脉冲。所有设备(主机和从机)都根据这个时钟信号来同步发送和接收数据。
-
特点:在数据传输过程中,SCL 会周期性地跳变,表示时钟的每一周期,确保数据能够按顺序传输。
SDA(Serial Data Line,串行数据线)
-
作用:SDA 用于传输数据。在 I2C 中,数据是按字节(8 位)来传输的。SDA 线上的电平变化代表了具体的数据位。
-
特点:SDA 线在时钟信号的控制下传输数据。
IIC通信接线方式

主从架构
I2C 采用主从架构,支持 一主多从 连接,即:
-
一个主机可连接多个从机
-
所有 I2C 设备可以共用同一对 SCL 和 SDA 线
IIC总线上设备组成“线与”逻辑,任何一个器件都可以控制电平信号
IIC总线采用了一种被称为“线与”(Wired-AND)的逻辑,这种设计允许多个设备共享同一对SCL和SDA线,从而实现一主多从的通信模式。这种方式的核心概念是:
-
只有当所有设备都释放信号线(即不拉低)时,总线才会保持高电平。
-
只要有一个设备拉低信号线,总线电平就变为低,无论其他设备是什么状态。
这种设计解决了多个设备共享信号线时的冲突问题。采用“线与”逻辑的原因:
-
避免信号冲突:若一个设备拉低信号,另一个设备想拉高会短路;“线与”逻辑下设备只需释放信号线,确保总线协调性。
-
允许多设备共享SCL和SDA线,无需额外信号线。
-
让设备能判断总线状态:设备可检查SDA线是否被拉低,判断总线是否空闲,避免多设备同时发送数据导致冲突。
IIC总线上必须外接上拉电阻
IIC总线的信号线使用的是开漏输出(Open-Drain)模式。其特点是设备只能将信号拉低,不能主动拉高信号线。这意味着,若没有其他方式,信号线会一直保持在低电平。
为了让信号线在不被拉低时恢复到高电平,需要使用上拉电阻。上拉电阻的作用是将信号线“拉”回高电平,当设备没有拉低信号时,电阻会把信号线拉回到高电平。通常使用4.7kΩ或10kΩ的电阻来实现这一点。
每个 I2C 设备都有一个唯一的地址
在 I2C 总线上,可能会有多个从设备(比如多个传感器),那么主机要怎么知道自己到底和哪个从机通信?从机如何分辨主机是不是在和自己说话呢?
其实,每个 I2C 设备都有一个唯一的“地址”,就像每个人的名字一样。
-
器件地址的表示:器件的地址在 I2C 总线中传输时通常是 7 位或者 10 位地址
-
地址分配:I2C 设备的地址由制造商定义,在设备的数据手册中可以找到
我们可以从通信过程入手去理解:
主设备会先发送从设备的地址。所有从设备都会收到这个地址信号,但只有地址匹配的从设备才会响应,告诉主设备:“我已经准备好通信了。”这时,主设备和从设备之间的通信才会正式开始。
就像老师在课堂上叫到某个学生的名字,只有被叫到的学生才会站起来回答问题。老师相当于主机,每个学生就相当于一个从机。
IIC协议层
I2C 协议层是 I2C 通信的核心部分,它负责管理数据的传输顺序、设备之间的通信协调和错误检测。协议层确保数据能够按照正确的格式和顺序在主设备和从设备之间传递。
而协议层的数据传输顺序、设备之间的具体通信过程等等都是由时序决定的。所谓时序,顾名思义就是数据传输过程中,总线信号变化的时间和顺序。
要了解IIC通信的整个协议层,我们就不得不从它的时序入手去分析,因为时序直接决定了通信时总线上的电平状态到底应该如何变化。
IIC总线时序
I2C总线时序主要分为三大部分:起始信号、数据传输和停止信号。这三部分构成了整个I2C协议的时序框架,确保数据能够正确传输。
我们可以通过一个点名的例子来理解整个通信过程:主设备就像老师,在课堂上点名(发送从设备地址),只有被点到名字的学生(从设备)会应答,然后开始交流(数据传输),最后老师宣布点名结束(停止信号)。
起始信号
通信开始时,主设备首先发出起始信号,通知所有从设备即将进行数据传输。
-
具体时序:当 SCL 线保持高电平时,SDA 线由高电平拉低,这就是起始信号。
-
作用:所有的从设备都会检测这个信号,知道主设备即将发送数据,并做好接收准备。
-
类比:就像老师走进教室,大声说:“现在开始点名!”所有学生都会安静下来,准备听名字。
数据传输
在起始信号后,数据传输正式开始。对于主设备来说,数据传输包括 数据发送 和 数据接收 两种数据传输方向。
在本示例中,具体的数据传输部分就是,主设备首先 发送从设备地址,并等待从设备的应答。
1.数据传输的时序规则
数据传输的核心在于 SDA 线 的变化时机,它必须配合 SCL 线 的高低电平:
-
SCL 高电平时,SDA 线的状态被读取(采样),此时数据被正式传输。
-
SCL 低电平时,SDA 线可以变化,为下一个数据位做准备。
2.数据传输单位(9 位结构)
数据传输以 9 位为一个单位,包含 8 位数据位 + 1 位应答位:
8 位数据位会按照从高位到低位的顺序传输,每发送 1 个字节(8 位数据)后,接收方必须返回 1 位应答信号(ACK/NACK)。
-
ACK代表应答:SDA 低电平(0),表示数据接收成功,通信继续。
-
NACK代表非应答:SDA 高电平(1),表示接收失败,可能是地址不匹配、数据错误或不再需要数据。
时序总结:
-
SCL 高电平 → 读取 SDA 线的状态(0 或 1)。
-
SCL 低电平 → 允许 SDA 线变化,准备下一个数据位。
-
数据传输完毕后 → 接收方在 SCL 高电平时发送 ACK(SDA = 0)或 NACK(SDA = 1)。
类比:
老师点名时,每个学生都会听到声音,但只有被点到的学生才会答“到!”
停止信号
当数据传输完成,主设备会发出停止信号,告诉所有设备通信结束。
-
具体时序:当 SCL 线保持高电平 时,SDA 线由低电平拉高,这就是停止信号。
-
作用:让从设备知道通信已经结束,可以释放总线,准备下一次传输。
类比:
老师点完所有人的名字后,说:“点名结束。”
3416

被折叠的 条评论
为什么被折叠?



