字节格式

发送到SDA线上的每个字节必须是8位.每次传输的字节数量是不受限制的.每个字节后必须跟着一个ACK应答位.数据从最高有效位(MSB)开始传输.如果从机要执行一些功能后才能接收或者发送新的完整数据,比如说服务一个内部中断,那么它可以将时钟线SCL拉低来强制使主机进入wait状态.当从机准备好新的字节数据传输时,释放时钟线SCL,数据传输便继续进行.

(3)I2C总线的字节格式,时钟同步和仲裁-LMLPHP

ACK和NACK

每个字节后都有ACK发生.ACK应答位允许接收器通知发送器字节成功接收了下一个字节可以发送了.主机产生所有的时钟脉冲,包括应答位的第9个时钟脉冲.

ACK应答信号是如下定义的:在ACK的第9个时钟脉冲中发送器释放SDA线,所以接收器可以将SDA拉低,使得在这个时钟脉冲的高电平期间保证SDA是低电平.建立和保持时间也应该计算在内.

当在第9个时钟脉冲期间SDA仍然是高,这时定义为NACK信号.这时主机可以产生一个终止条件来终止传输,或者一个重复的开始条件来开始一个新的传输.这里有5中情况导致NACK的产生:

1.总线当前的传输地址上没有接收器,所以没有设备用ACK来响应.

2.因为接收者正在处理一些实时的功能,尚未准备与主机的通信,所以接收者不能收发.

3.在传输期间,接收者收到不能识别的数据或者命令.

4.在传输期间,接收者无法接收更多的数据字节.

5.主-接收器要通知从-发送器传输的结束.

时钟同步

在空闲总线上两个主机可以同时开始传输,所以必须要有一个方法来决定哪个主机来控制总线并完成其数据传输.这个方法就是时钟同步和仲裁.在单主机系统中,时钟同步和仲裁不需要了.

时钟同步通过使用I2C接口与SCL线的线与连接实现.意味着SCL线从高到低期间会引起主机开始计算它的低电平周期,一旦主机时钟变低,它会保持SCL线处于这种状态直到时钟到达高电平.然而,如果另一个时钟依旧是低电平,时钟的从低到高的变化并不会改变SCL线的状态.SCL拉低的时间由最长的低电平周期决定.短一些的低电平周期的主机在这时进入HIGH wait-state.

(3)I2C总线的字节格式,时钟同步和仲裁-LMLPHP

当所有的主机的低电平周期都结束了,时钟线才回到高电平.这时主机时钟和SCL的状态一致,所有的主机开始计数他们的高电平周期.第一个结束高电平的主机将SCL线重新拉低.

这样的话,同步的SCL时钟的低电平周期由所有主机中最长的低电平周期决定,高电平周期由最短的高电平周期决定.

仲裁

仲裁和同步一样,都是在系统中多于一个主机条件下协议要求的一部分.从机不参与仲裁处理.只有当总线空闲时,主机才可以开始一个传输.两个主机可能在开始条件规定的最小保持时间(tHD;SDA)内产生一个开始条件,结果总线上产生一个有效的开始条件.这个时候就需要仲裁来决定哪个主机完成它的传输.

仲裁处理是逐个bit进行的.在每个bit,当SCL为高,每个主机都check一下来看看SDA的电平是否和它发送的电平吻合.这个过程可能会持续很多个bit.只要传输是同一的,那么两个主机可以无误的完成完整的传输.当一个主机试着发送高,但是检测到SDA为低,那么这个主机知道自己失去仲裁然后关掉自己的SDA输出.另外的主机就会去完成它的传输.

在仲裁处理过程中没有信息丢失.失去仲裁的主机在它失去仲裁的字节末尾处产生时钟脉冲,当总线空闲时必须重启它的传输.

如果一个主机包含从机的功能,当它在寻址阶段丢失仲裁,那么赢得仲裁的主机可能会寻址它.丢失仲裁的主机必须立即切换到它的从模式.

下图显示了两个主机的仲裁处理.在主机产生的DATA1和SDA线的实际电平的值出现不同时,DATA1的输出就关掉了.主机1失去了仲裁.赢得仲裁的主机2的传输数据不受影响.

(3)I2C总线的字节格式,时钟同步和仲裁-LMLPHP

因为I2C总线只是仅由地址来控制,数据只由赢得仲裁的主机发送,这里没有最重要的主机,在总线上也没有优先级顺序.

在仲裁处理正在进行的时候,一个主机发送重复的开始条件或者是终止条件而另一个主机仍然在发送数据,那么这时候有一个未定的状态.换句话说,下面的条件下会出现这种情况:

主机1发送重复的开始条件,主机2发送一个数据位

主机1发送终止条件,主机2发送一个数据位

主机1发送重复的开始条件,主机2发送终止条件

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-08/67658p3.htm

04-28 08:21