3.21. Основы SPI

SPI (Serial Peripheral Interface) – это синхронная последовательная шина, предназначенная для высокоскоростной связи на короткие расстояния между одним контроллером и одним или несколькими периферийными устройствами на одной плате. Это стандартный интерфейс для SD-карт, дисплеев, флеш-памяти, АЦП и ЦАП, а также широкого спектра датчиков.

Если в UART не было общего тактового сигнала и синхронизация восстанавливалась из самой линии данных, то в SPI рядом с линиями данных проходит тактовый провод. Контроллер задаёт тактовую частоту по своему усмотрению, и все остальные устройства на шине считывают данные синхронно с этим тактом. Здесь нет угадывания скорости передачи и нет накладных расходов на кадрирование – только тактовые фронты и биты.

3.21.1. Четыре провода

Полнодуплексная шина SPI имеет четыре провода:

  • SCK (последовательный тактовый сигнал). Управляется контроллером. Каждый бит вводится или выводится по фронту этого сигнала.

  • MOSI (выход контроллера, вход периферии). Линия выхода контроллера; периферийное устройство считывает с неё биты.

  • MISO (вход контроллера, выход периферии). Линия выхода периферии; контроллер считывает с неё биты.

  • CS (выбор микросхемы), иногда называется SS (выбор периферии). Отдельная линия для каждого периферийного устройства. Контроллер устанавливает CS в низкий уровень, чтобы начать транзакцию, и снова в высокий, чтобы её завершить; любое периферийное устройство со снятым CS полностью игнорирует шину и прекращает управлять своим выходом MISO.

Четыре сигнальные трассы, расположенные одна над другой: CS вверху, SCK под ним, затем MOSI и MISO. CS начинается с высокого уровня (ожидание), опускается в низкий, чтобы начать транзакцию, затем SCK выдаёт восемь импульсов, пока MOSI и MISO переносят по одному байту данных каждый, после чего CS возвращается в высокий уровень.

Один байт SPI: CS переходит в низкий уровень для выбора периферии, SCK выдаёт восемь битов, а MOSI и MISO передают по одному байту каждый в противоположных направлениях.

Каждый тактовый фронт перемещает по одному биту в каждом направлении одновременно. Один импульс SCK одновременно отправляет один бит по MOSI и принимает один бит по MISO – на уровне проводов SPI является полнодуплексным. Программное обеспечение не обязано использовать оба направления: запись-только и чтение-только транзакции встречаются часто, при этом неиспользуемая линия либо игнорируется, либо удерживается в высоком уровне.

3.21.2. Полярность и фаза тактового сигнала

Два конфигурационных бита определяют, какой именно тактовый фронт перемещает данные:

  • Полярность тактового сигнала (polarity, иногда CPOL) – состояние покоя SCK. 0 означает, что тактовый сигнал в покое находится в низком уровне и импульсирует в высокий; 1 означает, что тактовый сигнал в покое находится в высоком уровне и импульсирует в низкий.

  • Фаза тактового сигнала (phase, иногда CPHA) – какой фронт считывает данные. 0 считывает по первому фронту каждого тактового импульса (передний фронт); 1 считывает по второму фронту (задний фронт).

Вместе они дают четыре режима, традиционно называемые с Mode 0 по Mode 3. Mode 0 (polarity=0, phase=0) встречается чаще всего и является безопасным значением по умолчанию для неизвестных устройств.

Ключевое правило состоит в том, что обе стороны должны договориться о режиме. Несовпадающие режимы дают мусорные данные, даже если линии тактового сигнала и данных подключены правильно; если устройство возвращает бессмыслицу при первой транзакции, режим – это первое, что следует проверить.

3.21.3. Несколько периферийных устройств

Несколько периферийных устройств могут совместно использовать одни и те же линии SCK, MOSI и MISO при условии, что у каждого из них есть собственная линия CS, управляемая контроллером:

  • Все периферийные устройства видят один и тот же тактовый сигнал и данные, но каждое следит за своим собственным CS. При снятом CS (высокий уровень) периферийное устройство полностью игнорирует SCK и MOSI и оставляет MISO в высокоимпедансном состоянии, чтобы не конкурировать с другими устройствами за эту линию.

  • Контроллер устанавливает ровно один CS за раз, выполняет транзакцию и снимает CS, чтобы освободить шину.

Микроконтроллер с единственным аппаратным блоком SPI может работать с таким количеством периферийных устройств, сколько у него есть свободных выводов GPIO для линий CS – адресации на самой шине нет.

3.21.4. Достоинства и недостатки

Достоинства и недостатки SPI вытекают из его конструкции:

  • Быстрый. На коротких трассах с простым согласованием уровней достижимы десятки мегагерц. Это используют считыватели SD-карт и дисплеи SPI.

  • Простой на уровне проводов. Нет адресации, нет подтверждений, нет специальных условий старта/стопа – только биты на проводах, синхронизированные с тактовым сигналом.

  • Прожорливый к выводам. Три общие линии плюс по одному CS на каждое периферийное устройство. Плата с пятью устройствами SPI использует восемь выводов (три + пять).

  • Короткодистанционный. SPI предполагает чистые, быстрые фронты, что означает короткие трассы на одной плате. Для более длинных линий лучше подойдут I2C или одна из кадрированных шин.