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));
}
私は何か間違ったことをした ?どうすればこれを解決できますか?
(他のすべての機能は、データシートの例のように簡単に実装されます。)