在检查atmega 32的状态代码时,使用while循环或if语句有什么好处?

时间:2016-12-24 14:13:25

标签: i2c atmega

我已经阅读了项目的一部分文档,其中描述了使用 TWI(i2c)连接两个微控制器 atmega 32 ,这是检查状态代码的更好方法TWI完成其工作后,将数据从从机发送到主机,是使用while循环而不是if语句,因为CPU时钟速度远高于TWI硬件时钟速度。

例如,如果我想检查从设备是否已经从从设备发送到主设备并从主设备确认的数据字节,则必须使用从设备代码

  • while((TWSR & 0xF8) != 0xB8)代替
  • if ((TWSR & 0xF8) != 0xB8)。

如果TWI进程失败,从属CPU将不会执行其他任务,我也会感到困惑。

请注意,atmega 32数据表上的状态代码0xB8表示数据字节已成功从从机传输到主机,并且从机已接收到主机的确认,并且状态代码已加载通过TWI状态寄存器中的TWI硬件。

1 个答案:

答案 0 :(得分:0)

上述问题没有简单的答案。首先:是的,你应该等待设备准备好,所以while()是你想要的选择。除非你的if()有一些其他有意义的东西。

但是:实际上这会阻止设备等待I2C准备好的时间,并且在一些不那么罕见的情况下会导致设备完全锁定。

即使是Atmel和Arduino团队的内置twi / wire / i2c库也存在问题。如果没有收到正确的确认,他们可以挂起设备。原来的twi.h代码:

while ((TWCR & _BV(TWINT)) == 0) ; /* wait for transmission */

经常在这个循环中永远挂起。

谷歌非阻止i2c arduino'或者'而TWCR I2C问题'你会发现很多关于此的讨论。大多数解决方案依赖while()但有一些超时。

timeout = 123456567;
while (((TWCR & _BV(TWINT) == 0) & (timeout!=0))
{
   timeout--;
}; /* wait for transmission or timeout */
if(timeout==0)
{
//there was timeout
}
else
{
//process data
}