一、介绍

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内,否则这可能导致主设备失去对另一个设备的控制权(在多主环境中)。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 I2C通信协议详解

发表评论