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

SPI.transfer()

SPI.transfer() отправляет байт, 16-битное значение или буфер по шине SPI и одновременно возвращает данные, принятые от ведомого устройства.

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

Описание

transfer() — основная функция для обмена данными по шине SPI. Поскольку SPI является полнодуплексным протоколом, каждый отправленный бит сопровождается одновременным приёмом бита от ведомого устройства. Именно поэтому функция не просто «отправляет», а всегда возвращает то, что пришло в ответ.

Доступны три варианта вызова:

  • Однобайтовая передача — отправляет один byte и возвращает принятый байт.
  • Двухбайтовая передача через transfer16() — отправляет 16-битное значение и возвращает принятые два байта.
  • Передача буфера — отправляет массив байтов целиком; принятые данные записываются прямо в тот же массив, заменяя исходное содержимое (передача «на месте»).

Эта функция входит в состав библиотеки SPI. Подробнее о настройке шины и вспомогательных функциях — в разделе SPI.

Синтаксис

  • receivedVal = SPI.transfer(val)
  • receivedVal16 = SPI.transfer16(val16)
  • SPI.transfer(buffer, size)

Параметры

  • val: байт, который нужно отправить ведомому устройству. Допустимый тип данных: byte.
  • val16: 16-битное значение для отправки. Допустимый тип данных: uint16_t.
  • buffer: массив байтов для передачи; после завершения обмена содержит принятые данные. Допустимый тип данных: массив byte.
  • size: количество байтов в массиве, которые нужно передать. Допустимый тип данных: size_t.

Возвращает

  • Для SPI.transfer(val): принятый байт. Тип данных: byte.
  • Для SPI.transfer16(val16): принятое 16-битное значение. Тип данных: uint16_t.
  • Для SPI.transfer(buffer, size): ничего не возвращает; принятые данные сохраняются непосредственно в buffer.

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

  • Чтение регистров датчиков (акселерометры, гироскопы, барометры): сначала отправляется адрес регистра, в ответ приходит значение — всё в одном вызове SPI.transfer(val).
  • Работа с дисплеями и ЦАП: данные передаются потоком через буферный вариант SPI.transfer(buffer, size), что удобнее и быстрее, чем побайтовый цикл.
  • Обмен с Flash/EEPROM по SPI: команда и адрес отправляются последовательно, а данные считываются из того же буфера после возврата функции.
  • Передача 16-битных команд устройствам, ожидающим слово целиком: SPI.transfer16(val16) делает это за один вызов без ручной сборки байтов.

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

  • Перед вызовом transfer() необходимо вручную опустить линию CS (Chip Select) нужного устройства, а после завершения обмена — поднять её обратно. Библиотека SPI не управляет CS автоматически.
  • Буферный вариант SPI.transfer(buffer, size) перезаписывает исходный массив принятыми данными. Если исходные данные нужны после передачи, сохраните их копию заранее.
  • При работе с SPI.transfer16(val16) обязательно сверяйте порядок байтов и битов с документацией ведомого устройства. Если устройство ожидает другой порядок, передавайте два байта вручную через обычный SPI.transfer().
  • Все три варианта transfer() блокируют выполнение скетча до завершения передачи — асинхронного режима нет.
  • Если принятые данные выглядят некорректно, проверьте настройки SPISettings: тактовую частоту, порядок битов (MSBFIRST / LSBFIRST) и режим (0–3). Несовпадение с требованиями устройства — самая частая причина ошибок.