Отсутствуют ACK на I²C

Я использую акселерометр GY-521, а также датчики давления BMP280 через I²C на ESP8266.

Когда я анализирую данные I²C с помощью осциллографа, я вижу отсутствующие ACK на обоих из них, как показано на рисунках.

Это повод для беспокойства или это нормально, учитывая, что я купил дешевые китайские датчики?

Отсутствует ACK на GY-521

Отсутствует ACK на BMP280

Мой код 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);
}

, 👍2

Обсуждение

Я не уверен, как интерпретировать изображения. NACK в конце передачи (до условия остановки) является нормальным и относится к протоколу I2C. Мастер сигнализирует таким образом, что он не хочет считывать больше данных., @chrisl

@chrisl: ах, это ценно. Я постараюсь найти больше об этом, @Thomas Weller

Можете ли вы подтвердить, что «отсутствующий ACK»/NACK происходит в конце каждого основного действия чтения? Если да, то я сформулирую это как ответ., @chrisl

@chrisl: да, это то, что я вижу и как я интерпретирую данные. Я правильно понимаю, что это должно происходить только с выделенной библиотекой датчиков, где реализация знает, сколько данных ожидать? В случае более общей реализации I²C мастер не будет знать, сколько данных нужно прочитать, и, следовательно, не остановит передачу?, @Thomas Weller


1 ответ


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

4

NACK в конце передачи ведущего чтения/отправки ведомого является нормальным ожидаемым поведением.

В связи I2C подтверждение — это возможность отреагировать на отправку данных. Например, когда ведомое устройство отправляет NACK, в то время как ведущее устройство отправляет ему данные, это может быть связано с тем, что в настоящее время оно не может обрабатывать дальнейшие данные. Подтверждение идет в обоих направлениях, в зависимости от направления передачи. Читатель всегда должен подтвердить данные, чтобы отметить успешную передачу. Обычно мастер отправляет NACK в конце цикла чтения, чтобы отметить, что он не хочет получать больше данных. Хотя в этом нет строгой логической необходимости (поскольку конец передачи отмечается мастером с помощью условия STOP или RESTART), тем не менее это делается.

Думаю, я также наблюдал такое поведение с библиотекой Wire Arduino. Так что в вашем случае все сводится к реализации протокола I2C. Поскольку ваша библиотека просто использует библиотеку Wire, поведение не является ее частью. Протокол I2C реализован с помощью Wire. Вы увидите такое же поведение в каждой библиотеке датчиков, которая использует библиотеку Wire.

Подробнее о протоколе I2C можно прочитать на этом сайте.

,