SPI.beginTransaction()
beginTransaction() захватывает шину SPI с нужными настройками и защищает передачу от вмешательства прерываний или других SPI-операций до вызова SPI.endTransaction().
Полная статья
Описание
beginTransaction() настраивает шину SPI перед началом обмена данными с конкретным ведомым устройством и берёт монопольный контроль над шиной. Пока транзакция открыта, никакие другие части программы — включая обработчики прерываний — не смогут случайно изменить параметры шины или начать собственный обмен. Это особенно важно, когда к одной шине подключено несколько устройств SPI с разными тактовыми частотами, режимами или порядком битов.
Перед первым вызовом этой функции необходимо инициализировать библиотеку: SPI.begin() должен быть вызван заранее.
Функция является частью библиотеки SPI. Полное описание библиотеки см. в разделе SPI.
Синтаксис
SPI.beginTransaction(mySettings)
Параметры
mySettings: объект с настройками шины SPI, который задаёт три параметра: тактовую частоту, порядок битов (старший или младший вперёд) и режим данных (CPOL/CPHA). Подробнее о формировании этого объекта см. в SPISettings.
Возвращает
Ничего.
Где применяется
- Работа с несколькими SPI-устройствами на одной шине, каждое из которых требует своих настроек.
- Защита передачи от вмешательства обработчиков прерываний, которые тоже используют SPI.
- Переключение между разными ведомыми устройствами в одном скетче без риска перепутать режимы.
- Любая ситуация, когда важна атомарность операции: сначала настроить шину, затем выбрать устройство (CS), затем передать данные.
Практические замечания
- После завершения обмена с устройством всегда вызывайте
SPI.endTransaction(). Это освобождает шину и позволяет другим частям программы или прерываниям использовать SPI. - Линию выбора устройства (CS/SS) переводите в LOW после вызова
beginTransaction(), а обратно в HIGH — до вызоваendTransaction(). Такой порядок гарантирует, что устройство получит данные уже с правильными настройками шины. - Если в прерывании тоже происходит SPI-обмен, используйте
SPI.usingInterrupt()до начала транзакции — это предотвратит взаимную блокировку. - Не вызывайте
beginTransaction()повторно, не закрыв предыдущую транзакцию черезendTransaction(): поведение в этом случае не определено. - Объект настроек
mySettingsудобно создавать один раз в глобальной области видимости и переиспользовать в каждом вызове — это избавляет от дублирования параметров.