Wat betekent het in I2C, "NACK received"?

Ik lees over I2C. Op deze pagina:

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

Er staat dat endTransmission() een van de volgende statuscodes kan retourneren:

  • 0: succesvol verzonden.
  • 1: verzendbuffer te groot voor de buffer twi. Dit zou niet moeten gebeuren, omdat de TWI-buffellengte die is ingesteld in twi.h gelijk is aan de verzendbufferlengte die is ingesteld in Wire.h.
  • 2: Adres is verzonden en een NACK ontvangen. Dit is een probleem en de master moet een STOP-voorwaarde verzenden.
  • 3: gegevens zijn verzonden en een NACK ontvangen. Dit betekent dat de slaaf niet meer kan verzenden. De master kan een STOP-voorwaarde of een herhaalde START verzenden. 4: Er vond nog een andere fout plaats (bijv. De meester verloor busarbitrage).

Als ik niets aan mijn Arduino bevestig (of met pull-up weerstanden aan zowel SDA/SCL), krijg ik altijd status 2. Maar hoe kan een NACK (of iets) worden ontvangen wanneer er niets is om mee te communiceren? Betekent het iets anders?

Hier is mijn voorbeeldcode

#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 antwoord

Een NACK wordt gesignaleerd door een bevestigingssleuf waarin SDA hoog blijft terwijl SCL cycli onder controle van de master.

Omdat hoog de niet-aangedreven toestand van de opgetrokken bus is, zal bij afwezigheid van een randapparaat op het geselecteerde adres dit positief worden bevestigd door het naar beneden te trekken, een NACK voorwaarde passief resultaat.

4
toegevoegd
Alles wat betekent dat een randapparaat niet reageert, kan dit veroorzaken - geen perifere, gebroken sporen of draden, verkeerd adres, ruis waardoor het adres verkeerd is, zwakke pullups die de gegevens vervormen, absurd sterke pullups die de signalering, slechte stroom, software met fouten of silicium vervormen ontwerp in de perifere, zelfs mismatchende ondersteuning van uitbreidingen zoals klokrek.
toegevoegd de auteur rossp, de bron
Kun je alsjeblieft meer uitleggen? Bedoel je dat het randapparaat niet is verbonden? Hoe ongeveer was in staat om gegevens voor een tijdje te krijgen, dan stopte het met werken en blijf terug 0x02?
toegevoegd de auteur roetnig, de bron