×
嵌入式 > 嵌入式开发 > 详情

TWI接口

发布时间:2020-08-07 发布时间:
|
在AVR系列单片机中内嵌有一个TWI(Two-wire Serial Interface)接口,它实际上就是IIC总线接口。IIC是一种多向控制总线,它是由PHILIPS公司在二十世纪八十年代初设计出来的,利用该总线可实现多主机系统所需的裁决和高低速设备同步等功能,是一种高性能的串行总线。IIC总线的连接方式如下图所示。它只用两根双向传输线就可以将128个不同的设备互连到一起。这两根线一根是时钟线SCL,一根是数据SDA。外部硬件只需要两个上拉电阻,每根线上一个。所有连接到总线上的设备都有自己的地址。

 

总线的速度有两个不同的规范,一种的速度低于100kHz,而另外一种的速度高达400kHz,总线间的电容不能大于400pF。所有TWI兼容的器件的总线驱动都应该是漏极开路或集电极开路的结构,这样就可以实现线与的功能。TWI器件在输出为0时,TWI总线会产生低电平。当所有的TWI器件输出为三态时,总线会输出高电平,如果接有上拉电阻电压将会被拉高。

TWI总线上传输的数据是通过在时钟线(SCL)高电平期间对应的数据线(SDA)上的电平来判别的。可通过下图来描述。

在上图中,当SCL拉高期间对应的SDA的电平,如果是高则这位数据就是1,反之则是0。只有在SCL为低电平期间,SDA才可以更新下一位的数据。TWI总线上数据的传送就是通过SCL为高时对应到的SDA的值来构成的。显然,SCL的频率决定了数据传送的速度。

除了传送的数据以外,在每一帧数据传送之前,还会有一个启动信号,以通知从机准备接收数据。在数据传送结束之后,也会有一个停止信号,以通知从机数据传输结束。启动信号是这样来定义的,在SCL为高电平期间,若对应的SDA线上有一个由高变低的电平下跳沿,则表示这是一个启动信号。同样,停止信号是这样定义的,在SCL为高电平期间,若对应的SDA线上有一个由低变高的电平上跳沿,则表示这是一个停止信号。为了形成启动或停止信号,必须在判别该信号的SCL拉高之前做好电平准备,比如要形成一个停止信号,必须在SCL为低电平期间把SDA上的电平拉低,以便在紧跟着后面的SCL高电平期间把SDA的电平拉低,形成一个停止信号。当已经有一个启动信号之后,在没有停止信号出现之前若再次出现启动信号,则表示该信号是一个重新启动信号,它主要用于在主机不放弃总线控制的情况下启动新的传送。上述整个过程可用下图来描述。

通过上述讨论,说明了TWI总线的数据位传送与时钟脉冲是同步的。除了启动与停止状态之外,当时钟线为高电平时,数据线上的电压(不论是高还是低)必须保持稳定,否则有可能被识别成停止信号或重新开始的信号。

下面来看TWI总线是如何寻址的。在启动信号之后紧接着的就是地址帧,所有的地址包均为9位,包括7位地址位、1位READ/WRITE控制位(即方向位,表明是主机写从机还是从机写主机)与1位应答位。如果READ/WRITE为1,则执行读(从机写主机)操作;否则执行写(主机写从机)操作。从机被寻址后,必须在第九个SCL(ACK)周期通过拉低SDA作出应答。发送地址时先发送高位后发送低位,地址字节的MSB(数据的最高位)先被发送,从机地址由用户自行分配,但要避开保留的广播地址(即地址0000000)。地址的传输格式可用下图来描述。

地址发送后,就要发送数据包。所有在TWI总线上传送的数据包为9位长,包括8位数据位及1位应答位。在数据传送中,主机产生时钟及START与STOP状态,而接收器响应接收。应答是由从机在第9个SCL周期拉低SDA实现的。如果接收器在第9个SCL周期使SDA为高,则是发出NACK信号。NACK信号是在接收器在完成了最后数据的接收,或者由于某些原因无法接收更多的数据时,才在收到最后的字节后发出去告知发送器的。数据的传输格式可用下图来描述。
下面来看,如何将地址包和数据包组合为一个完整的传输过程。发送主要由START状态、SLA+R/W、至少一个数据包及STOP状态组成。只有START与STOP状态的空信息是非法的。当主机设定的时钟速度相对于从机太快,或从机需要额外的时间来处理数据时,从机可通过拉低SCL来延长SCL低电平的时间。从机延长SCL低电平的时间不会影响SCL高电平的时间,因为SCL高电平时间是由主机决定的。一个典型的数据传送的过程可用下图来描述。
要注意一点,SLA+R/W与STOP之间传送的字节数由应用程序的协议决定。
下面来看AVR内部的TWI模块,它是由几个子模块组成,其内部结构图如下。

