SPI.setDataMode()
SPI.setDataMode() задаёт режим тактирования SPI (SPI_MODE0…SPI_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 = 0SPI_MODE1:CPOL = 0,CPHA = 1SPI_MODE2:CPOL = 1,CPHA = 0SPI_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для каждого устройства и активируйте нужный перед каждой транзакцией — это гарантирует корректные параметры независимо от порядка вызовов.