【问题标题】:Issue with using AVR TWI interface使用 AVR TWI 接口的问题
【发布时间】:2013-02-13 12:43:51
【问题描述】:

我正在尝试使用 atmega2560 访问 HMC5883L 模块。我编写了一个类 (I2C),其中包含 I2C 通信所必需的基本方法。

首先,我将解释问题。这就是我所做的。

int main(){
    I2C i2c;  //an object with basic I2C communication methods

    i2c.init();
    i2c.start();
    i2c.sendSLAW();
    ...
    i2c.write(...);
    ...  //configure registers, CRA, CRB, MR ...
    i2c.stop();
    while (1)
    {
        i2c.start();        
        i2c.sendSLAR();     
            .... //read x,y,z register values
        i2c.stop();     
            .... //say, display x,y,z readings
        _delay_ms(500);
    }
}

(考虑术语有它们的普通含义。SLAW = SLA+W(从地址+写入)...)

一切都很顺利,直到进入 while 循环。在循环中,它似乎被困在i2c.stop()

i2c.stop()是这样实现的;

void I2C::I2C_stop(){
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
    while (TWCR & (1<<TWSTO));
}

我做错了吗?我该如何解决这个问题?

(所有其他功能都按照数据表示例简单实现。)

【问题讨论】:

    标签: arduino avr i2c atmel atmega


    【解决方案1】:
    while (TWCR & (1<<TWSTO));
    

    看起来不对。 TWSTO 标志表示停止,并且您正确地写入它以停止。但它保持为 1,这会产生一个无限循环。如果有的话,你会想要的

    while !(TWCR & (1<<TWSTO));
    

    但代码示例根本没有循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2017-03-16
      • 1970-01-01
      • 2011-11-12
      相关资源
      最近更新 更多