艾巴生活网

您现在的位置是:主页>科技 >内容

科技

什么是I2C协议(I2C的功能特点有哪些)

2024-02-16 22:02:02科技帅气的蚂蚁
1、什么是I2C协议?I2C是一种允许多个奴隶芯片与一个或多个主人薯片。就像串行外设接口(SPI)一样,只能用于短距离通信。像异步串行接口(如R

什么是I2C协议(I2C的功能特点有哪些)

1、什么是I2C协议?

I2C是一种允许多个奴隶芯片与一个或多个主人薯片。就像串行外设接口(SPI)一样,只能用于短距离通信。像异步串行接口(如RS232或UART),交换信息只需要两条信号线。

I2C的实现需要两条信号线进行信息交换,SCL时钟信号线和SDA数据输入/输出线。属于同步通信,由于输入输出数据都用一根线,通信方向为半双工。

小结:短距离,一主多从,半双工,双线,同步通信。

2、名词解释

什么是半双工?什么是同步通信?什么是异步通信?

2.1什么是半双工?

在数据通信中,数据在线路上的传输方式可分为单工通信、半双工通信和全双工通信。

单工通信是指消息只能单向传输的工作模式。例如,遥控和遥测(部分)是单工通信方法。单工通信信道是单向信道,发送方和接收方的身份是固定的。发送方只能发送信息,不能接收信息。接收器只能接收信息,但不能别寄了。数据信号只从一端传输到另一端,即信息流是单向的。

半双工是指数据可以在两个方向上传输,但一个通道中同时只能传输一个方向的数据,所以也叫双向交替通信。(两点之间可以双向发送信息,但不能同时发送。半双工模式需要发送和接收设备。这种方法效率较低,但可以节省传输线,因为信道方向要经常改变。

全双工意味着在通信的任何时刻,线路上都可以有从A到B和从B到A的双向信号传输。在全双工模式下,通信系统的每一端都有一个发送器和一个接收器,从而可以控制数据同时在两个方向上传输。全双工模式不需要切换方向,所以不存在切换操作带来的时间延迟,这对于不能有时间延迟的交互应用(如远程监控系统)非常有利。例如,电话是全双工设备,双方可以同时通话。

2.2什么是同步通信?

同步:发送方在发送串行数据的同时提供一个时钟信号,按照一定的协议发送数据(比如时钟信号上升时,数据发送出去)。接收者根据发送者和每个人提供的时钟信号接收数据协议。比如I2C、SPI等带时钟信号的协议都属于这种通信方式。

异步通信:接收方不知道数据何时到达,发送方和接收方可以有各自的时钟。发送方的发送时间间隔可以不均匀,接收方借助数据的起始位和终止位实现信息同步。这种传输通常是一个很小的数据包,比如一个字符为一组,数据组配有一个起始位和一个结束位。所以这种传输方式的效率比较低,因为增加了很多辅助位作为负载,这些辅助位常用于低速传输。

同步通信和异步通信的区别:

(1)同步通信要求接收端的时钟频率与发送端的时钟频率相同,发送端发送连续的比特流;异步通信不要求接收方时钟与发送方时钟同步。发送方发送一个字节后,可以在任何长时间间隔后发送下一个字节。

(2)同步通信效率高,而异步通信效率低。

(3)同步通信复杂,两个时钟的允许误差小;异步通信简单,双方的时钟可以允许一定的误差。

(4)同步通信可用于点对多点通信;异步通信只适用于点对点。

3、I2C的I2C特性

I2C最重要的功能包括:

只需要两条总线;

没有严格的波特率要求,例如使用RS232,mas

所有组件之间存在简单的主/从关系,连接到总线的每个设备都可以通过唯一的地址由软件寻址;

IC是真正的多主总线,可以提供仲裁和冲突检测;

传输速度:

标准模式:标准模式=100 Kbps

快速模式:快速模式=400 Kbps

高速模式:高速模式=3.4 Mbps

超快速模式:超快速模式=5 Mbps

主设备的最大数量:无限制;

最大从机数量:理论上127;

4、I2C高阻抗状态

开漏即高阻态适合输入/输出,可以独立输入/输出低电平和高阻态。如果需要产生高电平,则需要一个外部上拉电阻。

高阻态:高阻态是三态门电路的一种状态。逻辑门的输出有两种状态,高和低,第三种状态,高阻——门电路。高阻态在电路分析中可以理解为开路。

我们知道,IIC的所有设备都连接到一条总线上,所以当我们通信时,只有少数设备进行通信。此时,其余的空闲设备可能会受到总线的干扰或干扰总线。我们做什么呢

为了避免总线信号的混淆,IIC的空闲状态只能外部上拉,而空闲器件此时被拉至高阻抗状态,相当于开路。整个IIC总线只有在设备开启的情况下才能正常通信,不会干扰其他设备。

5、数据传输协议

主机和从机之间的数据传输遵循以下协议格式。Data通过SDA数据线在主机和从机之间传输0和1的串行数据。串行数据序列的结构可以分为:

5.1起始位

当主设备决定开始通信时,它需要发送开始信号并执行以下过程:

将SDA线从高电平切换到低电平;

将SCL线从高电平切换到低电平;

主机发送起始条件信号后,所有从机将变为有效,即使它们处于睡眠模式,并等待接收地址位。

5.2地址位

该地址支持7位和10位。如果主设备需要发送/接收从设备的数据,它必须首先发送相应从设备的地址,然后它会匹配安装在总线上的从设备的地址,因此地址主要用于标识不同的设备。

地址由主设备发送,从设备负责接受并识别该地址是否是自己的地址。

5.3读取和写入位

由于I2C是半双工通信,设备需要确定数据传输的方向,所以引入了读写位。

如果主器件需要向从器件发送数据,该位设为0;

如果主设备需要从从设备接收数据,将其置1;

读写位由主机发送;1表示读操作,0表示写操作。

5.4响应位

I2C最大的特点之一就是完善的应对机制。当从机从主机收到数据时,它会回复一个响应信号,通知主机我收到了。

应答信号:在1字节传输完成后,即在第9个SCL时钟周期出现。此时,主机需要释放SDA总线,将总线的控制权交给从机。由于上拉电阻,总线此时处于高电平。如果从机正确接收到主机发送的数据,它将拉低SDA,表示应答响应。不应答信号:当第9个SCL时钟周期时,SDA保持高电平,表示不应答信号。主设备或从设备可能会产生无响应信号。产生无响应信号的情况主要有以下几种:

I2C总线上没有地址由主设备指定的从设备;

从机正在执行一些操作,处于忙碌状态,不准备与主机通信;

主设备发送的一些控制命令不被从设备支持;

当主机接收到从机数据时,主机产生一个无响应信号,通知从机数据传输结束,不再发送数据;

5.5个数据位

I2C总线传输要保证SDA数据在SCL高电平时稳定,所以SDA上的数据变化只能在SCL低电平时传输。总共有8位,由发送方设置,它需要向接收方发送数据位。传输后将跟随一个ACK/NACK位。如果接收器成功接收到数据,从机将发送ACK。否则,从机发送一个NACK。

数据可以重复发送,直到收到停止位。

5.6停止位置

当主设备决定结束通信时,它需要发送结束信号并执行以下操作:

首先,SDA线从低电压电平切换到高电压电平;

然后把SCL线从高电平拉到低电平;

5.7总结

写寄存器的标准过程是:

启动主机启动

发送主I2C地址(7位)和w操作0(1位)并等待ACK。

从机发送ACK

发送主寄存器地址(8位)并等待ACK。

从机发送ACK

发送主机数据(8位),即要写入寄存器的数据,并等待ACK。

从机发送ACK

步骤6和7可以重复多次,即顺序写入多个寄存器。

主停止启动

读取寄存器的标准过程是:

发送主I2C地址(7位)和w操作1(1位)并等待ACK。

从机发送ACK

发送主寄存器地址(8位)并等待ACK。

从机发送ACK

启动主机启动

发送主I2C地址(7位)和r操作1(1位)并等待ACK。

从机发送ACK

从机发送数据(8位),即寄存器中的值。

主机发送ACK

步骤8和9可以重复多次,即顺序读取多个寄存器。

6、仲裁机制

在多主机通信系统中。总线上有很多节点,都有自己的地址,可以作为从节点被其他节点访问。同时,它们都可以作为主节点向其他节点发送控制字节和数据。

但是,如果两个或两个以上的节点向总线发送启动信号并开始传输数据,就会形成冲突。要解决这种冲突,就必须做出仲裁决定,这就是I2C巴士仲裁。

I2C总线上的仲裁包括两部分:SCL线的同步和SDA线的仲裁。

6.1线的同步

SCL同步是因为总线具有与(开漏输出)的逻辑功能,即只要一个节点发送低电平,总线就显示低电平。当所有节点都发送高电平时,总线可以显示高电平。因为线路和逻辑函数的原理,当多个节点同时发送时钟信号时,总线上出现一个统一的时钟信号,这就是SCL的同步原理。

6.2 SDA线的仲裁

总线仲裁是解决多个设备同时争夺中心线控制权的问题,通过某个裸机决定哪个设备可以获得总线的最终控制权。

SDA线的仲裁也是基于总线具有AND线逻辑功能的原理。发送1位数据后,节点比较总线上呈现的数据是否与自己发送的一致(类似于CAN总线的回读机制)。

是,继续发送;

否则,退出比赛;

I2C总线的控制逻辑:低电平优先

SDA线的仲裁可以保证当多个主节点试图同时控制总线时,I2C总线系统能够正常通信,数据不会丢失。总线系统通过仲裁只允许一个主节点继续占用总线。

以上过程分析:

第一个周期:所有设备发送1,and运算的结果是1,和自己发送的数据一样,继续发送;第二个周期:所有设备发送1,and运算的结果是1,和自己发送的数据一样,继续发送;第三个周期:所有设备发送0,and运算的结果是0,和自己发送的数据一样,继续发送;第四个周期:AB设备发送1,C设备发送0,and运算后的结果为0。如果与AB发送的数据不同,AB退出竞争,节点C获胜;注意:如果AB的两个设备发送0,C的设备发送1,最后结果是0,和AB的数据格式一样,但是和C的数据格式不同,那么C退出,AB继续发送,直到AB的一个退出。

SDA仲裁和SCL时钟同步过程没有顺序关系,而是同时进行。

7、I2C死锁

在实际使用过程中,I2C容易出现的一个问题就是死锁。I2C僵局主要表现为:I2C僵局时,SCL高,SDA总是低。

I2C主机读写操作时,主机控制SCL在起始信号后产生8个时钟脉冲,然后将SCL信号拉低。此时,从机输出响应信号,并将SDA信号拉至低电平。

如果这个时候主设备异常复位,SCL就会被释放为高电平。此时,如果从设备没有复位,就会继续I2C的应答,将国家药品监督管理局一直拉为低电平,直到SCL变为低电平,才会结束应答信号。

而对于I2C主设备来说,复位后检测SCL和国家药品监督管理局信号,如果发现国家药品监督管理局信号为低电平,则会认为I2C总线被占用,会一直等待SCL和国家药品监督管理局信号变为高电平。

这样,I2C主设备等待从设备释放国家药品监督管理局信号,而同时I2C从设备又在等待主设备将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。

同样,当I2C进行读操作,I2C从设备应答后输出数据,如果在这个时刻I2C主设备异常复位而此时I2C从设备输出的数据位正好为0,也会导致I2C总线进入死锁状态。

8、I2C的代码实现

参考了STM32的硬件抽象层(硬件抽象层的缩写)库中I2C驱动,主设备发送函数哈尔_ I2C _主人_传送()具体如下:

/* * * * @ briefTransmitsinmastermodeanamountofdatainblockingmode .* @ param hi 2 pointer to ai 2c _ handletypedefstructurethacontains *指定i 2c得配置信息.* @ paramDevAddressTargetdeviceaddress:device 7 bitsaddressvalue * in datasheet mustbhifttedtoleftbeforeallingteininterface * @ parampdatapointertodatabauffer * @ paramTimeoutTimeoutduration * @ retvalHALstatus */HAL _ StatusTypeDefHAL _ I2C _ Master _ Transmit(I2C _ handle typedef * hi2c,uint16_tDevAddress,uint8_t*pData,uint16_tSize,uint32if(hi2c-State==HAL _ I2C _ State _ READY){if(I2C _ WaitOnFlagUntilTimeout(hi2c,I2C_FLAG_BUSY,set,I2C_TIMEOUT_BUSY_FLAG,tickstart)!=HAL _ OK){ return HAL _ BUSY;}_ _ HAL _ LOCK(hi2c);if((hi2c-Instance-CR1I2C _ CR1 _ PE)!=I2C _ CR1 _ PE){_ _哈尔_ I2C _启用(hi2c);}hi2c-Instance-CR1=~ I2C _ CR1 _ POS;hi2c-State=HAL _ I2C _ State _ BUSY _ TX;hi2c-模式=哈尔_ I2C _模式_主控;hi2c-错误代码=哈尔_ I2C _错误_无;hi2c-pBuffPtr=pData;hi2c-XferCount=Size;hi2c-外汇期权=I2C _否_选项_框架;hi2c-XferSize=hi2c-XferCount;if(I2C _ MasterRequestWrite(hi2c,DevAddress,Timeout,tickstart)!=HAL _ OK){ if(hi2c-错误代码==HAL _ I2C _错误_ AF){_ _ HAL _解锁(hi2c);returnHAL _ ERROR} else {_ _ HAL _ UNLOCK(hi2c);return HAL _ time out } }_ _ HAL _ I2C _ CLEAR _ ADDRFLAG(hi2c);while(hi2c-xfersize 0 u){if(I2C _ waitontxeflaguntitimeout(hi2c,time out,tickstart)!=HAL _ OK){ if(hi2c-错误码==HAL _ I2C _错误_ AF){hi2c-实例-CR1 |=I2C _ CR1 _停止;return Hal _ ERROR } else { return Hal _ time out } }hi2c-Instance-DR=(* hi2c-pBuffPtr);hi2c-XferCount-;hi2c-XferSize-;如果((_ _哈尔_I2C_GET_FLAG(hi2c,I2C _ FLAG _ BTF)==SET)(hi2c-XferSize!=0U)){hi2c-Instance-DR=(* hi2c-pBuffPtr);hi2c-XferCount-;hi2c-XferSize-;}if(I2C _ waitonbtflaguntiltimeout(hi2c,timeout,tickstart)!=HAL _ OK){ if(hi2c-错误码==HAL _ I2C _错误_ AF){hi2c-实例-CR1 |=I2C _ CR1 _停止;returnHAL _ ERROR } else { returnHAL _ time out } } }hi2c-Instance-CR1 |=I2C _ CR1 _停止;hi2c-状态=哈尔_ I2C _状态_就绪;hi2c-模式=哈尔_ I2C _模式_无;_ _ HAL _ UNLOCK(hi2c);return Hal _ OK } else { return Hal _ BUSY } }

审核刘清