首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在检查atmega 32的状态码时,有什么更好的方法是使用while循环或if语句?

在检查atmega 32的状态码时,有什么更好的方法是使用while循环或if语句?
EN

Stack Overflow用户
提问于 2016-12-24 14:13:24
回答 1查看 263关注 0票数 0

我在一个描述两个微控制器atmega 32使用TWI (i2c)连接的项目的文档中看到,完成工作后检查TWI状态码的更好方法是使用while循环,而不是if语句,因为CPU时钟速度远远高于TWI硬件时钟速度。

例如,如果我想检查从从服务器发送到主机的数据字节和从主接收的确认是否已由从服务器接收,则必须在从代码中使用

  • while((TWSR & 0xF8) != 0xB8)而不是
  • if ((TWSR & 0xF8) != 0xB8)。

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

注意,atmega 32数据表上的状态码0xB8表示数据字节已成功地从从发送到主,从从接收到主的确认,状态码由TWI硬件加载在TWI状态寄存器中。

EN

回答 1

Stack Overflow用户

发布于 2017-11-21 16:25:53

以上问题没有简单的答案。首先:是的,您应该等待设备准备就绪,所以while()是需要的选项。除非您的if()有其他的{},这是有意义的。

但是:实际上,这将阻止设备在等待I2C准备就绪的时候使用,并且在一些不太罕见的情况下可以导致设备的完全锁定。

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

代码语言:javascript
复制
while ((TWCR & _BV(TWINT)) == 0) ; /* wait for transmission */

经常挂在这个循环中。

谷歌的‘非阻塞i2c arduino’或‘而TWCR I2C问题’,你会发现很多关于这方面的讨论。大多数解决方案依赖于while(),但需要一些超时。

代码语言:javascript
复制
timeout = 123456567;
while (((TWCR & _BV(TWINT) == 0) & (timeout!=0))
{
   timeout--;
}; /* wait for transmission or timeout */
if(timeout==0)
{
//there was timeout
}
else
{
//process data
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41314002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档