1

Atmel Xmega256A3でスリープから復帰した後、TWI/I2Cでいくつかの問題が発生しました。TWI / I2Cの詳細を掘り下げる代わりに、AVR1308アプリケーションノートに添付されたAtmelから提供されたtwi_master_driverを使用することにしました。

問題は、スリープから復帰した直後に1つまたはいくつかのTWIトランザクションが失敗したことです。XMegaに接続されたI2Cバスには、いくつかのポテンショメータ、温度計、RTCがあります。XMegaはバス上の唯一のマスターとして機能します。

AVRLIBCにあるスリープ関数を使用します。

{code for turning of VCC to all I2C connected devices}
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
{code for turning on VCC to all I2C connected devices}

ピンを高く設定するRTCによってスリープから復帰したXMega。XMegaがスリープから復帰した後、ポテンショメータの1つに値を設定したいのですが、これは失敗します。何らかの理由で、TWIトランザクションの結果は、最初のトランザクションではTWIM_RESULT_OKではなくTWIM_RESULT_NACK_RECEIVEDになります。その後、すべてが再び機能するようです。

ここで何かを逃したことがありますか?XMega、スリープ、TWIに既知の問題はありますか?スリープから復帰した後、フラグをクリアするTWIをリセットする必要がありますか?

よろしくフレドリック

4

1 に答える 1

2

I2C / TWIには、トランザクションが完全に完了していない場合に内部ステートマシンが中間状態でスタックするという一般的な問題があります。その場合、スレーブは次のトランザクションでアドレス指定されたときに正しく応答しません。これは通常、マスターがリセットされるか、読み取りまたは書き込みの途中でSCK信号の出力を停止したときに発生します。解決策は、データトランザクションを開始する前にSCKラインを手動で8回または9回切り替えて、スレーブの内部ステートマシンがすべて転送ポイントの開始にリセットされ、アドレスバイトを検索するようにすることです。

于 2011-04-01T12:32:11.237 に答える