数字接口——I2C 总线
了解内部集成电路总线(一种基本的低成本互联方案)的连接和格式。
内置集成电路 (I2C) 总线是一种单端、多主控双线总线,适合在半双工模式下进行高效的内部集成电路通信。该总线使用漏极开路技术,因此通过电阻器连接到 VDD 时就需要两根信号线,分别为串行数据 (SDA) 线和串行时钟线 (SCL),如图 1 所示。
图 1 I2C 总线
将线路拉低至接地认为是逻辑 0,而使线路浮置则为逻辑 1。通常将这用作通道接入方式。当 SCL 为低电平时,必将发生逻辑状态变化;当 SSL 为高电平时,若发生变化则认为是 START 和 STOP 条件。尽管系统允许提供更高或更低的电压,但典型的电源电压为 3.3V 和 5V。
I2C 通信采用 7 位地址空间(具有 16 个预留地址),因此在同一总线上,理论上最多可以和 112 个节点通信。但实际上,节点数会受到总线上规定的总体总电容 (400 pF) 限制,从而将通信距离限制为几米。规定的信号传输速率为 100 kbit/s(标准模式)、400 kbit/s(快速模式)、1 Mbit/s(快速模式Plus,FM+)和 3.4 Mbit/s(高速模式)。
总线上的节点有主从之分。主节点负责发布时钟和从节点地址,并且还开始和结束数据处理。从节点负责接收时钟和地址,并响应来自主节点的请求。图 2 显示了主从节点之间典型的数据传送示例。
图 2 完整的数据传输时序图
主节点通过创建一个 START 条件发布一个数据处理,紧接着发布希望与其进行通信的从节点的 7 位地址。随后发送一个信号读写位,表示主节点是否愿意写入到从节点 (0) 或者自从节点读取 (1)。接下来,主节点将释放 SDA 线,以允许从节点对数据接收作出应答。
在第 9 个 SCL 时钟脉冲的整个高电平期间,从节点通过将 SDA 拉至低电平以回应一个应答位 (ACK),之后主节点一直处于传输或接收模式(根据发送的读写位而定),而从节点则一直处于对应的互补模式(分别为接收或传输)。
发送地址和 8 位数据字节时首先发送最高位 (MSB)。当 SCL 为高电平时,通过 SDA 由高电平向低电平跳变来指示 START 位。而当 SCL 为高电平时,则通过 SDA 由低电平向高电平跳变来产生 STOP 条件。
当主节点写入到从节点时,它会在从节点发送 ACK 位时重复发送一个字节。在这种情况下,主节点将处于主传输模式,而从节点则处于从接收模式。当主节点自从节点读取时,它会重复接收自从节点的字节,同时对每个字节的接收作出应答 (ACK),但最后一个字节除外,请参见图 3。这种情况下,主节点将处于主接收模式,而从节点则处于从传输模式。