我在一个描述两个微控制器atmega 32使用TWI (i2c)连接的项目的文档中看到,完成工作后检查TWI状态码的更好方法是使用while循环,而不是if语句,因为CPU时钟速度远远高于TWI硬件时钟速度。
例如,如果我想检查从从服务器发送到主机的数据字节和从主接收的确认是否已由从服务器接收,则必须在从代码中使用
while((TWSR & 0xF8) != 0xB8)而不是if ((TWSR & 0xF8) != 0xB8)。另外,如果TWI进程失败,从CPU将不会执行其他任务,我会感到有点困惑。
注意,atmega 32数据表上的状态码0xB8表示数据字节已成功地从从发送到主,从从接收到主的确认,状态码由TWI硬件加载在TWI状态寄存器中。
发布于 2017-11-21 16:25:53
以上问题没有简单的答案。首先:是的,您应该等待设备准备就绪,所以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
}https://stackoverflow.com/questions/41314002
复制相似问题