在上图中,位于粗线之中的寄存器可以通过程序进行访问。SCL与SDA为MCU的TWI接口引脚。引脚的输出驱动器包含一个波形斜率限制器以满足TWI的信号规范。引脚的输入部分包括尖峰抑制单元以去除小于50ns的毛刺干扰。当相应的端口被设置为SCL与SDA引脚时,可以使能I/O口内部的上拉电阻,这样可省掉外部的上拉电阻。

当TWI工作于主机模式时,比特率发生器(上图中的Bit Rate Generator部分)控制时钟信号SCL的周期。具体的值由TWI状态寄存器TWSR(上图中的Control Unit部分内)的预分频系数以及比特率寄存器TWBR(上图中的Bit Rate Generator部分内)设定。可通过下面的公式来计算。

式中,TWBR是TWI比特率寄存器的数值,TWPS是TWI状态寄存器预分频的数值。TWI工作在主机模式时,TWBR值应该不小于10。否则主机会在SDA与SCL产生错误输出作为提示信号。

当TWI工作在从机模式时,不需要对比特率或预分频进行设定,但从机的CPU时钟频率必须大于TWI时钟线SCL频率的16倍。

在上图中,还有一个总线接口(上图中的Bus Interface Unit部分)。它包含有数据与地址移位寄存器TWDR,START/STOP控制器和总线仲裁判定硬件电路。TWDR寄存器用于存放发送或接收的数据或地址。除了8位的TWDR外,总线接口单元还有一个寄存器,包含了用于发送或接收应答的(N)ACK。这个(N)ACK寄存器不能由程序直接访问。当接收数据时,它可以通过TWI控制寄存器TWCR来置位或清零;在发送数据时,(N)ACK值由TWCR的设置来决定。START/STOP控制器负责产生和检测TWI总线上的START、REPEATEDSTART与STOP状态。即使在MCU处于休眠状态时,START/STOP控制器仍然能够检测TWI总线上的START/STOP条件,当检测到自己被TWI总线上的主机寻址时,将MCU从休眠状态唤醒,这一功能在节电时非常必要。

接下来是地址匹配单元(上图中的Address Match Unit部分)。地址匹配单元将检测从总线上接收到的地址是否与TWAR寄存器中的7位地址相匹配。如果TWAR寄存器的TWI广播应答识别使能位TWGCE为1,从总线接收到的地址也会与广播地址进行比较。一旦地址匹配成功,控制单元将得到通知以进行正确地响应。TWI可以响应,也可以不响应主机的寻址,这取决于TWCR寄存器的设置。即使MCU处于休眠状态时,地址匹配单元仍可继续工作。一旦主机寻址到这个器件,就可以将MCU从休眠状态唤醒。

最后一个部分是控制单元,它监听TWI总线,并根据TWI控制寄存器TWCR的设置作出相应的响应。当TWI总线上产生需要应用程序干预处理的事件时,TWI中断标志位TWINT置位。一旦TWINT标志位置1,时钟线SCL的电平即被拉低,暂停TWI总线上的数据传输,让用户程序处理事件。在下列状况出现时,TWINT标志位会被置位。

1、在TWI传送完START/REPEATED START信号之后
2、在TWI传送完SLA+R/W数据之后
3、在TWI传送完地址字节之后
4、在TWI总线仲裁失败之后
5、在TWI被主机寻址之后( 广播方式或从机地址匹配)
6、在TWI接收到一个数据字节之后
7、作为从机工作时,TWI接收到STOP或REPEATED START信号之后
8、由于非法的START或STOP信号造成总线错误时



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Recogni:将高端AI芯片推向自动驾驶边缘