I2C 总线
I2C 的英文拼写是“Inter—Integrate Circuit”,即内置集成电路。I2C 是一种由 Philips 公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C 总线只有两根线分别为:
时钟线 SCL(Serial Clock)和数据线 SDA(Serial Data)。总线空闲时,上拉电阻使SDA 和 SCL 线都保持高电平。I2C 总线上任意器件输出低电平都会使相应总线上的信号变低。
I2C 总线简单而实用,占用的 PCB(印刷电路板)空间很小,芯片引脚数量少,设计成
本低。I2C 总线支持多主控(Multi-Mastering)模式,任何能够进行发送和接收的设备都可以成为主设备。主控能够控制数据的传输和时钟频率,在任意时刻只能有一个主控。
I2C 总线原理
I2C 设备上的串行数据线 SDA 接口是双向的,用于向总线上发送或接收数据。串行时
钟线 SCL 也是双向的,作为控制总线数据传输的主机通过 SCL 接口发送时钟信号提供给从
设备;作为接受主机命令的从设备按照 SCL 上的信号发送或接收 SDA 上的信号。
I2C 总线在传输数据的过程中,主要有三种控制信号:起始信号,结束信号,应答信号。
起始信号:当 SCL 为高电平时,SDA 由高电平转为低电平时,开始传输数据。
结束信号:当 SCL 为高电平时,SDA 由低电平转为高电平时,结束数据传输。
应答信号:接收数据的器件在接收到 8bit 数据后,向发送数据的器件反馈一个应答信
号,表示已经收到数据。应答信号为低电平时,规定为有效应答位(ACK 简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位 ACK 的要求是,接收器在第 9 个时钟脉冲之前的低电平期间将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。接收器如果是主控器,则在它收到最后一个字节后,发送一个 NACK 信号,以通知被控发送器结束数据发送,并释放 SDA 线,以便主控接收器发送一个停止信号。
开始位和停止位都由 I2C 主机产生。在选择从设备时,如果从设备采用 7 位地址,则主
设备在发起传输过程前,需先发送 1 字节的设备地址信息,前 7 位为设备地址,最后 1 位为读写标志。之后,I2C 每次传输的数据也是 1 字节,并从 MSB 开始传输(最高有效位)。每个字节传完后,在 SCL 的第 9 个上升沿到来之前,接收方应该发出一个 ACK 位。在 SCL的时钟脉冲由 I2C 主控方发出,在第 8 个时钟周期之后,主控方应该释放 SDA。I2C 总线的时序如上图所示。