IIC介绍(二)之协议层介绍

     IIC通过两个线进行主机与多个从机之间的信息传输,故其传输协议便相对而言麻烦一些。

一、数据传输的开启与结束:

在IIC总线中,其拥有着两个比较特殊的情况:

 (1)起始位(S):当SCL是高电平时,SDA由高电平向低电平切换

 (2)停止位(P):当SCL是高电平时,SDA由低电平向高电平切换

对应的信号路下图所示;

IIC介绍(二)之协议层介绍


      一般而言,IIC上的起始和终止信号都是由总机产生的,而IIC总线在起始条件后便被认为处于BUSY的状态,而在停止条件的一段时间后,总线才会被认为再次处于空闲状态,因此,在主机在发出stop信号后不能马上发出start信号

如果连接总线的设备上没有检测star和stop条件的接口设备,那么该设备便需在每个时钟周期内至少采样SDA线两次来判断是否发生了电平切换。

二、数据的传输

IIC介绍(二)之协议层介绍

因为IIC的起始和终止是以当SCL为高电平时SDA进行变化而实现,所以IIC传输数据便只能在SCL线的时钟信号为低电平时才能改变(如上图所示)。


IIC介绍(二)之协议层介绍

       由上图可知,IIC每次传输的字节的数量是没有限制的,但它发送到SDA数据线上的每个字节必须为8位,而且每个字节后必须跟着一个响应位,即在响应的时钟脉冲期间,接收器件SDA线拉低,使之在该时钟脉冲的高电平期间保持稳定的低电平,如下图所示,因为IIC的两根线具有线与特性,故当其中一个设备(主机或从机)输出低阻态时别的设备都能立即接收到。如果从机要完成一些其他功能(如内部中断服务程序)后才能接受或发送下一个完整的数据字节,可以使时钟线SCL保持低电平迫使主机进入等待状态。当从机准备好接收下一数据字节并释放时钟线SCL后,数据传输继续。

三、数据传输中的响应

IIC介绍(二)之协议层介绍

      IIC数据传输必须带响应。响应的时钟脉冲由主机产生。在响应的时钟脉冲期间,发送器释放SDA线(即输出高阻态)。与之对应的,在响应的时钟脉冲期间,接收器须将SDA线拉低,使得其在该时钟脉冲的高电平期间保持稳定的低电平(即输出低阻态)。

四、数据传输的具体形式

IIC介绍(二)之协议层介绍

IIC介绍(二)之协议层介绍

      上图所示分别为IIC写和读的两种报文格式,将其表述如下:

      首先是发送起始信号(即在SCL高电平时将SDA的电平由高变为低);

      然后发送从机地址,这里的从机地址为7位,之后的第8为表示数据的传输方向(R/W)-‘0’表示发送(写),‘1’表示请求数据(读);

      之后会从从机处获得响应信号,然后数据根据所请求的传输方向进行传输,并由接收方发送响应信号;

      最后由主机产生停止位的信号来终止数据的传输。

    五、IIC的寻址

IIC介绍(二)之协议层介绍

      IIC上从机的选择是由起始条件后的第一个字节决定,该字节的头7位是从机地址,最低位(LSB)是第8位(如上图所示),它决定了报文的方向,若为‘0’则表示数据由主机传输到被选中的从机,若为‘1’则表示数据由从机传输到主机。

IIC介绍(二)之协议层介绍      一般而言,为了避免在同一系统中有多个同样的器件,从机的地址分为来个部分:固定和可编程的。比如说:如果器件有4个固定和3个可编程的地址位的话,IIC总线上便可连接8个相同的器件了。

      此外,IIC总线有两组保留的8位地址(0000XXX和1111XXX),其用途见下表:

IIC介绍(二)之协议层介绍

      其中1111 0XXX保留给10位寻址,这里对之进行简要介绍。由上图可知只有4个组合1111 0XX用于10位寻址。

     首先在发送完起始信号后主机会发第一个字节,其头7位为1111 0XX的组合,它最后两位(XX)是10位地址的两个最高位(MSB);而第一个字节的第8位为R/W一般设为‘0’;

    然后第二个字节是10位地址从机剩下的8位地址,此时,算是完成了从机的选定。

   之后如果是从从机读取数据,则第3个字节为1111 0XX(也就是第一个字节),但第8位改为‘1’,紧接着便是从机往主机发送数据,详细过程见下图:

IIC介绍(二)之协议层介绍

IIC介绍(二)之协议层介绍

小结:

      IIC的传输可分为以下具体流程:
      一、在连好设备后,先由主机发送一个开始信号(即在SCL为高电平时将SDA由高电平转为低电平);
      二、然后主机发送第1个字节,其中前7位为从机地址,第8位为读写标志位,‘0’表示写,‘1’表示读;
      三、之后从机在收到主机发送的地址并与自身的地址对应上后发送一个响应信号,即在主机发出一个字节后的下一个时钟脉冲(比如第9个时钟脉冲),在SCL为高电平时保持SDA为低电平;
      四、如果主机发出的是写地址(即第8位为‘0’),则主机发出一个字节数据,再收到从机响应后再继续发,如此重复。
             与之类似的,如果主机发出的是读地址(即第8位为‘1’),则从机发出一个字节数据,再收到主机响应后再继续发。
      五、在数据传输完成后,主机发出一个终止信号,即在SCL为高电平时将SDA由低电平转为高电平。

PS:由于IIC的数据只能在SCL为低电平时进行数据变化,故其时序限制便比较麻烦,毕竟IIC本身的速度不快,如果SCL低电平的时间长了,会影响数据的传输速度,如果SCL低电平的时间短了,会影响数据的变化,可能导致数据变化的不及时,一般而言,用软件模拟IIC需要考虑到这类情况,如果MCU已集成了IIC控制器的功能,那么这类情况不用考虑。