I2C总线时序与数据传输

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

16.1.2 I2C总线时序与数据传输

当I2C总线处在空闲状态时,因为各设备都是开漏输出,所以在上拉电阻的作用下,SDA和SCL均为高电平。I2C总线上启动一次数据传输过程的标志为主机发送的起始信号,起始信号的作用是通知从机准备接收数据。当数据传输结束时,主机需要发送停止信号,通知从机停止接收。因此,一次数据传输的整个过程由从起始信号开始,到停止信号结束。同时这两个信号也是启动和关闭I“C设备的信号。图16—2是I2C总线时序示意图,图中最左边和最右边给出了起始信号和停止信号的时序条件。

>起始信号时序:当SCL为高电平时,SDA由高电平跳变到低电平。

>停止信号时序:当SCL为高电平时,SDA由低电平跳变到高电平。

I2C总线规定,当SCL为高电平时,SDA的电平必须保持稳定不变的状态,只有当SCL 处在低电平时,才可以改变SDA的电平值,但起始信号和停止信号是特例。因此,当SCL 处于高电平时,SDA的任何跳变都会被识别成为一个起始信号或停止信号。

因此在I2C总线上的数据传输过程中,数据信号线5DA的变化只能发生在SCL为低电平的期间内。从图16—2中间部分的时序中.可以清楚地看到这一点。

在I2C总线的数据传输过程中,发送到SDA信号线上的数据以字节为单位,每个字节必须为8位,而且是高位在前,低位在后,每次发送数据的字节数量不受限制。

但在这个数据传输过程中需要着重强调的是,当发送方发送完每一字节后,都必须等待接收方返回一个应答响应信号ACK,如图16—3所示。

响应信号ACK宽度为1位,紧跟在8个数据位后面,所以发送1字节的数据需要9个SCL时钟脉冲。响应时钟脉冲也是由主机产生的,主机在响应时钟脉冲期间释放SDA线,使其处在高电平(见图16—3上面的信号)。而在响应时钟脉冲期间,接收方需要将SDA拉低,使SDA在响应时钟脉冲高电平期间保持稳定的低电平(见图16—3中间的信号)。

实际上,图16—3中上面和中间的两个信号应该“线与”后呈现在SDA上的。由于在这个过程中存在比较复杂的转换过程,所以将它们分开便于在下面做更仔细的分析。

>主机控制驱动SCL,发送9个时钟脉冲,前8个为传输数据所用,第9个为响应时钟脉冲(见图16—3下面的信号)。

>在前8个时钟脉冲期间,发送方作为发送器,控制SI)A输出8位数据到接收方。

>在前8个时钟脉冲期间,接收方作为接收器,处在输入的状态下,检测接收SDA上的6位数据。

>在第9个时钟脉冲期间,发送方释放SDA,此时发送方由先前的发送器转换成为接收器。

>在第9个时钟脉冲期间,接收方则从先前的接收器转换成为发送竭控制SDA,输出ACK信号。

>在第9个时钟脉冲期间,发送方作为接收器,处在输入的状态下,检测接收SDA上酌ACK信号。

>最后,发送和接收双方都依据应答信号的状态(ACK/nACK),各自确定下一步的角色转换,以及如何动作。

在上面的分析过程中,使用了发送方和接收方来表示通信的双方,而没有使用主机和从机的概念,这是因为数据的发送可以是主机,也可以是从机。因此,不管是主机作为接收方,还是从机为接收方,在响应时钟脉冲期间都必须回送应答信号。

应答信号的状态有2个:低电平用ACK表示,代表有应答;高电平用nACK表示,代表天应答。应答信号在I2C总线的数据传输过程中起着非常重要的作用,它将决定总线及连接在总线上设备下一步的状态和动作。一旦在应答信号上发生错误,例如接收方不按规定返回或返回不正确的应答信号,以及发送方对应答信号的误判,都将造成总线通信的失败。

