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

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 удобно создавать один раз в глобальной области видимости и переиспользовать в каждом вызове — это избавляет от дублирования параметров.

Полезные материалы