问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

IIC通信协议详解

创作时间:
作者:
@小白创作中心

IIC通信协议详解

引用
CSDN
1.
https://m.blog.csdn.net/2403_83439703/article/details/145182984

IIC(Inter-Integrated Circuit)总线是由NXP公司开发的一种串行总线,主要用于主控制器和从机之间的通信。它适用于小数据量、传输距离短的场景,具有多主多从机制和ACK应答机制等特点。本文将详细介绍IIC协议的基本概念、硬件电路、软件时序、寻址方式以及时钟同步与仲裁机制。

IIC简介

IIC(Inter -Integrated Circuit)总线,是由NXP公司开发的串行总线,多用于主控制器和从机之间的通信,适用于小数据量,传输距离短的场景。
IIC特点:
1)只有一条数据线,为半双工
2)IIC为同步传输协议
3)IIC共有两条线,一条是SDA(数据线),一条是SCL(时钟线)
4)IIC有多主多从机制,常用为一主一从,一主多从
5)IIC有ACK应答机制,发送和接收数据,都需要接收和发送ACK
6)设备寻址,当IIC总线为一主多从时,可以通过7位或10位设备地址寻找从机进行通信

IIC的硬件电路

一主多从模型:
IIC 总线上的所有设备的SCL连接在一起,所有SDA连接在一起,然后外接一个上拉电阻。
总线上的SCL时钟线只能由主机控制,
主机可以发起对SDA的控制,而从机只有在向主机发送数据或回复ACK的时候,能短暂的控制SDA。
IIC设备的SCL和SDA引脚 均要配置为开漏输出模式,并且外接一个上拉电阻:
IIC只有一条数据线--SDA,所以SDA数据线在主机和从机之间是双向传输的,所以SDA线要反复的切换输入输出方式,如果总线时序没协调好,主机SDA输出高电平,从机SDA输出低电平,就会造成电源短路,
所以IIC协议规定,禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构,
如上图,IIC设备内部电路,SCL和SDA的电路结构相同,
IN是输入,因为输入对电路没有影响,直接输入,OUT是输出,采用的是开漏输出结构,所有设备只能输出低电平,或者浮空,这时就需要在总线上外置一个上拉电阻,通过电阻连接到的电源,这就是弱上拉。
好处:
1)完全杜绝了电源短路现象,保证电路的安全,
2)避免了引脚输入输出的频繁切换,例如SDA想要输出时,直接操控SDA线高低,想要输入,也不用切换为输入模式,直接读取SDA的高低电平。
3)有线与的特性,有一个设备输出低 总线就是低,可以用来进行多主机下仲裁机制。

IIC 软件时序

基本时序
1) 开始条件和结束条件
IIC在空闲状态下,SCL和SDA默认为高电平,因为外接了弱上拉电阻。
起始条件: SCL高电平期间,SDA从高电平到低电平
结束条件: SCL高电平期间,SDA从低电平到高电平
2)主机发送一个字节
在SCL低电平期间,主机将数据依次放到SDA数据线上(高位先行),然后放手SCL线,从机会在SCL高电平期间读取数据,因此在SCL为高电平期间SDA不允许有数据变化,循环8次发送一个字节
3)主机接收一个字节
在SCL低电平期间,主机将SDA的控制权交给从机,从机将数据依次放到SDA数据线上(高位先行),然后放手SCL线,主机会在SCL高电平期间读取数据,因此在SCL为高电平期间SDA不允许有数据变化,循环8次接收一个字节
注:主机在接收时需要释放SDA,释放SDA就相当于输入检测模式。
4)发送和接收应答

SDA线上,数据0表示应答,数据1表示非应答,
主机在发送数据后,会接收一位应答ACK,主机在发送完数据后,会释放SDA线,这时从机应该马上拉低SDA线,主机会在SCL高电平期间读取应答位,如果应答位为0,表示从机收到了数据,
主机在接收数据后,要发送应答位,从机会在发送完数据后,释放SDA线,这时主机就会把SDA拉低,从机在SCL高电平期间读取应答位,当主机没发送应答位,从机没有读取到应答,从机就会认为主机不想要数据了,就会停止发送数据,释放SDA线,防止干扰主机的行为。

复杂时序
IIC如何确认发送的数据到那个设备:IIC设备上的每个都会有设备地址,主机发送数据前,会先发送设备地址,这个设备每个设备都会收到,如果主机呼叫不是自己,后面的数据时序就不会参与,
相同的芯片挂载到同一总线,需要用到IIC设备地址中的可变部分,IIC总线上最多挂载128个设备
1)指定地址写
1)主机产生起始条件,
2)主机发送从机地址+读写标志位(0写/1读),等待从机ACK应答,
3)在发送第二个字节,是从机设备内部寄存器的地址,,等待从机ACK应答,
4)在发送第三个字节,是要写入从机设备的数据,等待ACK应答,
5)产生终止条件
2)指定地址读
1)产生起始条件
2)发送第一个字节,从机地址+写的标志位,等待ACK,
3)发送第二个字节,从机设备指定的地址,等待ACK,
4)此时 从机接收到数据后,当前指针就会指向这个地址,再产生起始条件,发送从机地址+读的标志位,等待ACK,此时,主机就会接收字节,这个字节就是指定地址的数据,
注:当要发送多个数据时,重复读取、写入就行,当前地址会自增,
但是注意,当要停止接收数据时,主机要给非应答(不拉低SDA),从机读取到非应答后,就会释放SDA,如果主机不给非应答,可能不能产生终止条件。

IIC寻址

IIC协议通信中,寻址是确定要发送或接收目标设备数据的过程,
1)地址格式

  1. IIC设备都有唯一的7位或10位地址,
  2. 有的IIC设备会有一个引脚决定 地址的最低位,例如 SHT30温度传感器,地址是 110101
    当PA0 接VCC时,LSB为0,地址就是1101010. PA0接GND时,LSB为1,地址就是 1101011
    2)地址类型
    主机寻找通信的从机时,第一个发送的字节就是 7为从机地址+读/写标志位,
    通常 写 是 0, 读 是 1

时钟同步与仲裁

时钟同步
在 I2C 总线上传送信息时的时钟同步信号是由挂接在 SCL 线上的所有器件的 逻辑“与” 完成的。即如果有多个主机同时产生时钟,那么只有所有主机都发送高电平时,SCL 上才表现为高电平,否则 SCL 都表现为低电平。
SCL 线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使 SCL 线一直保持低电平,使 SCL 线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟由低至高的跳变并不能影响 SCL 线的状态,于是这些器件将进入高电平等待的状态。当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL 线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将 SCL 线拉成低电平。这样就在 SCL 线上产生一个同步时钟。
可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定

时钟仲裁
总线仲裁与时钟同步类似,当所有主机在 SDA 上都写 1 时,SDA 的数据才是 1,只要有一个主机写 0,那此时 SDA 上的数据就是 0。
一个主机每发送一个 bit 数据,在 SCL 为高电平时,就检查 SDA 的电平是否和发送的数据一致,如果不一致,这个主机便知道自己输掉了仲裁,然后停止向 SDA 写数据。也就是说,如果主机一致检查到总线上数据和自己发送的数据一致,则继续传输,这样在仲裁过程中就保证了赢得仲裁的主机不会丢失数据。
输掉仲裁的主机在检测到自己输了之后也就不再产生时钟脉冲,并且要在总线空闲时才能重新传输。
仲裁的过程可能要经过多个 bit 的发送和检查,实际上两个主机如果发送的时序和数据完全一样,则两个主机都能正常完成整个数据传输。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号