在检查 atmega 32 的状态代码时,使用 while 循环或 if 语句哪个更好?

问题描述 投票:0回答:1

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

例如,如果我想检查从从机发送到主机的数据字节是否已被从机接收到,我们必须在从机代码中使用

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

我也有点困惑如果 TWI 进程失败会发生什么,是从属 CPU 不会执行其他任务。

注意,atmega 32数据表上的状态码

0xB8
表示一个数据字节已经从从机成功传输到主机,从机已经收到主机的确认,状态码由TWI硬件加载在 TWI 状态寄存器中。

i2c atmega
1个回答
0
投票

以上问题没有简单的答案。首先:是的,您应该等待设备准备就绪,所以

while()
是所需的选项。除非你的
if()
有一些有意义的
else {}

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

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

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

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

谷歌搜索“非阻塞 i2c Arduino”或“while 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
    }
© www.soinside.com 2019 - 2024. All rights reserved.