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

SPI.setDataMode()

SPI.setDataMode() задаёт режим тактирования SPI (SPI_MODE0SPI_MODE3); в новых проектах лучше использовать SPISettings внутри SPI.beginTransaction().

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

Описание

SPI.setDataMode() управляет тем, как тактовый сигнал SCK взаимодействует с данными на шине SPI. Режим складывается из двух независимых параметров: полярности тактового сигнала (CPOL) и фазы выборки (CPHA). Вместе они определяют, по какому фронту SCK ведомое устройство фиксирует входящий бит и по какому — выставляет исходящий.

Правильный dataMode — обязательное условие нормальной работы. При неверном выборе обмен может идти без явных ошибок на уровне протокола, но принятые байты окажутся сдвинутыми или полностью искажёнными. Нужный режим всегда указан в datasheet устройства в разделе описания SPI-интерфейса.

Функция входит в состав библиотеки SPI. Общее описание шины и принципов работы с ней см. в разделе SPI.

Внимание: функция устарела. Для новых проектов задавайте режим через SPISettings внутри SPI.beginTransaction(). Такой подход объединяет скорость, порядок битов и режим SPI в одном объекте SPISettings, что снижает риск рассогласования параметров при работе с несколькими устройствами.

Синтаксис

  • SPI.setDataMode(mode)
  • SPI.setDataMode(chipSelectPin, mode) (только для Arduino Due)

Параметры

mode — режим тактирования SPI. Принимает одно из четырёх значений:

  • SPI_MODE0: CPOL = 0, CPHA = 0
  • SPI_MODE1: CPOL = 0, CPHA = 1
  • SPI_MODE2: CPOL = 1, CPHA = 0
  • SPI_MODE3: CPOL = 1, CPHA = 1

chipSelectPin — номер вывода выбора ведомого устройства (Chip Select). Этот параметр доступен только на Arduino Due и позволяет привязать режим к конкретному устройству на шине.

Возвращает

Ничего.

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

  • Поддержка старых скетчей и библиотек, написанных до введения транзакционного API SPI.
  • Отладка и подбор режима: можно вручную перебрать SPI_MODE0...SPI_MODE3 и найти тот, при котором устройство начинает отвечать корректно.
  • Проекты на Arduino Due, где перегрузка chipSelectPin позволяет задать индивидуальный режим для каждого ведомого устройства.

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

  • Большинство распространённых устройств работают в SPI_MODE0, но это не универсальное правило. Дисплеи, АЦП, радиомодули и флеш-память нередко требуют другого режима — всегда сверяйтесь с datasheet.
  • Симптомы неверного dataMode легко спутать с другими проблемами: нестабильные показания, «мусор» в ответе, периодические сбои. Если снижение скорости SPI не помогает — первым делом проверьте CPHA.
  • В современном коде режим удобнее задавать прямо при открытии транзакции: SPI.beginTransaction(SPISettings(speed, MSBFIRST, SPI_MODE0)).
  • Если на одной шине несколько SPI-устройств с разными режимами, не используйте setDataMode() как глобальную настройку. Создайте отдельный объект SPISettings для каждого устройства и активируйте нужный перед каждой транзакцией — это гарантирует корректные параметры независимо от порядка вызовов.