Ce înseamnă în I2C, "NACK a primit"?

Citesc despre I2C. Pe acest site:

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

Se spune că endTransmission() poate returna unul dintre următoarele coduri de stare:

  • 0: Trimiteți cu succes.
  • 1: Tamponul de trimitere este prea mare pentru tamponul twi. Acest lucru nu ar trebui să se întâmple, deoarece lungimea tamponului TWI setată în twi.h este echivalentă cu lungimea tamponului de expediere setată în Wire.h.
  • 2: adresa a fost trimisă și un NACK primit. Aceasta este o problemă, iar comandantul ar trebui să trimită o condiție STOP.
  • 3: S-au trimis datele și s-a primit un NACK. Aceasta înseamnă că sclavul nu mai are de trimis. Comandantul poate trimite o condiție STOP sau o repornire START. 4: O altă eroare a două a avut loc (de exemplu, comandantul a pierdut arbitrajul de autobuz).

Dacă nu atribuiți nimic Arduino-ului meu (sau cu rezistențe de tracțiune la ambele SDA/SCL), întotdeauna am statutul 2. Dar cum poate fi primit un NACK (sau altceva) atunci când nu este nimic de comunicat cu? Inseamna altceva?

Iată codul meu de exemplu

#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
}
4

1 răspunsuri

Un NACK este semnalat de un slot de confirmare în care SDA rămâne ridicat în timp ce ciclurile SCL se află sub controlul comandantului.

Deoarece înaltă este starea nefuncționată a magistralei trase, în absența unui periferic la adresa selectată pentru a confirma pozitiv tragerea acesteia, o condiție NACK va fi pasivă rezultat.

4
adăugat
Orice înseamnă că un periferic nu reușește să răspundă poate cauza acest lucru - fără urme sau fire periferice, adresă greșită, zgomot care face adresa greșită, trăsături slabe denaturează datele, trageri absurd de puternice denaturează semnalul, puterea proastă, proiectare în sprijinul periferic, chiar și nepotrivirea extensiilor cum ar fi întinderea ceasului.
adăugat autor rossp, sursa
Ați putea să mai elaborați mai multe? Vrei să spui că perifericul nu este conectat? Ce zici de faptul că a reușit să obțină datele pentru un timp, apoi a încetat să mai lucreze și a păstrat întoarcerea la 0x02?
adăugat autor roetnig, sursa