0

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));
}

私は何か間違ったことをした ?どうすればこれを解決できますか?

(他のすべての機能は、データシートの例のように簡単に実装されます。)

4

1 に答える 1

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

正しく見えません。TWSTOフラグは停止を示しており、正しく書き込むと停止します。ただし、1のままであるため、無限ループが発生します。どちらかといえば、あなたは

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

ただし、コード例にはループがまったくありません。

于 2013-02-13T17:00:39.810 に答える