I2C通信是内部集成电路的简称,它是飞利浦半导体开发的一种通信协议,用于在中央处理器和同一电路板上的多个IC之间仅使用两条公共电线传输数据。
由于其简单性,它被广泛用于微控制器和传感器阵列、显示器、物联网设备、EEPROM等之间的通信。
这是一种同步串行通信协议。这意味着数据位以参考时钟线设置的规则时间间隔一个一个地传输。
一、I2C的特征
以下是I2C通信协议的一些重要特性:
(1)只需要两条公共总线(线)即可控制I2C网络上的任何设备/IC;
(2)无需像UART通信那样事先约定数据传输速率。因此可以根据需要随时调整数据传输速度;
(3)用于验证传输数据的简单机制;
(4)使用7位寻址系统来定位I2C总线上的特定设备/IC;
(5)I2C网络易于扩展,新设备可以简单地连接到两条公共I2C总线上。
二、I2C的硬件
1、物理I2C总线
I2C总线(接口线)仅由两条线组成,称为串行时钟线(SCL)和串行数据线(SDA)。要传输的数据通过SDA线发送,并与来自SCL的时钟信号同步。I2C网络上的所有设备/IC都连接到相同的SCL和SDA线,如下所示:
两条I2C总线(SDA、SCL)都用作开漏驱动器。这意味着I2C网络上的任何设备/IC都可以将SDA和SCL驱动为低电平,但不能将它们驱动为高电平。因此,每条总线都使用一个上拉电阻,默认情况下将它们保持在高电平(正电压)。
使用开漏系统的原因是没有短路的可能性,当一个设备试图将线路拉高而其他设备试图将线路拉低时,可能会发生短路。
二、主从设备
连接到I2C总线的设备分为主设备或从设备。在任何时刻,只有一个主设备在I2C总线上保持活动状态。它控制SCL时钟线并决定要在SDA数据线上进行什么操作。
响应来自该主设备的指令的所有设备都是从设备。为了区分连接到同一I2C总线的多个从设备,每个从设备在物理上都分配了一个永久的7位地址。
当主设备想要向从设备传输数据或从从设备传输数据时,它会在SDA线上指定这个特定的从设备地址,然后继续传输。因此,有效的通信发生在主设备和特定从设备之间。
所有其他从设备都不会响应,除非它们的地址由SDA线上的主设备指定。
三、数据传输协议
主设备和从设备遵循以下协议(规则集)以在它们之间传输数据。
数据通过单个SDA数据线在主设备和从设备之间传输,通过0和1(位)的模式序列。每个0和1序列称为一个事务,每个事务中的数据结构如下:
1、开始条件
每当主设备/IC决定开始一个事务时,它会在SCL线从高电平切换到低电平之前将SDA线从高电压电平切换到低电压电平。
一旦主设备发送启动条件,所有从设备即使处于睡眠模式也会激活,并等待地址位。
2、地址块
它由7位组成,并填充主设备需要发送/接收数据的从设备地址。I2C总线上的所有从设备将这些地址位与其地址进行比较。
3、读/写位
该位指定数据传输的方向。如果主设备/IC需要向从设备发送数据,则该位设置为“0”。如果主IC需要从从设备接收数据,则将其设置为“1”。
4、ACK/NACK位
它代表已确认/未确认位。如果任何从设备的物理地址与主设备广播的地址一致,则该位的值由从设备设置为“0”。否则它保持逻辑“1”(默认)。
5、数据块
它由8位组成,它们由发送方设置,需要传输到接收方的数据位。该块后跟一个ACK??/NACK位,如果接收器成功接收到数据,则接收器将其设置为“0”。否则它保持逻辑'1'。
这种数据块后跟ACK/NACK位的组合被重复,直到数据完全传输。
6、停止条件
在通过SDA线传输所需的数据块后,主设备先将SDA线从低电平切换到高电平,然后再将SCL线从高电平切换到低电平。
注意:逻辑“0”或设置一个位为“0”相当于在SDA线上施加低电压,反之亦然。
四、I2C通信实际如何工作?
I2C通信/事务由主设备发起,以向从设备发送数据或从其接收数据。让我们详细了解这两种场景的工作原理。
1、向从设备发送数据
当主设备尝试通过I2C总线向特定从设备发送数据时,会发生以下操作序列:
(1)主设备发送启动条件;
(2)主设备发送与目标从设备对应的7个地址位;
(3)主设备将读/写位设置为“0”,表示写;
(4)现在有两种可能:如果没有从设备与主设备发送的地址匹配,则下一个ACK??/NACK位保持为“1”(默认)。这向主设备发出信号,表明从设备识别不成功。主时钟将通过发送停止条件或新的启动条件来结束当前事务。如果存在与主设备指定地址相同的从设备,则从设备会将ACK/NACK位设置为“0”,这会向主设备发出信号,表明从设备已成功定位。
(5)如果从设备成功定位,则主设备现在发送8位数据,这些数据仅由目标从设备考虑和接收。该数据对剩余的从设备没有任何意义。
(6)如果数据被从设备成功接收,它会将ACK/NACK位设置为“0”,这表示主设备继续。
(7)重复前两步,直到数据全部传输完毕。
(8)在所有数据发送到从设备后,主设备发送停止条件,通知所有从设备当前事务已结束。
下图表示在SDA线上发送的总体数据位以及控制每个位的设备:
2、从从设备读取数据
除了以下内容外,操作顺序与之前的场景相同:
(1)主设备将读/写位设置为“1”而不是“0”,这向目标从设备发出信号,表明主设备正在等待来自它的数据;
(2)数据块对应的8位由从设备发送,ACK/NACK位由主设备设置;
(3)一旦主设备接收到所需的数据,它就会发送一个NACK位。然后从设备停止发送数据并释放SDA线。
如果主设备从从设备的特定内部位置读取数据,它首先使用前面场景中的步骤将位置数据发送到从设备。然后它以重复的开始条件开始读取数据的过程。
下图表示在SDA线上发送的总体数据位以及控制每个位的设备:
3、时钟拉伸的概念
假设主设备启动了一个事务并发送特定从设备的地址位,然后是“1”的读取位。特定的从设备需要发送一个ACK??位,紧接着是数据。
但是如果从设备需要一些时间来获取和发送数据到主设备,在这个间隙期间,主设备会认为从设备正在发送一些数据。
为了防止这种情况,从设备将SCL时钟线保持为低电平,直到它准备好传输数据位。通过这样做,从设备向主设备发送信号以等待数据位,直到时钟线被释放。
以上就是金沙js5线路单片机开发工程师分享的“I2C通信基础知识:硬件、数据传输、配置”。金沙js5线路专注单片机应用方案设计与开发,提供8位单片机、16位单片机、32位单片机。