1. I2C总线基础:从零理解通信原理
I2C总线是嵌入式开发中最常用的通信协议之一,特别适合连接各种传感器和显示设备。我第一次接触I2C是在做一个温湿度监测项目,当时需要同时读取多个传感器的数据,I2C的多设备支持特性正好解决了这个问题。
I2C总线只需要两根线就能实现设备间的通信:SCL(串行时钟线)和SDA(串行数据线)。SCL负责传输时钟信号,确保数据传输的同步;SDA则负责实际的数据传输。这种简洁的设计让PCB布线变得非常方便,特别是在空间受限的项目中。
为什么I2C要采用开漏输出加上拉电阻的设计呢?这其实是为了实现"线与"逻辑。开漏输出只有两种状态:低电平和高阻抗。当所有设备都输出高阻抗时,上拉电阻将总线拉至高电平;只要有一个设备输出低电平,总线就是低电平。这种设计避免了多个设备同时驱动总线时的冲突问题。
在实际项目中,我通常使用4.7kΩ的上拉电阻,这个值在3.3V系统中能提供足够的驱动能力同时保持较低的功耗。如果总线负载较重或者通信距离较长,可能需要减小电阻值到2.2kΩ左右。
2. STM32硬件I2C外设深度解析
STM32的硬件I2C外设功能相当强大,支持主机和从机模式,通信速率最高可达400kHz(快速模式)。我比较喜欢使用硬件I2C而不是软件模拟,因为硬件实现能大大减轻CPU负担,特别是在需要频繁通信的场景中。
STM32的I2C外设包含几个关键寄存器:控制寄存器(CR1、CR2)、数据寄存器(DR)、自身地址寄存器(OAR)和状态寄存器(SR1、SR2)。理解这些寄存器的作用对于调试I2C通信问题非常重要。比如SR1寄存器中的ADDR位表示地址匹配成功,TXE位表示数据寄存器为空,这些状态位能帮助我们准确判断通信状态。
时钟配置是I2C初始化的关键部分。STM32的I2C时钟源来自APB1总线,我们需要根据系统时钟频率计算合适的分频值。以72MHz的系统时钟为例,要实现100kHz的标准模式,需要设置分频值为72MHz/100kHz/2=360。实际配置时还要考虑时钟占空比,通常选择2:1的占空比(即高电平时间占周期的1/3)。
我在项目中遇到过时钟配置不当导致通信失败的情况。有一次


844

被折叠的 条评论
为什么被折叠?



