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.