I2C通信协议基础、拓扑、读写逻辑
- 一、I2C 协议基础认知
- 1. 基本定义
- 2. 硬件引脚与电平(3.3V TTL 主流方案)
- 核心两根总线(所有I2C设备共用)
- 辅助电路:上拉电阻
- 3. 主从设备概念(核心角色)
- 二、I2C 拓扑结构(总线架构 + 实物组网)
- 1. 标准总线拓扑原理
- 2. 实物组网实拍(开发板+多外设)
- 3. 拓扑特点总结
- 三、I2C 基础时序信号
- 1. 起始信号(Start)
- 2. 停止信号(Stop)
- 3. 应答信号(ACK/NACK)
- 四、I2C 完整读写逻辑
- 前置知识点
- 场景一:主机向从机 **写数据**(主机发、从机收)
- 分步拆解
- 实测现象(嵌入式测试)
- 场景二:主机从从机 **读数据**(从机发、主机收)
- 分步拆解
- 五、I2C 实物接线实操
- 标准接线规则(通用所有I2C设备)
- 多设备并联接线(总线拓扑落地)
- 六、嵌入式测试常见故障 & 排查(结合硬件/协议)
- 故障1:总线完全无应答(全程无ACK)
- 故障2:能写不能读 / 能读不能写
- 故障3:通信偶尔丢包、数据跳变
- 故障4:总线卡死(SDA持续低电平)
- 七、I2C 总结
一、I2C 协议基础认知
1. 基本定义
I2C(Inter-Integrated Circuit,集成电路总线),半双工同步串行通信总线,由飞利浦公司推出,是嵌入式设备最常用的近距离板内通信协议。
- 特点:仅两根信号线 + 公共地,布线简单、硬件成本低;
- 通信距离:板内短距离通信(几十厘米内),不适合长线缆;
- 典型应用:温湿度传感器、OLED屏、EEPROM、RTC时钟、加速度传感器等外设。
2. 硬件引脚与电平(3.3V TTL 主流方案)
核心两根总线(所有I2C设备共用)
- SDA:串行数据线,传输地址、读写指令、数据;双向收发
- SCL:串行时钟线,由主机提供时钟节拍,同步双方通信节奏
辅助电路:上拉电阻
I2C 总线为开漏输出,总线空闲时必须依靠4.7kΩ 上拉电阻将 SDA、SCL 拉至高电平(3.3V)。
- 常规配置:SDA、SCL 各串联一枚 4.7kΩ 上拉电阻接 VCC(3.3V)
- 电平规则:
- 总线空闲:SDA=高电平、SCL=高电平
- 逻辑1:高电平;逻辑0:低电平
配图1:I2C 上拉电阻电路实拍
图片特征:电路板上可见两枚贴片电阻,分别连接在 SDA、SCL 引脚与3.3V电源之间,是I2C正常工作的基础电路。
3. 主从设备概念(核心角色)
- 主机(Master):发起通信、产生SCL时钟、控制读写流程,一般是单片机/ARM主控芯片;一条总线同一时刻只能有1个主机。
- 从机(Slave):被动响应主机指令,每个从设备拥有唯一7位设备地址(总线寻址的依据);一条总线可挂载多个从机。
二、I2C 拓扑结构(总线架构 + 实物组网)
1. 标准总线拓扑原理
所有设备的SDA 引脚并联、SCL 引脚并联,共用一组上拉电阻,公共GND相连,构成一条总线。
- 组网规则:
- 所有设备 SDA 连在一起,所有设备 SCL 连在一起;
- 仅主机输出时钟(SCL),从机无法驱动时钟;
- 依靠设备地址区分不同从机,实现一对一通信。
配图2:I2C 总线拓扑示意图
图片特征:图形化展示主控芯片(主机)+ 多个传感器/外设(从机),SDA、SCL分别并联,标注上拉电阻、GND、VCC,清晰体现“一主多从”架构。
2. 实物组网实拍(开发板+多外设)
配图3:STM32开发板挂载多个I2C外设 实拍
图片特征:
- 主控开发板引出 I2C_SDA、I2C_SCL、GND、3.3V 排针;
- 多个外设(温湿度传感器、OLED显示屏、EEPROM)通过杜邦线并联接入同一组SDA/SCL;
- 所有设备共地、共电源,整套电路为标准I2C总线组网。
3. 拓扑特点总结
- 一主多从:单条总线最多可挂载127个从设备(7位地址);
- 线序极简:两根信号线即可完成多设备通信;
- 地址寻址:靠设备地址区分目标从机,无需额外片选线;
- 限制:总线距离短、速率偏低(标准100KHz,高速400KHz),仅用于板内通信。
三、I2C 基础时序信号
I2C 所有读写动作,都基于起始信号、停止信号、应答信号三种基础时序,结合示波器波形理解。
默认前提:总线空闲 → SDA=高、SCL=高。
1. 起始信号(Start)
- 时序规则:SCL 保持高电平期间,SDA 从高电平跳变到低电平
- 作用:主机通知所有从机,即将开始一次通信。
2. 停止信号(Stop)
- 时序规则:SCL 保持高电平期间,SDA 从低电平跳变到高电平
- 作用:主机结束本次通信,总线回归空闲状态。
3. 应答信号(ACK/NACK)
- 时序规则:每传输1个字节(8位)后,接收方会拉低SDA一个时钟周期,代表应答ACK;若SDA保持高电平,代表无应答NACK。
- 作用:校验数据是否正常接收,无应答通常代表:设备地址错误、从机离线、硬件故障。
配图4:I2C 起始+停止+应答信号 示波器波形实拍
图片特征:
- 横向为时间轴,纵向为电压;
- 清晰区分:空闲电平 → 起始波形 → 数据位 → ACK应答位 → 停止波形;
- 可直观看到 SCL(时钟)、SDA(数据)的电平先后变化关系。
关键规则:SCL高电平时,SDA的跳变代表起始/停止;SCL低电平时,允许改变SDA数据位。
四、I2C 完整读写逻辑
以最常用的7位地址、标准速率100KHz为例,分为写数据流程、读数据流程两大核心场景,结合实操现象、故障点说明。
前置知识点
- 设备地址:7位从机地址 + 1位读写位(0=写,1=读),组成1字节寻址帧;
- 数据传输:高位在前(MSB first),逐位在SCL低电平阶段切换SDA。
场景一:主机向从机写数据(主机发、从机收)
完整流程:起始信号 → 寻址字节(地址+写位) → 等待ACK → 寄存器地址 → 等待ACK → 写入数据 → 等待ACK → 停止信号
分步拆解
- 发起起始信号
主机拉低SDA,产生起始时序,总线进入通信状态。 - 发送寻址字节
主机依次输出7位从机地址 + 1位写标志(0),所有从机接收并比对地址;地址匹配的从机准备响应。 - 检测应答ACK
从机拉低SDA返回应答;无ACK= 地址错误/从机未上电/接线故障。 - 发送从机内部寄存器地址
主机下发要操作的从机寄存器编号(比如EEPROM存储地址、传感器配置寄存器)。 - 再次等待ACK
从机确认寄存器地址接收完成。 - 发送有效数据
主机逐字节写入目标数据,每写完1字节,等待一次ACK。 - 发送停止信号
主机拉高SDA,结束本次写操作,总线恢复空闲。
配图5:I2C写数据 逻辑分析仪波形
图片特征:按时间顺序展示 起始→寻址→ACK→寄存器→数据→停止 全流程波形,SCL时钟脉冲规律输出,SDA对应数据逐位变化。
实测现象(嵌入式测试)
- 正常:从机(传感器/EEPROM)成功写入配置/数据,设备功能切换;
- 异常:无ACK、总线卡死、从机无响应。
场景二:主机从从机读数据(从机发、主机收)
读操作分为随机读(指定寄存器读取),是测试中最常用流程:
完整流程:起始信号 → 寻址字节(写位) → ACK → 寄存器地址 → ACK → 重复起始信号 → 寻址字节(读位) → ACK → 读取数据 → NACK → 停止信号
分步拆解
- 第一次起始 + 写寻址
主机先以写模式寻址从机,发送需要读取的寄存器地址(告诉从机:我要读哪个地址的数据)。 - 重复起始信号
不发送停止信号,直接再次发起起始(I2C特有“重复起始”,避免总线释放)。 - 第二次寻址(读模式)
发送从机地址 +读标志(1),切换为读方向。 - 从机返回数据
在SCL时钟驱动下,从机将寄存器数据逐位送到SDA总线,主机采样接收。 - 主机回复NACK
读取完成后,主机发送无应答(NACK),通知从机不再继续读。 - 停止信号
通信结束,总线空闲。
配图6:I2C读数据 实操演示(开发板+串口助手)
图片特征:
- 硬件:开发板 + I2C温湿度传感器;
- 软件:串口助手打印读取到的温度、湿度数值;
- 现象:数值稳定刷新,代表I2C读流程正常。
五、I2C 实物接线实操
标准接线规则(通用所有I2C设备)
主控板 SDA ↔ 外设 SDA 主控板 SCL ↔ 外设 SCL 主控板 GND ↔ 外设 GND 主控板 3.3V ↔ 外设 VCC (外设供电)✅ 重点:SDA、SCL必须并联,GND必须共地,缺一不可。
配图7:单I2C外设接线实拍
图片特征:四根杜邦线对应连接 VCC、GND、SDA、SCL,走线清晰,是入门基础接线方式。
多设备并联接线(总线拓扑落地)
配图8:多个I2C设备并联接线实拍
图片特征:多个外设的SDA全部接在一起、SCL全部接在一起,共用主控的一组I2C引脚,完美体现一主多从拓扑。
六、嵌入式测试常见故障 & 排查(结合硬件/协议)
结合协议与时序,整理测试高频故障,对应实物现象:
故障1:总线完全无应答(全程无ACK)
- 现象:主机发送地址后,始终收不到从机应答,通信直接失败。
- 原因:
- SDA/SCL接反、GND未共地(最高发);
- 从机未上电、电源引脚虚焊;
- 上拉电阻缺失/损坏,总线无法回到高电平;
- 从机设备地址填写错误。
- 排查:核对接线 → 测量外设供电 → 用示波器查看总线空闲电平是否为高。
故障2:能写不能读 / 能读不能写
- 现象:单方向通信正常,反向失效。
- 原因:固件读写时序配置错误、从机寄存器只读/只写属性不匹配。
- 排查:抓取完整波形,对比标准读写时序,检查寄存器配置。
故障3:通信偶尔丢包、数据跳变
- 现象:大部分时间正常,偶尔读取数据错乱、应答丢失。
- 原因:
- 杜邦线过长、走线靠近电机/继电器,引入电磁干扰;
- 上拉电阻阻值不匹配;
- 总线挂载设备过多,负载超标。
- 排查:缩短线缆、远离干扰源、减少总线设备数量。
故障4:总线卡死(SDA持续低电平)
- 现象:SDA一直被拉低,后续所有通信都无法进行。
- 原因:通信中途断电、从机程序卡死、时序异常导致总线锁死。
- 解决:硬件断电重启设备,优化固件异常复位逻辑。
七、I2C 总结
- 硬件:两根线(SDA+SCL)+ 共地 + 4.7k上拉电阻,开漏输出;
- 拓扑:一主多从、总线并联,靠7位设备地址寻址;
- 时序:SCL高电平 → SDA跳变 = 起始/停止;逐字节传输+ACK应答;
- 流程:写=起始→寻址(写)→数据→停止;读=两次起始+读写切换;
- 排查优先级:接线→共地→上拉电阻→设备地址→时序波形。