I2C总线串行串行输入输出结构
本文章以8XC552(飞利浦的一款微控制器)的IIC总线串行串行输入输出结构为例,深入理解IIC总线协议:
IIC总线的串行输入输出结构保证了IIC总线的数据寄存器中能保存总线上的最新数据。SDAT和ACK组成一个9为的移位寄存器,它组成一个环状结构。串行输出的同时不断采入总线上的数据。ACK标志位由总线控制,并可以由CPU存取(存入1对应的是非应答,存入0对应的应答)。在SCL线上的时钟脉冲的上升沿,串行数据通过ACK标志位存入SDAT,串行数据在SCL时钟脉冲下降沿沿BSD7移出当一个字节数据移入SADT后,SDAT中的数据有效,控制逻辑在第9个时钟脉冲周期送出应答位。
为什么IIC总线进行数据发送时,时钟信号为高电平期间,数据线上的数据必须保持数据稳定???这是因为会在高电平期间采集总线上的数据,如果此时总线上的数据不稳定,会导致采集的数据和发送的数据不一致,从而关闭发送(类似仲裁失败)。协议规定只有在时钟信号为低电平期间,数据线上的高电平或低电平才允许变化,这是因为BSD7中的数据是在时钟下降沿发出的,且不会在时钟脉冲低电平期间采集总线上的数据。
在CPU对SDAT写入时,SDAT7装入BSD7,这是向SDA线上发送的第一位数据,9个时钟脉冲后SADT中的8位数据发送到SAD线上,应答位出现在ACK中,这样发送到总线上的数据又返回到SDAT中。
SDA寄存器,包含个待发送的数据或一个刚收到的数据字节,发送时,数据总是从右向左移位。数据移出时,总线上的数据同时移入,移位寄存器的这种结构保证了总线竞争失败时数据不会丢失。它以并行的方式与内部总线相连,以串行方式与SDA相连。发送数据时,由内部总线装入到SDAT中,发送时,数据以串行从串行通道返回SDAT中。接收时,装入新接收的SDA线上的数据。
查看了很多的资料,都是这样描述数据位的传输: 在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。只有在SCL为低电平期间,才允许SDA上的电平改变状态。尤其对“进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。只有在SCL为低电平期间,才允许SDA上的电平改变状态”这句话不甚理解。
带着这个问题,我在图书馆找了好几天的资料。终于弄懂了。
每bit数据定义
下面再来看一下IIC总线时序的具体定义:
其中,是数据建立的时间;是数据保持时间。上升沿将数据送到SDA线上,是建立时间。高电平期间数据稳定,等待下降沿读取SDA线上的数据。下降沿从SDA线上读取数据,下降沿之后的是保持时间。
下面是发送数据的时序变化具体分析。
再来看一下接收数据时的时序的变化。