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). Несовпадение с требованиями устройства — самая частая причина ошибок.