使用AVR TWI接口的问题

时间:2013-02-13 12:43:51

标签: arduino avr i2c atmel atmega

我正在尝试使用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));
}

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

(所有其他功能的实现方式与数据表示例相同。)

1 个答案:

答案 0 :(得分:0)

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

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

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

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