Что означает в I2C «NACK получен»?
Я читаю об 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
}
@Mads Skjern, 👍10
1 ответ
Лучший ответ:
NACK
сигнализируется слотом подтверждения, в котором SDA
остается высоким, в то время как SCL
выполняет цикл под управлением мастера.
Поскольку высокий уровень — это неактивное состояние подтянутой шины, при отсутствии периферийного устройства по выбранному адресу, которое можно было бы положительно подтвердить путем подтягивания, условие NACK
будет пассивно результат.
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
- OVF в последовательном мониторе вместо данных
Не могли бы вы уточнить подробнее? Вы имеете в виду, что периферия не подключена? Как насчет того, чтобы некоторое время получать данные, затем они перестали работать и продолжали возвращать 0x02?, @Dzung Nguyen
Все, что означает, что периферийное устройство не отвечает, может вызвать это - отсутствие периферийного устройства, оборванные дорожки или провода, неправильный адрес, шум, из-за которого адрес выглядит неправильным, слабые подтягивания, искажающие данные, абсурдно сильные подтягивания, искажающие сигнализацию, плохое питание, ошибочное программное обеспечение или кремний. дизайн в периферийных устройствах, даже несоответствующая поддержка расширений, таких как растяжение часов., @Chris Stratton