IIC协议

学习资料来源于网络
韦东山第三期

 

IIC基本术语:

IIC总线是Philips公司在八十年代推出的一种串行、半双工总线。
主要用于近距离、低速的芯片之前的通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;
0
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位将自己定位发送器或接收器
0
 

起始信号和停止信号:

当IIC总线处于空闲的时候,SDA和SCL都是高电平
0
SCL为高电平时,SDA由高变低表示起始信号
SCL为高电平时,SDA由低变高表示停止信号
起始信号和停止信号都是由主机发出,起始信号产生之后总线处于占用状态,停止信号产生后总线处于空闲状态
 

字节传送和应答:

IIC总线通信时每个字节为8位长度,数据传送时,先传送最高位,后传送低位(UART先低后高),发送器发送完一个字节数据后接收器必须发送1位应答信号来回应发送器,即一帧共有九位。
0
前8bit是由发送器发的,7bit地址,1bit表发送还是接收,第9bit是接收器发的,高电平表未响应,低电平表示响应
 

同步信号:

IIC总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取一位数据,在此期间数据线上的信号不允许发生变化,必须保持稳定。
0
IIC总线通信时每一个字节为8位长度,数据传送时,先传送最高位,后传送低位,发送器发送完一个字节数据后接收器必须发送1位应答位来回应发送器,即一帧有9位
0
 

典型IIC时序:

1、主机一直向从机发送数据
0
 
2、从机一直向主机发送数据
0
阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送;A表示应答,A非表示非应答,S表示起始信号,P表示终止信号
 
3、主机先向从机发送数据,然后从机再想主机发送数据
0
可以看到,主机向从机发送信号结束之后没有发送停止P信号
 

IIC时钟同步与仲裁:

在单主设备中,不需要时钟同步和仲裁。而在多设备时,多个主设备可以同时在空闲的总线上开始发送数据,这时就需要仲裁决定哪一个来控制总线并完成它的数据传输,有时候也需要时钟同步来协同设备间的工作。而这正是通过时钟同步和仲裁来完成的。
时钟同步: 有的时候,主机的速度快于从机的速度,或者从机需要处理其他事情而不能及时地从主机接收数据或者向主机发送数据。如果从设备希望主设备降低传输速率,可以通过将SCL主动拉低,延长SCL低电平时间的方法来通知主设备。当主设备下一次传输时发现SCL电平被拉低时,就进入等待,直到从设备完成操作并释放SCL线。这就要使用时钟同步来完成。
时钟同步是通过连接到SCL总线的IIC接口“线与”实现。
SCL线上的低电平时间是由时钟低电平最长的器件决定,SCL的高电平则是由高电平时间最短的期间决定。
时钟同步解决了IIC总线设备间的速度同步
0
上图是IIC两主机的仲裁过程,I2C总线上可能在某一时刻有两个主控设备要同时向总线发送数据,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的: 假设主控器1要发送的数据DATA1为“101 ……”;主控器2要发送的数据DATA2为“1001 ……”总线被启动后两个主控器在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,他们就会继续占用总线。在这种情况下总线还是得不到仲裁。当主控器1发送第3位数据“1”时(主控器2发送“0” ),由于“线与”的结果SDA上的电平为“0”,这样当主控器1检测自己的输出电平时,就会测到一个与自身不相符的“0”电平。这时主控器1只好放弃对总线的控制权;因此主控器2就成为总线的唯一主宰者。不难看出:
  1. 对于整个仲裁过程主控器1和主控器2都不会丢失数据;
  2. 各个主控器没有对总线实施控制的优先级别,他们遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权

 

IIC写时序:

 I2C写时序的步骤如下:

1)、开始信号。
2)、发送 I2C 设备地址,每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。
3)、 I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。
4)、从机发送的 ACK 应答信号。
5)、重新发送开始信号。
6)、发送要写写入数据的寄存器地址。
7)、从机发送的 ACK 应答信号。
8)、发送要写入寄存器的数据。
9)、从机发送的 ACK 应答信号。
10)、停止信号。 
 

IIC读时序:

I2C 单字节读时序比写时序要复杂一点,读时序分为 4 大步,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步重新发送设备地址,最后一步就是 I2C 从器件输出要读取的寄存器值,具体来看一下这几步。
1)、主机发送起始信号。
2)、主机发送要读取的 I2C 从设备地址。
3)、读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。
4)、从机发送的 ACK 应答信号。
5)、重新发送 START 信号。
6)、主机发送要读取的寄存器地址。
7)、从机发送的 ACK 应答信号。
8)、重新发送 START 信号。
9)、重新发送要读取的 I2C 从设备地址。
10)、读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
11)、从机发送的 ACK 应答信号。
12)、从 I2C 器件里面读取到的数据。
13)、主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
14)、主机发出 STOP 信号,停止 I2C 通信。
 
实际i2c波形:读写数据波形解读(图片来源于网络)

 

在 I2C通信中,主设备从写操作切换到读操作通常需要经过的步骤:

  1. 完成写操作:主设备首先发送器件地址和写位(R/W = 0)以指示要进行写操作,并发送要写入的数据给从设备。

  2. 重复 START 信号:主设备在完成写操作后,发送一个重复的 START 信号。

  3. 发送读操作:主设备发送器件地址和读位(R/W = 1),以指示要进行读操作。

  4. 从设备应答:从设备接收到读操作的地址后,会发送应答信号。

  5. 主设备接收数据:一旦从设备发送了应答信号,主设备开始接收从设备发送的数据。

 

协议细节:

  • 如何在SDA上实现双向传输? 主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。

  • 主、从设备都可以通过SDA发送数据,肯定不能同时发送数据,怎么错开时间? 在9个时钟里, 前8个时钟由主设备发送数据的话,第9个时钟就由从设备发送数据; 前8个时钟由从设备发送数据的话,第9个时钟就由主设备发送数据。

  • 双方设备中,某个设备发送数据时,另一方怎样才能不影响SDA上的数据? 设备的SDA中有一个三极管,使用开极/开漏电路(三极管是开极,CMOS管是开漏,作用一样),如下图:

 真值表如下:

 

从真值表和电路图我们可以知道:

  • 当某一个芯片不想影响SDA线时,那就不驱动这个三极管

  • 想让SDA输出高电平,双方都不驱动三极管(SDA通过上拉电阻变为高电平)

  • 想让SDA输出低电平,就驱动三极管

 

从下面的例子可以看看数据是怎么传的(实现双向传输)。 举例:主设备发送(8bit)给从设备

  • 前8个clk

    • 从设备不要影响SDA,从设备不驱动三极管

    • 主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管

  • 第9个clk,由从设备决定数据

    • 主设备不驱动三极管

    • 从设备决定数据,要发出回应信号的话,就驱动三极管让SDA变为0

    • 从这里也可以知道ACK信号是低电平

从上面的例子,就可以知道怎样在一条线上实现双向传输,这就是SDA上要使用上拉电阻的原因。

 

那为什么SCL也有上拉电阻呢?

 如上图,如果从设备有事情,内部操作,让主设备wait,所以SCL也有上拉电阻

 

 

 

posted @ 2024-03-19 15:12  lethe1203  阅读(20)  评论(0编辑  收藏  举报