Главная chevron_right Функции chevron_right Связь chevron_right Wire.endTransmission()

Wire.endTransmission()

Wire.endTransmission() завершает I²C-транзакцию: отправляет накопленные через Wire.write() байты на шину и возвращает byte-код результата — 0 означает успех, остальные значения указывают на конкретную ошибку.

Полная статья

Описание

endTransmission() — это финальный шаг любой I²C-записи. Функция берёт всё, что было накоплено в буфере вызовами Wire.write(), и отправляет эти данные периферийному устройству, адрес которого был задан в Wire.beginTransmission().

Без вызова endTransmission() данные так и останутся в буфере и никуда не уйдут. Поэтому стандартная последовательность выглядит так:

Wire.beginTransmission(address) → один или несколько вызовов Wire.write()Wire.endTransmission()

Необязательный параметр stop определяет, что происходит с шиной после передачи. По умолчанию он равен true: библиотека отправляет условие STOP и освобождает шину. Если передать false, STOP не отправляется — это нужно для так называемого repeated start, когда сразу после записи нужно выполнить чтение без полного сброса шины.

Функция является частью библиотеки Wire.

Синтаксис

  • Wire.endTransmission()
  • Wire.endTransmission(stop)

Параметры

  • stop (необязательно) — управляет условием STOP на шине. Если true, после передачи шина освобождается (STOP отправляется). Если false, STOP не отправляется и шина остаётся захваченной для repeated start. Значение по умолчанию: true. Тип данных: bool.

Возвращает

Значение типа byte — код результата передачи:

  • 0 — успех, все байты доставлены и подтверждены.
  • 1 — данных слишком много: они не вместились в буфер передачи.
  • 2 — устройство не ответило на свой адрес (NACK по адресу).
  • 3 — устройство не подтвердило один из байтов данных (NACK по данным).
  • 4 — неизвестная ошибка.
  • 5 — тайм-аут.

Пример кода

В примере контроллер записывает значение 0x01 в регистр 0x10 устройства с адресом 0x40 и проверяет код результата:

void setup() {
  Wire.begin();
  Serial.begin(9600);

  Wire.beginTransmission(0x40);
  Wire.write(0x10);
  Wire.write(0x01);

  byte result = Wire.endTransmission();

  if (result == 0) {
    Serial.println("Write OK");
  } else {
    Serial.print("I2C error: ");
    Serial.println(result);
  }
}

void loop() {
}

Где применяется

  • Запись в регистры датчика — сначала отправляется номер регистра, затем новое значение: два вызова Wire.write() внутри одной транзакции.
  • Инициализация I²C-модулей — дисплеи, расширители портов, RTC-микросхемы и другая периферия принимают команды через цепочку beginTransmission()write()endTransmission().
  • Проверка наличия устройства на шине — если endTransmission() возвращает 0, устройство отозвалось на свой адрес и физически присутствует.
  • Операции с repeated start — запись адреса регистра без STOP, а затем немедленное чтение данных через requestFrom() без освобождения шины между операциями.

Практические замечания

  • Проверяйте код возврата при отладке. Вывод кода в Serial Monitor сразу покажет, где проблема: в адресе, данных, переполнении буфера или тайм-ауте — без осциллографа.
  • Адрес устройства — всегда 7-битный. Не добавляйте бит чтения/записи вручную: библиотека Wire управляет этим сама.
  • stop = false нужен редко. Используйте его только если устройство явно требует repeated start (обычно это описано в даташите). В обычной записи оставляйте значение по умолчанию.
  • Буфер передачи ограничен по размеру. Если добавить слишком много байтов через Wire.write(), функция вернёт 1. Конкретный размер буфера зависит от платформы и версии Wire.
  • NACK по адресу чаще всего означает неверный адрес или проблему с железом. Проверьте питание устройства, наличие подтягивающих резисторов на линиях SDA и SCL, а также фактический адрес модуля — он может зависеть от состояния адресных пинов.

Примечания и предупреждения

Если endTransmission() возвращает 4 или 5, в первую очередь проверьте настройки тайм-аута Wire, физическое состояние линий SDA и SCL, а также не завис ли какой-то узел на шине в середине транзакции. Имейте в виду, что код 5 поддерживается не на всех платформах — он доступен только там, где реализация Wire включает поддержку timeout.