SPISettings
SPISettings объединяет частоту, порядок битов и режим тактирования SPI в один объект, который передаётся в SPI.beginTransaction() для настройки шины под конкретное устройство.
Полная статья
Описание
SPISettings — это вспомогательный объект библиотеки SPI, который объединяет три параметра шины в одно целое: максимальную тактовую частоту, порядок битов и режим данных. Готовый объект передаётся в SPI.beginTransaction(), после чего шина настраивается под конкретное периферийное устройство.
Подход с SPISettings удобен тем, что настройки можно описать один раз — прямо в вызове SPI.beginTransaction() или заранее как именованный объект — и переиспользовать без дублирования кода. Если все три параметра известны на этапе компиляции (то есть являются константами), передача SPISettings непосредственно внутри SPI.beginTransaction() позволяет компилятору оптимизировать код: он становится компактнее и быстрее. Если же хотя бы один параметр вычисляется в рантайме (например, частота зависит от пользовательского ввода), лучше создать именованный объект заранее.
Этот объект является частью библиотеки SPI. Подробности см. в разделе SPI.
Синтаксис
SPISettings(speedMaximum, dataOrder, dataMode)SPISettings mySetting(speedMaximum, dataOrder, dataMode)
Параметры
speedMaximum: максимальная тактовая частота шины в Гц. Библиотека SPI автоматически выберет ближайшую поддерживаемую частоту, не превышающую указанное значение. Например, используйте20000000для устройства, рассчитанного на частоту до 20 МГц.dataOrder: порядок передачи битов.MSBFIRST— старший бит первым (наиболее распространённый вариант),LSBFIRST— младший бит первым. Нужный порядок указан в даташите устройства.dataMode: режим тактирования SPI, определяющий полярность тактового сигнала (CPOL) и фазу выборки данных (CPHA). Допустимые значения:SPI_MODE0,SPI_MODE1,SPI_MODE2,SPI_MODE3. Большинство устройств работают в режимеSPI_MODE0; точный режим всегда указан в документации на микросхему.
Возвращает
Ничего.
Пример кода
// Использование SPISettings напрямую (лучший вариант, когда все настройки — константы)
SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));
// Использование именованного объекта SPISettings (лучший вариант, когда хотя бы одна настройка — переменная)
SPISettings mySetting(speedMaximum, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySetting);
Где применяется
- Работа с несколькими SPI-устройствами на одной шине, каждое из которых требует своих настроек частоты и режима.
- Подключение дисплеев, SD-карт, АЦП, ЦАП и радиомодулей через SPI.
- Ситуации, когда настройки шины нужно переключать «на лету» между транзакциями.
- Библиотеки для SPI-периферии, которые инкапсулируют настройки устройства внутри класса.
Практические замечания
- Всегда сверяйте все три параметра с даташитом устройства: неверный
dataModeилиdataOrder— самая частая причина, по которой данные по SPI приходят искажёнными. - Библиотека SPI никогда не превысит указанную частоту
speedMaximum, но может выбрать более низкую, если аппаратный делитель не позволяет попасть точно в нужное значение. - Если на шине несколько устройств, создайте отдельный объект
SPISettingsдля каждого из них и вызывайте SPI.beginTransaction() перед каждой транзакцией с нужным объектом. - Не забывайте завершать транзакцию вызовом
SPI.endTransaction()— это освобождает шину и позволяет корректно работать с прерываниями. - При отладке начинайте с заниженной частоты (например, 1 МГц): на низкой скорости проще поймать проблему логическим анализатором или осциллографом.