1. 双线接口(TWI)的本质解析
双线接口(TWI)这个名称听起来可能有些陌生,但提到它的另一个名字I²C,相信很多嵌入式开发者都会会心一笑。我第一次接触这个协议是在调试一块STM32开发板上的温湿度传感器时,当时就被它仅用两根线就能实现多设备通信的特性所震撼。
TWI本质上是一种同步、串行、半双工的通信总线协议。它的精妙之处在于仅用两根信号线就能构建起一个完整的通信网络:
- SDA(Serial Data Line):负责实际数据的传输
- SCL(Serial Clock Line):提供同步时钟信号
注意:虽然TWI和I²C在技术实现上几乎完全相同,但TWI这个名称实际上是Atmel(现Microchip)为了规避商标问题而采用的术语。在大多数情况下,你可以把它们视为同一种技术。
2. TWI/I²C的核心工作机制
2.1 信号线的物理特性
TWI总线的两根信号线都采用开漏输出结构,这意味着:
- 任何连接到总线的设备都只能主动将线路拉低(输出逻辑0)
- 当设备不主动驱动时,线路由上拉电阻恢复到高电平(逻辑1)
这种设计带来了三个重要优势:
- 实现了"线与"逻辑:只要有一个设备输出低电平,总线就是低电平
- 方便实现多主设备仲裁
- 允许不同电压的设备共存于同一总线(通过适当选择上拉电压)
在实际电路设计中,上拉电阻的选择很关键。通常使用4.7kΩ的电阻,但在长距离或高负载情况下可能需要减小阻值。我曾经在一个项目中因为使用了10kΩ的上拉电阻导致通信不稳定,后来换成3.3kΩ才解决问题。
2.2 通信时序详解
一次完整的TWI通信包含以下几个关键阶段:
-
起始条件(START)
- SCL为高电平时,SDA从高到低的跳变
- 这个独特的边沿组合确保了总线上的所有设备都能明确识别通信开始
-
地址帧传输
- 7位从设备地址(可扩展为10位)
- 1位读写控制位(0表示主设备写,1表示主设备读)
- 我在调试BMP280气压传感器时,就曾因为搞错地址位而浪费了半天时间
-
应答周期(ACK/NACK)
- 每个字节传输后的第9个时钟周期
- 接收方拉低SDA表示ACK(确认),保持高电平表示NACK(非确认)
-
**
