各种通信(五):IIC协议(二)
一:起始条件
在 I2C(Inter-Integrated Circuit,集成电路间总线)开发中,“Create start condition” 指的是产生起始条件,这是 I2C 通信协议中启动一次数据传输的关键操作。
I2C 总线通过两根线通信:SDA(数据线)和 SCL(时钟线)。起始条件的定义是:当 SCL(时钟线)处于高电平时,SDA(数据线)从高电平切换到低电平(即 SDA 在 SCL 为高期间发生下降沿)。
起始条件的作用是:通知总线上的所有从设备,一次新的 I2C 通信即将开始,从设备会开始监听后续的地址和数据信息。
在实际编程中,通常需要通过硬件 I2C 控制器的寄存器配置,或软件模拟 SDA/SCL 引脚的电平变化来生成这个起始条件。例如,在软件模拟中,步骤大致为:
先将 SDA 和 SCL 都拉到高电平;
保持 SCL 为高,将 SDA 拉低,产生下降沿,完成起始条件。
起始条件是 I2C 通信的第一个关键信号,之后会跟随从设备地址、读写方向位、数据等信息,通信结束时则会产生停止条件(Stop Condition)。
在 I2C 通信协议中,起始条件(Start Condition)和停止条件(Stop Condition)是控制数据传输开始和结束的关键信号,由主设备主动产生,用于同步总线上的所有从设备。两者的定义和作用如下:
1. 起始条件(Start Condition,S)
定义:当 SCL(时钟线)处于高电平时,SDA(数据线)从高电平跳变为低电平(即 SDA 在 SCL 为高期间产生下降沿)。
作用:标志一次 I2C 通信的开始,通知总线上的所有从设备:“即将开始传输数据,请准备接收地址和后续信息”。
二:停止条件(Stop Condition,P)
定义:当 SCL(时钟线)处于高电平时,SDA(数据线)从低电平跳变为高电平(即 SDA 在 SCL 为高期间产生上升沿)。
作用:标志一次 I2C 通信的结束,通知从设备:“当前传输已完成,总线释放”。
总结
起始条件(S):SCL 高电平时,SDA 从高→低(下降沿),启动通信。
停止条件(P):SCL 高电平时,SDA 从低→高(上升沿),结束通信。
三: I2C 多通道设计的典型应用场景。通过将不同功能的设备群分配到独立的 I2C 通道
隔离干扰例如,传感器(如温湿度、加速度计)通常对噪声敏感,而显示屏(如 OLED、LCD)可能因刷新频率较高产生一定干扰。分开通道后,可避免两类设备的信号干扰影响传感器的测量精度。
适配不同速率不同设备的 I2C 速率可能不同:
某些传感器仅支持 100kHz 标准模式,
而高速显示屏可能支持 400kHz 快速模式。
独立通道可分别配置速率,无需妥协于最低速率设备。
避免地址冲突若两个设备(如两个同型号传感器)默认地址相同,且无法通过硬件引脚修改地址,此时用不同通道连接可彻底避免地址冲突(无需复杂的地址映射逻辑)。
并行操作提升效率部分 MCU 的多 I2C 通道支持 DMA 或中断并行处理,例如:
通道 1 正在读取传感器数据时,
通道 2 可同时向显示屏写入数据,
无需等待前一个操作完成,提升系统响应速度。
举例说明硬件连接:
通道 1(I2C1):SDA1 接温湿度传感器(如 SHT30)的 SDA,SCL1 接其 SCL;
通道 2(I2C2):SDA2 接 OLED 显示屏(如 SSD1306)的 SDA,SCL2 接其 SCL。
这样,传感器和显示屏的通信完全独立,代码中通过操作不同通道的控制器(如 I2C1 和 I2C2 寄存器)即可分别控制,互不干扰。
四:在 I2C 通信协议中,I2C Channel(I2C 通道) 和 I2C Address(I2C 地址) 是两个核心概念,分别从硬件接口和设备标识两个层面解决了多设备通信的问题。以下是详细解释:
1、I2C Channel(I2C 通道)
定义
I2C 通道是硬件层面的独立通信接口,由微控制器(MCU)、处理器(SOC)或专用 I2C 控制器提供。每个通道对应一组独立的 SDA(数据线)和 SCL(时钟线)引脚,以及独立的控制器逻辑(如寄存器、时序发生器、中断 / DMA 模块等)。
核心作用
物理隔离:不同通道的 SDA/SCL 引脚完全独立,可连接互不相关的设备群,避免信号混叠。
并行通信:多个通道可同时工作(如一个通道读取传感器,另一个通道写入显示屏),提升系统效率。
灵活适配:不同通道可独立配置通信速率(100kHz/400kHz/1MHz)、时序参数,适配不同设备的需求。
举例
STM32F103 芯片通常有 2 个 I2C 通道(I2C1、I2C2),分别对应不同的 GPIO 引脚(如 I2C1 用 PB6/PB7,I2C2 用 PB10/PB11)。
若系统中既有低速传感器(需 100kHz),又有高速 EEPROM(需 400kHz),可将它们分别连接到两个通道,各自配置速率。
2、I2C Address(I2C 地址)
定义
I2C 地址是软件层面的设备标识,每个 I2C 从设备(如传感器、存储器)都有一个唯一的地址(7 位或 10 位,最常用 7 位),用于在同一通道中区分不同设备。主设备通过发送地址来指定通信对象。
核心作用
设备区分:同一 I2C 通道的多设备通过地址唯一标识(如通道 1 上连接的温湿度传感器地址为 0x48,加速度计地址为 0x68)。
通信定向:主设备发送数据前,先发送目标设备的地址,只有地址匹配的从设备才会响应,其他设备忽略。
地址特点
默认地址:多数设备有硬件固定的默认地址(如 SSD1306 显示屏默认地址 0x3C 或 0x3D,由引脚电平决定)。
可配置地址:部分设备支持通过硬件引脚(拉高 / 拉低)或软件寄存器修改地址,避免同一通道内的地址冲突。
读写位:7 位地址的第 8 位是读写方向位(0 表示写,1 表示读),因此实际发送的地址帧是 “7 位地址 + 1 位方向”(共 8 位)。
举例
通道 1 上连接了两个设备:A(地址 0x40)和 B(地址 0x41)。
主设备要与 A 通信时,先发送 0x80(0x40 << 1 | 0,写操作),A 会响应,B 忽略;
主设备要读取 B 的数据时,发送 0x83(0x41 << 1 | 1,读操作),B 响应,A 忽略。
3、I2C Channel 与 I2C Address 的关系
两者是层级互补的关系,共同解决多设备通信问题:
先选通道,再选地址:主设备需先确定使用哪个通道(物理接口),再通过地址在该通道内选择具体设备。例:I2C1 通道 -> 地址 0x48 的设备。
解决冲突的不同维度:
若两个设备地址相同且无法修改,可通过不同通道连接(物理隔离);
若地址不同,可共用同一通道(通过地址区分)。
资源分配逻辑:
通道是 “物理总线”,数量由硬件决定(如 MCU 通常有 2-5 个通道);
地址是 “逻辑标识”,同一通道最多支持 127 个设备(7 位地址,排除广播地址)。
4.实际应用场景
场景 1:简单系统(如单个传感器)用 1 个通道,通过地址直接通信。
场景 2:多设备但地址不同多个设备(如传感器 A、B、C,地址均不同)共用 1 个通道,主设备通过地址分别访问。
场景 3:地址冲突或速率差异
两个同型号传感器(默认地址相同):分别接通道 1 和通道 2;
低速传感器(100kHz)和高速显示屏(400kHz):分通道连接,各自配置速率。
总结
I2C 通道:硬件层面的独立通信接口,负责物理连接和并行通信,解决 “不同设备群的隔离与速率适配”。
I2C 地址:软件层面的设备标识,负责同一通道内的设备区分,解决 “同一总线内的通信定向”。
两者结合,使 I2C 总线既能支持多设备共享,又能灵活应对复杂系统的通信需求。
五.在 I2C 通信协议中,ACK(Acknowledge,确认) 和 NACK(Not Acknowledge,非确认) 是主设备与从设备之间用于校验数据传输是否成功的应答信号,由接收方(根据通信方向,可能是从设备或主设备)产生。
1. ACK(确认信号)
定义:当接收方(从设备或主设备)成功接收到一个字节的数据后,在规定的时钟周期内将 SDA 线拉低,表示 “数据已正确接收”。
产生时机:
主设备向从设备发送数据(如地址、指令、数据字节)时,从设备在每个字节的第 8 位数据传输完成后,会产生 ACK 信号(拉低 SDA),告知主设备 “已收到该字节”。
主设备从从设备读取数据时,主设备在每个字节接收完成后,可产生 ACK 信号,告知从设备 “继续发送下一个字节”。
作用:确认数据传输有效,允许通信继续进行。
2. NACK(非确认信号)
定义:当接收方未成功接收数据,或不需要继续接收数据时,在规定的时钟周期内让 SDA 线保持高电平(通常由上拉电阻维持),表示 “数据未接收或无需继续传输”。
产生时机:
从设备未正确接收主设备发送的地址或数据(如地址不匹配、数据错误)时,从设备会产生 NACK 信号,主设备通常会终止当前通信或重试。
主设备从从设备读取数据时,若已接收完所有需要的数据,主设备会产生 NACK 信号,告知从设备 “停止发送”,随后主设备会产生停止条件(Stop Condition)结束通信。
作用:标识传输异常或终止通信,避免无效数据继续传输。
3. 时序规则
ACK/NACK 信号的产生严格遵循 I2C 时序:
每个字节(8 位)传输完成后,会有一个额外的时钟周期(第 9 个时钟)用于传输 ACK/NACK 信号。
此时,发送方释放 SDA 线(让其由上拉电阻拉至高电平),接收方通过拉低 SDA(ACK)或保持高电平(NACK)来应答。
时钟信号(SCL)由主设备控制,第 9 个时钟的高电平期间,SDA 的状态(低 = ACK,高 = NACK)被确认。
总结
ACK:接收方告知发送方 “数据已正确接收,可继续”(SDA 低电平)。
NACK:接收方告知发送方 “数据未接收或无需继续”(SDA 高电平)。
这两个信号是 I2C 协议中保证数据传输可靠性的关键机制,确保主从设备之间的通信同步和错误检测。
