1. STM32与IIC通信协议概述
IIC(Inter-Integrated Circuit)是飞利浦公司(现恩智浦)在1982年开发的一种同步、半双工、串行通信协议,在STM32微控制器中有着广泛应用。作为两线制总线(SCL时钟线和SDA数据线),IIC以其简洁的硬件连接和灵活的地址寻址方式,成为传感器、EEPROM等外设的常用接口。
在STM32生态中,IIC实现分为硬件IIC和软件模拟IIC两种方式。硬件IIC通过STM32内置的I2C外设实现,具有效率高、时序精确的特点;而软件模拟IIC则通过GPIO模拟时序,适用于引脚资源紧张或需要兼容特殊时序的场景。以STM32F103系列为例,其硬件I2C外设支持标准模式(100kHz)、快速模式(400kHz)和高速模式(3.4MHz)三种速率。
注意:STM32硬件IIC曾因BUG问题被开发者诟病,在F1系列中建议仔细阅读勘误手册。F4及后续系列已显著改善稳定性。
2. IIC协议核心机制解析
2.1 物理层特性
IIC总线采用开漏输出结构,需外接上拉电阻(通常4.7kΩ)。这种设计实现了"线与"逻辑,允许多个设备同时挂载。总线电容限制在400pF以内,长距离传输时需要降低速率或使用总线缓冲器。
2.2 通信时序详解
完整的IIC传输包含:
- 起始条件(SDA在SCL高电平时由高变低)
- 7位从机地址+1位读写方向(0写/1读)
- 应答位(ACK/NACK)
- 数据字节(8bit)+应答
- 停止条件(SDA在SCL高电平时由低变高)
以读取24C02 EEPROM为例:
c复制// 伪代码示例
START();
SendByte(0xA0); // 器件地址+写
ACK();
SendByte(0x00); // 内存地址
ACK();
START(); // 重复起始条件
SendByte(0xA1); // 器件地址+读
ACK();
RecvByte();
NACK();
STOP();
2.3 地址分配机制
7位地址空间理论上支持128个设备,但实际应用中:
- 地址0x00~0x07为系统保留
- 许多器件通过引脚配置部分地址位
- 同一总线上相同型号器件不超过8个
