1. STM32 I2C 通信基础与核心原理
I2C(Inter-Integrated Circuit)总线是嵌入式系统中最常用的低速外设通信协议之一。作为一名嵌入式工程师,我经常需要在STM32项目中使用I2C与各种传感器、存储芯片通信。这个两线制的通信协议看似简单,但实际应用中却有不少需要注意的细节。
1.1 I2C 总线基本特性
I2C总线只需要两根线就能实现多设备通信:
- SCL(Serial Clock):时钟线,由主机控制
- SDA(Serial Data):数据线,双向传输
这种设计在PCB布线时特别方便,尤其是当板上空间紧张时。我曾在一个人体感应灯项目中,用I2C同时连接了光照传感器、温度传感器和OLED显示屏,只用了4个GPIO(包括电源和地线)。
I2C支持多主多从架构,但实际上大多数STM32应用都是单主系统。总线上的每个设备都有唯一的7位或10位地址。常见的地址分配如下:
| 设备类型 | 典型地址范围 | 示例设备 |
|---|---|---|
| 温度传感器 | 0x48-0x4F | LM75 |
| EEPROM | 0x50-0x57 | 24C02 |
| 数字传感器 | 0x38-0x3F | AHT20 |
| RTC时钟 | 0x68 | DS3231 |
1.2 STM32的I2C外设特点
STM32的I2C外设实现有几个关键特性需要特别注意:
-
时钟配置:I2C时钟必须正确设置,通常来自APB1总线(最大36MHz)。计算CCR寄存器值时需要考虑:
- 标准模式(100kHz):CCR = APB1时钟/(2×100kHz)
- 快速模式(400kHz):CCR = APB1时钟/(2×400kHz)
-
GPIO模式:必须配置为开漏输出模式(GPIO_Mode_AF_OD),这是I2C标准要求的。我曾遇到过因为配置成推挽输出导致总线锁死的问题。
-
中断机制:STM32提供了丰富的中断事件标志,合理使用可以大幅提高效率:
- 事件中断:SB、ADDR、STOPF等
- 错误中断:BERR、ARLO、OVR等
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. I2C通信流程深度解析
2.1 主发送模式完整流程
主发送模式是向从设备写入数据的标准流程,以控制AHT20传感器为例:
- 起始条件生成:
c复制I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2
