一、介绍
I2C是 Inter-Intergrated Circut(集成电路)的缩写,是一种非常流行且功能强大的总线,用于单个主设备或多个主设备与单个或多个从设备之间的通信。多个不同的外设可以共享一条总线,该总线仅通过2条线(SCL和SDA)连接到处理器(或者控制器),这是与其他接口相比,I2C总线最大的优点之一。
SCL:Serial Clock 串行时钟线,仅由主机控制。
SDA:Serial Data 串行数据线,由主机和从机共同控制。
I2C是同步半双工的串行总线。
同步:通信双方都依赖于同一个时钟信号进行数据同步,从而保证数据交换的准确性和完整性。
半双工:可以双向传输数据,但不能同时进行。(对讲机)
I2C支持一主多从和多主多从。
在多主机环境中,如果其中一台主机发送高电平,但是检测到线路为低电平(被另一台设备将其拉低),则停止通信,因为另一台设备正在使用总线。(低电平优先)
二、电气特性
I2C的SCL、SDA都采用开漏模式+弱上拉电阻的方式。
I2C协议规定:禁止所有设备输出强上拉的高电平。
当无上拉电阻时:如果一个设备输出高电平,另外一个设备输出低电平,就会导致电源短路,这也是我们需要极力避免的。
而I2C设计的上拉电阻很好的解决了这个问题。
上拉电阻的存在可以限制电流流动,使得电平稳定在高电平状态。
即使两个设备在电平上产生了冲突,上拉电阻也会限制电流流过,避免电流过大造成损坏。因此,I2C总线具有一定的自保护能力,能应对潜在的通信问题。
漏极开路下拉总线:
Logic传输低电平,使场效应管导通,直接接地短路,Vbus被强下拉到GND。
漏极开路释放总线:
Logic传输高电平,场效应管断开,上拉电阻将Vbus的电压拉高。
三、数据格式
1、START和STOP
I2C的SDA和SCL在空闲时都是处于高电平状态。
规定:
当SCL为高电平时,SDA完成由高到低的转变,为START(开始信号)。
当SCL为高电平时,SDA完成由低到高的转变,为STOP(结束信号)。
2、数据和字节
定义:在SCL的一个时钟脉冲周期内,若SDA稳定为高电平,则为数据1;若SDA稳定为低电平,则为数据0。
一个字节由SDA线上的8位组成。
字节都介于START和STOP信号之间。
3、应答位
第九位为应答位,跟在每个字节(数据、地址字节)的后面,由接收方决定,应答成功为ACK,失败为NACK。
ACK表示该字节已成功接收,并且可以发送另一个字节。
在第九个时钟周期检测:若SDA为低电平,则为ACK;若SDA为高电平,则为NACK。
四、读写数据
1、向从器件写数据
步骤:
(1)主机发送START信号
(2)寻址,主机发送要写入的设备地址,并将最后一位设置为写入
【0表示写入,1表示读取】
(3)主机发送要写入的寄存器地址
(4)主机发送要写入的字节
(5)主机发送STOP信号
2、读取从器件数据
注意,在读取从器件数据时,我们需要先进行写入操作,找到需要读取的设备寄存器地址,再进行读取操作。
步骤:
(1)主机发送START信号
(2)寻址,找到希望读取的从机地址,附带写入位(W:0,R:1)
(3)主机发送要读取的寄存器地址
(4)主机发送Repeated START,以及希望读取的从机的地址,附带读取位1
(5)从机发送寄存器中的数据给主机
(6)主机发送应答位,ACK表示继续,NACK表示停止通信
(7)主机发送STOP信号
Repeated START : 仍然在START和STOP内,否则这可能导致主设备失去对另一个设备的控制权(在多主环境中)。