2017-11-15 8 views
0

TWIマスターからバスへの接続を初期化しようとすると、何らかのエラーが発生します。開始条件は送信されますが、プロセッサはバスにスレーブ・アドレスを送信し始める無限ループ・ビーバーで待機します。TWI on ATMega 2560待ち時間無限ループ

私はまた、バス上の信号を分析しました。その結果、クロックが動作していますが、バスにはデータが送信されません。

プロセッサ待ち時間は、矢印の付いた行にあります。

我々は

void i2c_master_init() { 
     TWBR = (uint8_t)TWBR_val; 
    } 

    void i2c_master_stop() { 
     TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); 
    } 

    uint8_t i2c_master_start(uint8_t address) { 

     TWCR = 0; 
     TWCR |= (1<<TWSTA); 
     TWCR |= (1<<TWEN); 
     TWCR |= (1<<TWINT); 
     while(!(TWCR & (1<<TWINT))); <-- 

     [...] 

    } 

は現在、私は、コードと間違って何が起こっているのか、分からない...起動し、バスを初期化するために、次のコードを使用します。それとも別のことをやっているのですか?誰でも助けてくれますか?

ありがとうございます。

答えて

1

私のベンチでハードウェアなしで私のベスト推測では、TWIコントロールレジストリにすべてのフラグを一度に設定する必要があります。TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)。一方、3つの別々の動作(複数のクロックサイクル)で1つずつ設定しますが、データシートでは暗黙のうちにを一緒に設定する必要があります。も参照してください。

+0

お手伝いいただきありがとうございますが、現在別の問題が見つかりました。クライアント(スレーブ)は16MHzで動作し、ホスト(マスタ)は8MHzで動作します。これも問題です。したがって、2つのシステムは通信できません。 – FoxPixel

+0

しかし、私たちは今問題を発見しただけです。 – FoxPixel

+0

データシートの章24.5.2に示すように、TWIはCPUクロックについて話していますが、TWIは「TWBR」と「TWPS」レジスタを構成するバス速度(最大400kHz)を設定できます。計算方法については[ライブラリ実装](https://github.com/maximecb/AVR-Alarm-Clock/blob/master/i2cmaster.c)をご覧ください。 – andy

関連する問題