2016-05-05 54 views
0

私の最近のプロジェクトでは、複数のスレーブを持つ単一のマスタを使用したi2c通信が必要です。私は、マスターによって送られた各データバイト(実際のデータ)で、スレーブがNack \ Ack(1,0)で応答することを知っています。 このNackとACKがどのように解釈されるのか混乱しています。私はウェブを検索しましたが、私はこれについて明確なイメージを持っていませんでした。私の理解はこのようなものです。I2CバスでのNACK応答とACK応答

ACK-データを正常に受信しました。もっとデータを送ってください。 NACK-データを受信して​​いません。もう一度送信してください。 これはこのようなものか、私は間違っていますか? 正解を明確にしてお答えください。

おかげ アミット・クマール

答えて

0

あなたは本当にI2C仕様hereを読む必要がありますが、簡単に、ACK/NACKのために考慮すべき二つの異なる場合があります。

  1. スレーブアドレスを送信した後次の場合I2Cマスタがスレーブのアドレスを送信して(読み書きビットを含む)、そのアドレスを認識するスレーブはACKを送信します。これは、スレーブが到達しようとしているスレーブが実際にバス上にあることをマスタに伝えます。スレーブデバイスがアドレスを認識しない場合、その結果はNACKになります。この場合、マスターは話をする人がいないため、要求を中止する必要があります。これは通常、再試行で修正できるものではありません。

  2. 転送中:1バイト(送信時に受信またはスレーブのマスター)がバイトを受信した後、ACKを送信する必要があります。大きな例外は、受信側が送信バイト数を制御している場合、送信する最後のバイトの後にNACKを送信する必要があることです。例えば、スレーブからマスタへの転送では、マスタはSTOP条件を送信する直前にNACKを送信して転送を終了する必要があります。 (これは仕様で必要です)

エラーが発生した場合、受信者がNACKを送信できることもあります。これが仕様で許されているかどうかは覚えていません。

しかし、NACKは再試行できない致命的な状態を示しているか、単に転送の終了を示すものです。

ところで、受信装置が処理に時間を要する場合は、NACKによって決して示されない。その代わりに、スレーブデバイスは「クロックストレッチ」(またはマスターが単にクロックの生成を遅らせる)か、または上位層のプロトコルを使用して再試行を要求します。