Что означает в I2C «NACK получен»?

i2c

Я читаю об I2C. На этом сайте:

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

Говорит, что endTransmission() может возвращать один из следующих кодов состояния:

  • 0: успешная отправка.
  • 1: буфер отправки слишком велик для буфера twi. Этого не должно происходить, поскольку длина буфера TWI, заданная в twi.h, эквивалентна длине буфера отправки, заданной в Wire.h.
  • 2: Адрес отправлен, получен NACK. Это проблема, и мастер должен отправить условие STOP.
  • 3: Данные отправлены, получен NACK. Это означает, что подчиненному больше нечего отправлять. Мастер может отправить условие STOP или повторный START. 4: Произошла еще одна ошибка twi (например, мастер проиграл арбитраж шины).

Если я ничего не подключаю к моему Arduino (или с подтягивающими резисторами к обоим SDA/SCL), я всегда получаю статус 2. Но как можно получить NACK (или что-то еще), когда не с чем связываться? Означает ли это что-то другое?

Вот мой пример кода

#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); // всегда печатает 2
}

, 👍10


1 ответ


Лучший ответ:

10

NACK сигнализируется слотом подтверждения, в котором SDA остается высоким, в то время как SCL выполняет цикл под управлением мастера.

Поскольку высокий уровень — это неактивное состояние подтянутой шины, при отсутствии периферийного устройства по выбранному адресу, которое можно было бы положительно подтвердить путем подтягивания, условие NACK будет пассивно результат.

,

Не могли бы вы уточнить подробнее? Вы имеете в виду, что периферия не подключена? Как насчет того, чтобы некоторое время получать данные, затем они перестали работать и продолжали возвращать 0x02?, @Dzung Nguyen

Все, что означает, что периферийное устройство не отвечает, может вызвать это - отсутствие периферийного устройства, оборванные дорожки или провода, неправильный адрес, шум, из-за которого адрес выглядит неправильным, слабые подтягивания, искажающие данные, абсурдно сильные подтягивания, искажающие сигнализацию, плохое питание, ошибочное программное обеспечение или кремний. дизайн в периферийных устройствах, даже несоответствующая поддержка расширений, таких как растяжение часов., @Chris Stratton