Wire.requestFrom()
requestFrom() запрашивает у периферийного I²C-устройства нужное число байтов, которые затем читаются через available() и read().
Полная статья
Описание
requestFrom() — это функция библиотеки Wire, которую вызывает контроллер I²C-шины, когда ему нужно получить данные от периферийного устройства. После успешного вызова байты попадают во внутренний буфер, откуда их можно забирать по одному с помощью available() и read().
По умолчанию после получения данных шина освобождается: контроллер отправляет стоп-условие, и другие устройства могут начать обмен. Если передать необязательный параметр stop со значением false, вместо стопа отправляется условие повторного старта (repeated start). Шина остаётся занятой, и никакой другой контроллер не сможет вклиниться между запросами. Это полезно, когда нужно прочитать несколько регистров подряд без риска потерять «захват» шины.
Эта функция является частью библиотеки Wire.
Синтаксис
Wire.requestFrom(address, quantity)Wire.requestFrom(address, quantity, stop)
Параметры
address: 7-битный адрес периферийного устройства на шине I²C. Именно по этому адресу контроллер обращается за данными. Допустимый тип данных:int.quantity: сколько байтов запросить у устройства. Допустимый тип данных:int.stop(необязательно): управляет поведением шины после запроса. Значениеtrue(по умолчанию) завершает транзакцию стоп-условием и освобождает шину. Значениеfalseотправляет повторный старт и удерживает шину занятой — удобно для серии связанных запросов. Допустимый тип данных:bool.
Возвращает
Фактическое число байтов, полученных от периферийного устройства. Тип данных: byte.
Значение может оказаться меньше запрошенного quantity, если устройство вернуло не все байты или вовсе не ответило. Перед чтением стоит проверять возвращаемое значение или использовать available(), чтобы не читать из пустого буфера.
Где применяется
- Чтение сенсоров — большинство датчиков (температуры, давления, IMU) передают измерения именно через запрос по I²C: контроллер вызывает
requestFrom(), а затем считывает байты черезread(). - Чтение регистров микросхем — EEPROM, часы реального времени (RTC) и другие периферийные ИС хранят данные в регистрах; чтобы прочитать регистр, сначала пишут его адрес, потом запрашивают байты через
requestFrom(). - Опрос нескольких устройств подряд — с параметром
stop=falseможно удерживать шину между несколькими запросами, снижая накладные расходы на арбитраж. - Отладка шины — удобно запрашивать один байт у известного адреса, чтобы убедиться, что устройство вообще отвечает.
Практические замечания
- Вызов
requestFrom()блокирует выполнение скетча до завершения транзакции. Если устройство не отвечает, функция вернёт0после таймаута. - Размер буфера библиотеки
Wireзависит от платформы; на многих классических платах он равен 32 байтам. Не запрашивайте больше, чем может вместить буфер вашей платы. - Перед чтением каждого байта вызывайте
available(), чтобы убедиться, что в буфере есть данные. Это защищает от чтения мусора, если устройство вернуло меньше байтов, чем ожидалось. - Адрес устройства (
address) — 7-битный. Не используйте 8-битный адрес из даташита напрямую: его нужно сдвинуть вправо на 1 бит, либо уточнить, какой формат указан в документации на конкретный чип. - Если шина «зависает» и устройство перестаёт отвечать, попробуйте сбросить её вручную или передёрните питание периферии — это частая причина, по которой
requestFrom()постоянно возвращает0.