一、概述

IIC(I²C)是嵌入式领域应用极广的低速串行通信总线,仅使用 SCL 时钟线SDA 数据线 两根信号线,硬件接线简单,支持一主多从架构,普遍用于温湿度传感器、EEPROM、实时时钟等外设。

本文从协议规则、基础时序入手,结合实际项目,基于 STM32 标准库实现可移植软件 IIC,只展示核心代码片段,讲解时序逻辑与调用方式,适合嵌入式开发者学习、项目复用。

二、IIC 核心基础规则

  1. 总线电平:总线空闲时,SCL、SDA 均为高电平,外设依靠上拉电阻实现。
  2. 数据有效性:SCL 为高电平时,SDA 数据必须稳定;SCL 为低电平时,允许 SDA 电平切换。
  3. 传输格式:以 1 Byte(8 位)为单位传输数据,高位优先
  4. 应答机制:每发送完 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 接口的实际调用逻辑(仅核心片段):

七、移植与排错总结

  1. 移植要点
    • 仅修改头文件中 GPIO端口、引脚、时钟 宏定义,时序代码无需改动;
    • 代码依赖 delay_us() 微秒延时函数,必须保证延时精度。
  2. 常见问题
    • 通信无应答:检查引脚模式、硬件上拉电阻、设备地址是否正确;
    • 数据错乱:严格遵循 IIC 电平规则,不要在 SCL 高电平时切换 SDA;
    • 总线卡死:代码中已增加超时判断,可有效规避该问题。

八、结语

软件模拟 IIC 不依赖硬件外设,兼容性、移植性远优于硬件 IIC,是嵌入式项目首选方案。只要吃透起始、停止、应答、读写四大基础时序,就能快速上手所有 IIC 类外设开发。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