学习资料来源于网络和https://www.bilibili.com/video/BV14o4y1Y7A1?p=7&vd_source=432ba293ecfc949a4174ab91ccc526d6
IIC基本术语:
IIC总线是Philips公司在八十年代推出的一种串行、半双工总线。 主要用于近距离、低速的芯片之前的通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步; IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机;主机有权发起和结束一次通信,而从机只能被动被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有唯一的地址,且每个器件都可以作为主机,也可以作为从机(同一时刻只能有一个主机),总线上的器件增加或者删除不影响其他器件正常工作,IIC总线在通信时总线上发送数据为发送器,接收数据的器件为接收器(如上图)。 下面是 I2C 总线的一些特征:- 只要求两条总线线路 一条串行数据线 SDA 和一条串行时钟线 SCL
- •每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 从机关系软件设定地址
- 主机可以作为主机发送器或主机接收器
- 它是一个真正的多主机总线 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
- 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 3.4Mbit/s
IIC总线通信过程:
1、主机发送起始信号启用总线 2、主机发送一个字节数据指明从机地址和后续字节的传送方向 3、被寻址的从机发送应答信号回应主机 4、发送器发送一个字节数据 5、接收器发送应答信号回应发送器 6、循环步骤4-5 7、通信完成后主机发送停止信号释放总线IIC总线寻址方式:
IIC总线上传输的数据是广义的,既包含地址,又包含真正的数据 主机在发送起始信号后必须先发送一个字节的数据,该数据的高7位为从机地址,最低位表示后续字节的传送方向(如下图),'0'表示主机发送数据,'1'表示主机接收数据;总线上所有的从机接收到该字节数据后都将这7位地址与自己的地址进行比较,如果相同,则认为自己被主机寻址,然后根据第8位将自己定位发送器或接收器起始信号和停止信号:
当IIC总线处于空闲的时候,SDA和SCL都是高电平 SCL为高电平时,SDA由高变低表示起始信号 SCL为高电平时,SDA由低变高表示停止信号 起始信号和停止信号都是由主机发出,起始信号产生之后总线处于占用状态,停止信号产生后总线处于空闲状态字节传送和应答:
IIC总线通信时每个字节为8位长度,数据传送时,先传送最高位,后传送低位(UART先低后高),发送器发送完一个字节数据后接收器必须发送1位应答信号来回应发送器,即一帧共有九位。 前8bit是由发送器发的,7bit地址,1bit表发送还是接收,第9bit是接收器发的,高电平表未响应,低电平表示响应同步信号:
IIC总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取一位数据,在此期间数据线上的信号不允许发生变化,必须保持稳定。 IIC总线通信时每一个字节为8位长度,数据传送时,先传送最高位,后传送低位,发送器发送完一个字节数据后接收器必须发送1位应答位来回应发送器,即一帧有9位典型IIC时序:
1、主机一直向从机发送数据 2、从机一直向主机发送数据 阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送;A表示应答,A非表示非应答,S表示起始信号,P表示终止信号 3、主机先向从机发送数据,然后从机再想主机发送数据 可以看到,主机向从机发送信号结束之后没有发送停止P信号IIC时钟同步与仲裁:
在单主设备中,不需要时钟同步和仲裁。而在多设备时,多个主设备可以同时在空闲的总线上开始发送数据,这时就需要仲裁决定哪一个来控制总线并完成它的数据传输,有时候也需要时钟同步来协同设备间的工作。而这正是通过时钟同步和仲裁来完成的。 时钟同步: 有的时候,主机的速度快于从机的速度,或者从机需要处理其他事情而不能及时地从主机接收数据或者向主机发送数据。如果从设备希望主设备降低传输速率,可以通过将SCL主动拉低,延长SCL低电平时间的方法来通知主设备。当主设备下一次传输时发现SCL电平被拉低时,就进入等待,直到从设备完成操作并释放SCL线。这就要使用时钟同步来完成。 时钟同步是通过连接到SCL总线的IIC接口“线与”实现。 SCL线上的低电平时间是由时钟低电平最长的器件决定,SCL的高电平则是由高电平时间最短的期间决定。 时钟同步解决了IIC总线设备间的速度同步 上图是IIC两主机的仲裁过程,I2C总线上可能在某一时刻有两个主控设备要同时向总线发送数据,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的: 假设主控器1要发送的数据DATA1为“101 ……”;主控器2要发送的数据DATA2为“1001 ……”总线被启动后两个主控器在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,他们就会继续占用总线。在这种情况下总线还是得不到仲裁。当主控器1发送第3位数据“1”时(主控器2发送“0” ),由于“线与”的结果SDA上的电平为“0”,这样当主控器1检测自己的输出电平时,就会测到一个与自身不相符的“0”电平。这时主控器1只好放弃对总线的控制权;因此主控器2就成为总线的唯一主宰者。不难看出:- 对于整个仲裁过程主控器1和主控器2都不会丢失数据;
- 各个主控器没有对总线实施控制的优先级别,他们遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权。