引子
集成电路总线(Inter-Integrated Circuit,IIC)是一种常用于单片机的同步串行通信接口规范,常见使用 I²C 的外设有EEPROM、传感器(如MPU9250中的磁力计)、时钟芯片(如DS3231)、低速ADC/ADC。相较于SPI,IIC通常速率更慢且电路更复杂,但所需接线更少。
I²C
I²C一般有两条信号线:SDA(serial data line)和SCL(serial clock line)分别用于传输数据和时钟信号。一般两条数据线都需要外接上拉电阻,同时引脚都工作在开漏模式下。时钟信号通常为100 kbit/s (标准模式)和 400 kbit/s (快速模式),但通常也可以以低于工作频率通信,也就是说可以方便地通过软件实现。
I²C是飞利浦发明的,同时拥有完整的规范,因此相对SPI而言需要配置的选项更少。
同时I²C也支持多从片,通过地址(一般为7位)实现片选。
I²C物理层
I²C的SDA和SCL通常会外接一个上拉电阻,引脚工作在开漏模式,电压不做限制,既可工作在5V也可工作在3.3V,一个总线上可以挂多个地址不同的从机。
I²C传输数据
基本单元
一次I²C传输数据从起始信号开始,首先将传输地址与读写标志位,随后开始传输数据,每个字节的数据传输后都会附加一个应答信号(ACK/NACK),并最终以停止信号结束,其中白色为主机发送,灰色为从机发送,绿色为主机或从机发送。
起始信号与停止信号
I²C传输任何数据都是以住片的START起始信号(SDA下降沿,SCL保持上拉)开始,并以STOP停止信号(SDA上升沿,SCL保持上拉)结束,在总线空闲状态下SDA和SCL都为高电平。
数据传输与应答信号(ACK/NACK)
在传输数据时在SCL下降沿更新数据,在SCL上升沿采集数据,先传高位。此外,在传输完成一字节数据后,接收方一般会发送ACK(1位1)或NACK(1位0)信号。
地址与读写标志
每次传输数据的第一个字节为地址(7位)和读写标志(1位,1为读,0为写),通常地址是器件自身决定并且固定的,为了解决地址冲突,有些器件也能自定义地址。
写数据
写数据时将读写标志置为0,每发送一个字节的数据从机都会返回一个ACK,其中白色为主机发送,灰色为从机发送。
读数据
读数据时将读写标志置为1,每接收一个字节的数据主机都会返回一个ACK并在结束时返回NACK,其中白色为主机发送,灰色为从机发送。
I²C实现
通常单片机会提供I²C硬件外设,但由于I²C硬件外设很容易卡在奇怪的地方,因此大多数时候使用软件I²C。
对于大部分单片机而言,在开漏模式下也能读取引脚状态,因此无需切换为推挽或输入状态。
由于I²C速率一般较低,因此在软件实现时还需要插入延时。以下为参考软件I2C设计。
(待补充)