Отсутствуют ACK на I²C
Я использую акселерометр GY-521, а также датчики давления BMP280 через I²C на ESP8266.
Когда я анализирую данные I²C с помощью осциллографа, я вижу отсутствующие ACK на обоих из них, как показано на рисунках.
Это повод для беспокойства или это нормально, учитывая, что я купил дешевые китайские датчики?
Мой код BMP280:
// https://github.com/mahfuz195/BMP280-arduino-library
#include <BMP280.h>
BMP280 bmp280;
#include "Wire.h"
TwoWire i2c = TwoWire();
// Настройка оборудования
#define CLOCK_PIN D1
#define DATA_PIN D2
#define I2C_SPEED 400000
// Коды ответа I²C
#define FOUND 0
#define NORESPONSE 2
bool sensorAvailableAt(byte address)
{
i2c.beginTransmission(address);
byte response = i2c.endTransmission();
return response == FOUND;
}
void stop(char* message){
Serial.println(message);
while(true);
}
void setup() {
Serial.begin(115200);
while(!Serial){} // Ожидание последовательного соединения
i2c.begin(DATA_PIN, CLOCK_PIN, I2C_SPEED);
if (!sensorAvailableAt(0x76))
{
stop("BMP280 sensor not found");
}
if (bmp280.begin())
{
Serial.println("BMP280 init success");
}
else
{
stop("BMP280 initialization failed.");
}
}
void loop() {
double temperature;
double pressure;
bmp280.getTemperatureAndPressure(temperature, pressure);
double sealevel = bmp280.sealevel(pressure, 800);
Serial.print("Temperature: ");
Serial.print(temperature,1);
Serial.println(" °C");
Serial.print("Pressure: ");
Serial.print(pressure, 1);
Serial.println(" mbar (absolute)");
Serial.print("Pressure: ");
Serial.print(sealevel);
Serial.println(" mbar (sealevel, compensated for 800 m height)");
delay(50);
}
@Thomas Weller, 👍2
Обсуждение1 ответ
Лучший ответ:
NACK в конце передачи ведущего чтения/отправки ведомого является нормальным ожидаемым поведением.
В связи I2C подтверждение — это возможность отреагировать на отправку данных. Например, когда ведомое устройство отправляет NACK, в то время как ведущее устройство отправляет ему данные, это может быть связано с тем, что в настоящее время оно не может обрабатывать дальнейшие данные. Подтверждение идет в обоих направлениях, в зависимости от направления передачи. Читатель всегда должен подтвердить данные, чтобы отметить успешную передачу. Обычно мастер отправляет NACK в конце цикла чтения, чтобы отметить, что он не хочет получать больше данных. Хотя в этом нет строгой логической необходимости (поскольку конец передачи отмечается мастером с помощью условия STOP или RESTART), тем не менее это делается.
Думаю, я также наблюдал такое поведение с библиотекой Wire
Arduino. Так что в вашем случае все сводится к реализации протокола I2C. Поскольку ваша библиотека просто использует библиотеку Wire
, поведение не является ее частью. Протокол I2C реализован с помощью Wire
. Вы увидите такое же поведение в каждой библиотеке датчиков, которая использует библиотеку Wire
.
Подробнее о протоколе I2C можно прочитать на этом сайте.
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- esp8266-01 и Arduino UNO обмен данными через i2c
- ADS1115: измерение напряжения 5 В и питание от 3,3 В
- Варианты протокола для обмена данными между Arduino и ESP8266
- Отправка значений из arduino uno в wemos d1 r1
- Соединение i2c для MCP4725 (Dac) с Esp8266 wemos d1 mini
- HD44780 отображает неправильно черный на синем вместо белого на синем
- ESP8266 не работает с MPU 6050 по проводной библиотеке и I2C
Я не уверен, как интерпретировать изображения. NACK в конце передачи (до условия остановки) является нормальным и относится к протоколу I2C. Мастер сигнализирует таким образом, что он не хочет считывать больше данных., @chrisl
@chrisl: ах, это ценно. Я постараюсь найти больше об этом, @Thomas Weller
Можете ли вы подтвердить, что «отсутствующий ACK»/NACK происходит в конце каждого основного действия чтения? Если да, то я сформулирую это как ответ., @chrisl
@chrisl: да, это то, что я вижу и как я интерпретирую данные. Я правильно понимаю, что это должно происходить только с выделенной библиотекой датчиков, где реализация знает, сколько данных ожидать? В случае более общей реализации I²C мастер не будет знать, сколько данных нужно прочитать, и, следовательно, не остановит передачу?, @Thomas Weller