16.1.3 I2C总线寻址与通信过程

前面已经介绍过I2C总线是支持多机通信的数据总线,每一个连接在总线上的从机设备或器件都有一个唯一独立的地址,以便于主机寻访。

I2C总线上的数据通信过程是由主机发起的,以主机控制总线,发出起始信号作为开始。在发送起始信号后,主机将发送一个用于选择从机设备的地址字节,以寻址总线中的某一个从机设备,通知其参与同主机之间的数据通信。地址字节的格式如下:

地址字节的高7位数据是主机呼叫的从机地址,第8位用于标示紧接下来的数据传输方向:“0”表示要从机准备接收主机下发数据(主机发送/从机接收);而“l,,则表示主机向从机读取数据(主机接收/从机发送)。

当主机发出地址字节后,总线上所有的从机都将起始信号后的7位地址与自己的地址进行比较:如果相同,则该从机确认自己被主机寻址;而那些本机地址与主机下发的寻呼地址不匹配的从机,则继续保持在检测起始信号的状态,等待下一个起始信号的到来。

被主机寻址的从机,必须在第9个SCK时钟脉冲期间拉低SDA,给出ACK回应,以通知主机寻址成功。然后,从机将根据地址字节中第8他的指示,将自己转换成相应的角色(0—从机接收器;1—从机发送器),参与接下来的数据传输过程。

图16—4所示为在I2C总线上一次数据传输的示例,它实现了简单的操作:主机向从机读取1字节。图中描述了整个数据传输的全部过程,给出了I2C总线上的时序变化,SDA 上的数据情况、以及发送、接收双方相互转换与控制SDA的过程。

>主机控制SDA。在I2C总线上产生起始信号,同时控制SCL,发送时钟脉冲。在整个传输过程中,SCL都是由主机控制的。

>主机发送器发送地址字节。地址字节的第8位为“1”。表示准备向从机读取数据。主机在字节发送完成后,放弃对5DA的控制,进入接收检测ACK的状态。

>所有从机在起始信号后为从机接收器,接收地址字节,与自己地址比对。

>被寻址的从机在第9个SCL时钟脉冲期间控制SDA.将其拉低,给出ACK应答。

>主机检测到从机的ACK应答后、转换成主机接收器。准备接收从机发出的数据。

>从机则根据第8位“1”的设定,在第2个字节的8个时钟脉冲期间作为从机发送器控制SDA。发送1字节的数据。发送完成后放弃对SDA的控制,进入接收检测ACK的状态。

>在第2个字节的8个传输时钟脉冲期间,主机接收器接收从机发出的数据。当接收到d0位后,主机控制SDA,将其拉低,给出ACK应答。

>从机接收检测主机的ACK应答c如果是ACK,则难备发送1个新的字节数据;如果是nACK,则转入检测下一个起始信号的状态。

>在这个示例中,主机收到l字节数据后,转成主机发送器控制SDA,在发出ACK应答信号后,马上发出停止信号,通知本次数据传输结束。

>从机检测到停止信号,转入检测下一个起始信号的状态。

以上介绍了I2C总线基本的特性、操作时序和通信规范,这些概念对了解、掌握、应用I2C总线尤为重要。这是因为I2C总线在硬件连接上非常简单,只要将所有器件和设备的SDA、SCL并在一起就可以了,但复杂的通信规范的实现,往往需要软件的控制。尽管A VR 的TWI接口在硬件层面上实现了更多的I2C底层协议和数据传送与接收的功能,但对于什么时间发出起始信号、停止信号,如何返回应答信号,以及主/从机之间的发送/接收器的相互转换,还是需要程序员根据实际情况,编写相应的、正确的系统程序才能实现。

关于I2C总线更多的特性,例如多主机的总线竞争与仲裁等,本书将不做介绍,有兴趣的读者可以通过本书所附光盘中的参考资料《I2C总线规范》进一步地深入学习。

相关文档
最新文档