3.21. Основы SPI

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

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

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

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

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

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

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

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

Four signal traces stacked: CS at top, SCK below it, then MOSI and MISO. CS starts high (idle), drops low to begin the transaction, then SCK clocks out eight pulses while MOSI and MISO carry one byte of data each, then CS returns high.

Один байт 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 или одна из кадрированных шин.