什么是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 } }
审核刘清
推荐阅读
- co的稳定性(关于COT的稳定条件的研究和介绍)
- 苹果手机掉水里怎么办最实用方法,苹果手机掉水里怎么办
- 屠龙归来h5最新版游戏介绍(屠龙归来h5最新版)
- 闹洞房的几种游戏玩法,闹洞房的几种游戏
- 苹果手机打电话没有声音怎么回事,苹果手机突然没有声音了怎么板
- 汽车怎么防止积碳(车子积碳哪来的,能不能预防)
- 闻过则喜的意思(闻过则喜的出处及造句)
- 电脑主机正常启动显示器没反应,电脑主机正常启动,显示器不会亮
- 摩托罗拉刀锋折叠手机使用技巧? 摩托罗拉刀锋手机
- 几种浏览器的比较,各大浏览器的对比,哪个最好用
- qq浏览器主页怎么设置简洁版,qq浏览器主页怎么设置
- 求全责备的意思(求全责备的出处及造句)
- 重庆二手车市场哪里最大_重庆二手车市场
- 神舟游戏本质量好不好? 神舟笔记本电脑怎么样
- 文件夹里隐藏文件,文件夹怎样隐藏.文件夹隐藏后怎样恢复和查看
- 格列兹曼身高体重?(格列本脲片别名)
- 网恋的人都很丑吗知乎,网恋的人都很丑吗
- 开卷有益的意思(开卷有益的出处及造句)
- 怎样将pdf格式转成excel格式的内容,怎样将PDF格式转成EXCEL格式