AVR的TWI接口是面向字节和基于中断的。所有的总线事件,如接收到一个字节或发送了一个START信号等,都会产生一个TWI中断。由于TWI接口是基于中断的,因此TWI接口在字节发送和接收过程中,不需要应用程序的干预。TWCR寄存器的TWI中断允许TWIE位和SREG寄存器的全局中断允许位一起决定了应用程序是否响应TWINT标志位产生的中断请求。如果TWIE被清零,应用程序只能采用轮询TWINT标志位的方法来检测TWI总线状态。
当TWINT标志位置“1”时,表示TWI接口完成了当前的操作,等待应用程序的响应。在这种情况下,TWI状态寄存器TWSR包含了表明当前TWI总线状态的值。应用程序可以读取TWCR的状态码,判别此时的状态是否正确,并通过设置TWCR与TWDR寄存器,决定在下一个TWI总线周期TWI接口应该如何工作。
典型数据传输中应用程序与TWI的接口过程如下:
1)TWI传输的第一步是发送START信号。通过对TWCR写入特定值,指示TWI硬件发送START信号。写入的值将在后面说明。在写入值时TWINT位要置位,这非常重要。给TWINT写“1”清除此标志。TWCR寄存器的TWINT置位期间,TWI不会启动任何操作。一旦TWINT清零,TWI由START信号启动数据传输。
2)START信号被发送后,TWCR寄存器的TWINT标志位置位,TWCR更新为新的状态码,表示START信号成功发送。
3)应用程序应检验TWSR,确定START信号已成功发送。如果TWSR显示为其他,应用程序可以执行一些指定操作,比如调用错误处理程序。如果状态码与预期一致,应用程序必须将SLA+W载入TWDR。TWDR可同时在地址与数据中使用。TWDR载入SLA+W后,TWCR必须写入特定值指示TWI硬件发送SLA+W信号。写入的值将在后面说明。在写入值时TWINT位要置位,这非常重要。给TWINT写“1”清除此标志。TWCR寄存器的TWINT置位期间TWI不会启动任何操作。一旦TWINT清零,TWI启动地址包的传送。
4)地址包发送后,TWCR寄存器的TWINT标志位置位,TWDR更新为新的状态码,表示地址包成功发送。状态代码还会反映从机是否响应包。
5)应用程序应检验TWSR,确定地址包已成功发送、ACK为期望值。如果TWSR显示为其他,应用程序可能执行一些指定操作,比如调用错误处理程序。如果状态码与预期一致,应用程序必须将数据包载入TWDR。随后,TWCR必须写入特定值指示TWI硬件发送TWDR中的数据包。写入的值将在后面说明。在写入值时TWINT位要置位,这非常重要。TWCR寄存器中的TWINT置位期间TWI不会启动任何操作。一旦TWINT清零,TWI启动数据包的传输。
6)数据包发送后,TWCR寄存器的TWINT标志位置位,TWSR更新为新的状态码,表示数据包成功发送。状态代码还会反映从机是否响应包。(www.xing528.com)
7)应用程序应检验TWSR,确定地址包已成功发送、ACK为期望值。如果TWSR显示为其他,应用程序可能执行一些指定操作,比如调用错误处理程序。如果状态码与预期一致,TWCR必须写入特定值,指示TWI硬件发送STOP信号。写入的值将在后面说明。在写入值时TWINT位要置位,这非常重要。给TWINT写“1”清除此标志。TWCR寄存器中的TWINT置位期间TWI不会启动任何操作。一旦TWINT清零,TWI启动STOP信号的传送。注意TWINT在STOP状态发送后不会置位。
TWI数据传输过程中的规则总结如下:
●当TWI完成一次操作并等待反馈时,TWINT标志置位。直到TWINT清零,时钟线SCL才会拉低。
●TWINT标志置位时,用户必须用与下一个TWI总线周期相关的值更新TWI寄存器。例如,TWDR寄存器必须载入下一个总线周期中要发送的值。
●当所有的TWI寄存器得到更新,而且其他挂起的应用程序也已经结束,TWCR被写入数据。写TWCR时,TWINT位应置位。对TWINT写“1”清除此标志。TWI将开始
执行由TWCR设定的操作。
下面给出了使用TWI的汇编与C语言例程。
(续)
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。