TWI可以工作于4个不同的模式:主机发送器(MT)、主机接收器(MR)、从机发送器(ST)及从机接收器(SR)。同一应用程序可以使用几种模式。例如,TWI可用MT模式给TWIEEPROM写入数据,用MR模式从EEPROM读取数据。如果系统中有其他主机存在,它们可能给TWI发送数据,此时就可以用SR模式。应用程序决定采用何种模式。
下面对每种模式进行具体说明。每种模式的状态码在详细说明数据发送的图中进行描述。
这些图包含了如下的缩写:
●S:START状态。
●Rs:REPEATED START状态。
●R:读一个位(SDA为高电平)。
●W:写一个位(SDA为低电平)。
●A:应答位(SDA为低电平)。
●A:无应答位(SDA为高电平)。
●Data:8位数据。
●P:STOP状态。
●SLA:从机地址。
1.主机发送模式
在主机发送模式,主机可以向从机发送数据。为进入主机模式,必须发送START信号。紧接着的地址包格式决定进入MT或MR模式。如果发送SLA+W进入MT模式;如果发送SLA+R则进入MR模式。本节所提到的状态字均假设其预分频位为“0”。
通过在TWCR寄存器中写入下列数值发出START信号。
TWEN必须置位以使能两线接口,TWSTA必须置“1”来发出START信号,且TWINT必须置“1”来对TWINT标志清零。TWI逻辑开始检测串行总线,一旦总线空闲就发送START。接着中断标志TWINT置位,TWSR的状态码为0x08,如表10-9所示。为进入MT模式,必须发送SLA+W。这可通过对TWDR写入SLA+W来实现。完成此操作后软件清零TWINT标志,TWI传输继续进行。这可以通过在TWCR寄存器中写入下述值完成。
表10-9 主机发送模式的状态码
(续)
当SLA+W发送完毕并接收到确认信号,主机的TWINT标志再次置位。此时主机的TWSR状态码可能是0x18、0x20或0x38。对各状态码的正确响应列于表10-9中。SLA+W发送成功后可以开始发送数据包。这通过对TWDR写入数据实现。TWDR只有在TWINT为高时方可写入。否则,访问被忽略,寄存器TWCR的写冲突位TWWC置位。
TWDR更新后,TWINT位应清零来继续传送。这通过在TWCR寄存器中写入下述值完成。
这过程会一直重复下去,直到最后的字节发送完且发送器产生STOP或REPEATED START信号。STOP信号通过在TWCR中写入下述值实现。
REPEATED START信号通过在TWCR中写入下述值实现。
在REPEATED START(状态0x10)后,两线接口可以再次访问相同的从机,或不发送STOP信号来访问新的从机。REPEATED START使得主机可以在不丢失总线控制的条件下在从机、主机发送器及主机接收器模式间进行切换。
2.主机接收模式
在主机接收模式,主机可以从从机接收数据。为进入主机模式,必须发送START信号。紧接着的地址包格式决定进入MT或MR模式。如果发送SLA+W进入MT模式;如果发送SLA+R则进入MR模式。本节所提到的状态字均假设其预分频位为“0”。
通过在TWCR寄存器中写入下列数值发出START信号。
TWEN必须置位以使能两线接口,TWSTA必须置“1”来发出START信号且TWINT必须置“1”来对TWINT标志清零。TWI逻辑开始检测串行总线,一旦总线空闲就发送START。接着中断标志TWINT置位,TWSR的状态码为0x08(见表10-9)。为进入MR模式,必须发送SLA+R。这可通过对TWDR写入SLA+R来实现。完成此操作后软件清零TWINT标志,TWI传输继续进行。这通过在TWCR寄存器中写入下述值完成。
当SLA+R发送完毕并接收到确认信号,主机的TWINT标志再次置位。此时主机的TWSR状态码可能是0x38、0x40或0x48。对各状态码的正确响应列于表10-10。TWDR只有在TWINT为高时才能读收到的数据。这过程会一直重复下去,直到最后的字节接收结束。接收完成后,MR应通过在接收到最后的字节后发送NACK信号。发送器产生STOP或RE-PEATED START信号结束传送。STOP信号通过在TWCR中写入下述值实现。
REPEATED START信号结束传送。STOP信号通过在TWCR中写入下述值实现。
(www.xing528.com)
在REPEATED START(状态0x10)后,两线接口可以再次访问相同的从机,或不发送STOP信号来访问新的从机。REPEATED START使得主机可以在不丢失总线控制的条件下在从机、主机发送器及主机接收器模式间进行切换。
表10-10 主机接收模式的状态码
(续)
3.从机接收模式
在从机接收模式,从机自主机接收数据。本节所提到的状态字均假设其预分频位为“0”。为启动从机接收模式,TWAR与TWCR设置如下。
前7位是主机寻址时从机响应的TWI接口地址。若LSB置位,则TWI接口响应广播地址0x00。否则忽略广播地址。
TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播)时返回确认信息ACK。TWSTA和TWSTO必须清零。
初始化TWAR和TWCR之后,TWI接口即开始等待,直到自己的从机地址(或广播地址,如果TWAR的TWGCE置位的话)出现在主机寻址地址当中,并且数据方向位为0(写)。然后TWINT标志置位,TWSR则包含了相应的状态码。当TWI接口处于主机模式(状态0x68或0x78)并发生仲裁失败时,CPU将进入从机接收模式。
如果在传输过程中TWEA复位,TWI接口在接收到下一个字节后将向SDA返回“无应答”。TWEA复位时TWI接口不再响应自己的从机地址,但是会继续监视总线。一旦TWEA置位就可以恢复地址识别和响应。也就是说,可以利用TWEA暂时将TWI接口从总线中隔离出来。在除空闲模式外的其他休眠模式时,TWI接口的时钟被关闭。若使能了从机接收模式,接口将利用总线时钟继续响应广播地址/从机地址。地址匹配将唤醒CPU。在唤醒期间,TWI接口将保持SCL为低电平,直至TWCINT标志清零。当AVR时钟恢复正常运行后TWI可以接收更多的数据。显然如果AVR设置为长启动时间,时钟线SCL可能会长时间保持低电平,阻塞其他数据的传送。当MCU从这些休眠模式唤醒时,和正常工作模式不同的是,数据寄存器TWDR的数据并不反映总线上出现的最后一个字节。
4.从机发送模式
在从机发送模式,从机可以向主机发送数据。本节所提到的状态字均假设其预分频位为“0”。
为启动从机发送模式,TWAR与TWCR设置如下。
前7位是主机寻址时从机响应的TWI接口地址。若LSB置位,则TWI接口响应广播地址0x00。否则忽略广播地址。
TWEN必须置位以使能TWI接口。TWEA也要置位以便主机寻址到自己(从机地址或广播)时返回确认信息ACK。TWSTA和TWSTO必须清零。初始化TWAR和TWCR之后,TWI接口即开始等待,直到自己的从机地址(或广播地址,如果TWAR的TWGCE置位的话)出现在主机寻址地址当中,并且数据方向位为“1”(读)。然后TWI中断标志置位,TWSR则包含了相应的状态码。当TWI接口处于主机模式(状态0xB0)并发生仲裁失败时,CPU将进入从机发送模式。
如果在传输过程中TWEA复位,TWI接口发送完数据之后进入状态0xC0或0xC8。接口也切换到未寻址从机模式,忽略任何后续总线传输。从而主机接收到的数据全为“1”。如果主机需要附加数据位(通过发送ACK),即使从机已经传送结束,也进入状态0xC8。
TWEA复位时TWI接口不再响应自己的从机地址,但是会继续监视总线。一旦TWEA置位就可以恢复地址识别和响应。也就是说,可以利用TWEA暂时将TWI接口从总线中隔离出来。
在除空闲模式外的其他休眠模式时,TWI接口的时钟被关闭。若使能了从机接收模式,接口将利用总线时钟继续响应广播地址/从机地址。地址匹配将唤醒CPU。在唤醒期间,TWI接口将保持SCL为低电平,直至TWCINT标志清零。当AVR时钟恢复正常运行后可以发送更多的数据。显然如果AVR设置为长启动时间,时钟线SCL可能会长时间保持低电平,阻塞其他数据的传送。
当MCU从这些休眠模式唤醒时,和正常工作模式不同的是,数据寄存器TWDR的数据并不反映总线上出现的最后一个字节。
在某些情况下,为完成期望的工作,必须将几种TWI模式组合起来。例如从串行EEP- ROM读取数据。典型的这种传输包括以下步骤:
1)传输必须启动。
2)必须告诉EEPROM读取的位置。
3)必须完成读操作。
4)传送必须结束。
注意数据可从主机传到从机,反之也可。首先主机必须告诉读从机读取实际的位置,因此需要使用MT模式;然后数据必须由从机读出,需要使用MR模式,但传送方向必须改变。在上述步骤中,主机必须保持对总线的控制,以上各步骤应该自动进行。如果在多主机系统中违反这一规则,即在第二步与第三步之间其他主机改变EEPROM中的数据指针,则主机读取的数据位置是错误的。传送方向改变是通过在发送地址字节与接收数据之间发送REPEATED START信号来实现的。在发送REPEATED START信号后,主机继续保持总线的控制权。图10-22给出传送的流程图。
图10-22 TWI模式联合访问串行EEPROM
5.多主机系统和仲裁
如果有多个主机连接在同一总线上,它们中的一个或多个也许会同时开始一个数据传送。TWI协议确保在这种情况下,通过一个仲裁过程,允许其中的一个主机进行传送而不会丢失数据。
有几种不同的情况会产生总线仲裁过程:
●两个或更多的主机同时与一个从机进行通信。在这种情况下,无论主机或从机都不知道有总线的竞争。
●两个或更多的主机同时对同一个从机进行不同的数据或方向的访问。在这种情况下,会在Read/Write位或数据间发生仲裁。主机试图在SDA线上输出一个高电平时,如果其他主机已经输出“0”,则该主机在总线仲裁中失败。失败的主机将转换成未被寻址的从机模式,或等待总线空闲后发送一个新的START信号,这由应用程序决定。
●两个或更多的主机访问不同的从机。在这种情况下,总线仲裁在SLA发生。主机试图在SDA线上输出一个高电平时,如有其他主机已经输出“0”,则该主机将在总线仲裁中失败。在SLA总线仲裁失败的主机将切换到从机模式,并检查自己是否被获得总线控制权的主机寻址。如果被寻址,它将进入SR或ST模式,这取决于SLA的Read/Write位的值。如果它未被寻址,将转换到未被寻址的从机模式或等待总线空闲,发送一个新的START信号,这由应用程序决定。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。