一文读懂 IIC 通信协议 | STM32 软件 IIC 时序详解 + 代码实现
·
一、概述
IIC(I²C)是嵌入式领域应用极广的低速串行通信总线,仅使用 SCL 时钟线 和 SDA 数据线 两根信号线,硬件接线简单,支持一主多从架构,普遍用于温湿度传感器、EEPROM、实时时钟等外设。
本文从协议规则、基础时序入手,结合实际项目,基于 STM32 标准库实现可移植软件 IIC,只展示核心代码片段,讲解时序逻辑与调用方式,适合嵌入式开发者学习、项目复用。
二、IIC 核心基础规则
- 总线电平:总线空闲时,SCL、SDA 均为高电平,外设依靠上拉电阻实现。
- 数据有效性:SCL 为高电平时,SDA 数据必须稳定;SCL 为低电平时,允许 SDA 电平切换。
- 传输格式:以 1 Byte(8 位)为单位传输数据,高位优先。
- 应答机制:每发送完 1 字节,接收方需要回复应答位(ACK/NACK),保证通信可靠。
三、四大基础时序逻辑
所有 IIC 通信动作,都由起始信号、停止信号、应答、单字节读写组合而成,下面结合时序逻辑对应代码片段。
3.1 起始信号
时序:总线空闲 → SCL 保持高电平 → SDA 由高电平拉低 → 产生起始信号,拉低 SCL 锁定总线。

3.2 停止信号
时序:SCL 拉低 → SDA 拉低 → SCL 拉高 → SDA 由低电平拉高 → 总线回到空闲状态。

3.3 应答信号
分为从机应答检测、主机主动发送 ACK / NACK,增加超时判断,避免总线卡死。

3.4 单字节发送与读取
遵循高位先发规则,是数据交互的核心函数。

四、硬件引脚配置与初始化
将引脚、端口、时钟做宏定义封装,修改引脚只需改动宏定义,大幅提升代码可移植性。

五、通用读写接口(7 位设备地址)
针对 IIC 外设常用的「设备地址 + 寄存器地址」模式,封装通用读写函数,适配绝大多数传感器、存储芯片。

六、结合外设实战调用示例
以 SHT45 温湿度传感器为例,演示整套 IIC 接口的实际调用逻辑(仅核心片段):

七、移植与排错总结
- 移植要点
- 仅修改头文件中
GPIO端口、引脚、时钟宏定义,时序代码无需改动; - 代码依赖
delay_us()微秒延时函数,必须保证延时精度。
- 仅修改头文件中
- 常见问题
- 通信无应答:检查引脚模式、硬件上拉电阻、设备地址是否正确;
- 数据错乱:严格遵循 IIC 电平规则,不要在 SCL 高电平时切换 SDA;
- 总线卡死:代码中已增加超时判断,可有效规避该问题。
八、结语
软件模拟 IIC 不依赖硬件外设,兼容性、移植性远优于硬件 IIC,是嵌入式项目首选方案。只要吃透起始、停止、应答、读写四大基础时序,就能快速上手所有 IIC 类外设开发。
更多推荐


所有评论(0)