I2Cで「NACK受信」とはどういう意味ですか?


8

I2Cについて読んでいます。このサイトで:

http://playground.arduino.cc/Main/WireLibraryDetailedReference#endTransmission

それはendTransmission()次のステータスコードのいずれかを返すことができると言います:

  • 0:送信に成功しました。
  • 1:送信バッファーがtwiバッファーに対して大きすぎます。twi.hで設定されたTWIバッファー長は、Wire.hで設定された送信バッファー長と同等であるため、これは発生しません。
  • 2:アドレスが送信され、NACKが受信されました。これは問題であり、マスターはSTOP条件を送信する必要があります。
  • 3:データが送信され、NACKが受信されました。これは、スレーブが送信する必要がないことを意味します。マスターは、STOP条件または繰り返しSTARTを送信できます。4:別のtwiエラーが発生しました(たとえば、マスターがバスアービトレーションを失った)。

Arduinoに何も接続しない場合(またはSDA / SCLの両方にプルアップ抵抗を使用する場合)、常にステータス2を取得します。それは何か他の意味ですか?

これが私のサンプルコードです

#include "Wire.h"
void setup() {
  Serial.begin(9600);
  Wire.begin();
}
void loop()  {
  Wire.beginTransmission(42);
  Wire.write(0);
  byte status = Wire.endTransmission();
  Serial.println(status); // always prints 2
}

回答:


9

A NACKは、マスターの制御下でサイクルしてSDAいる間、ハイのままである確認応答スロットによって通知されSCLます。

ハイはプルアップされたバスの非駆動状態であるため、選択されたアドレスにそれをプルダウンすることによって肯定的に応答するペリフェラルがない場合、NACK状態は受動的に発生します。


もう少し詳しく説明してもらえますか?周辺機器が接続されていないということですか?しばらくデータを取得できた後、動作を停止して0x02を返すのはどうですか?
Dzung Nguyen

3
ペリフェラルが応答しないことを意味するものは何でもこれを引き起こす可能性があります-ペリフェラルがない、トレースやワイヤが壊れている、アドレスが間違っている、アドレスが間違っているように見えるノイズ、データを歪める弱いプルアップ、信号、悪い電力、バグの多いソフトウェアまたはシリコンを歪める非常に強いプルアップクロックストレッチなどの拡張機能のサポートが一致していない場合でも、ペリフェラルのデザイン。
Chris Stratton
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.