3.21. Основы SPI¶
SPI (Serial Peripheral Interface) – это синхронная последовательная шина, предназначенная для высокоскоростной связи на короткие расстояния между одним контроллером и одним или несколькими периферийными устройствами на одной плате. Это стандартный интерфейс для SD-карт, дисплеев, флеш-памяти, АЦП и ЦАП, а также широкого спектра датчиков.
Если в UART не было общего тактового сигнала и синхронизация восстанавливалась из самой линии данных, то в SPI рядом с линиями данных проходит тактовый провод. Контроллер задаёт тактовую частоту по своему усмотрению, и все остальные устройства на шине считывают данные синхронно с этим тактом. Здесь нет угадывания скорости передачи и нет накладных расходов на кадрирование – только тактовые фронты и биты.
3.21.1. Четыре провода¶
Полнодуплексная шина SPI имеет четыре провода:
SCK (последовательный тактовый сигнал). Управляется контроллером. Каждый бит вводится или выводится по фронту этого сигнала.
MOSI (выход контроллера, вход периферии). Линия выхода контроллера; периферийное устройство считывает с неё биты.
MISO (вход контроллера, выход периферии). Линия выхода периферии; контроллер считывает с неё биты.
CS (выбор микросхемы), иногда называется SS (выбор периферии). Отдельная линия для каждого периферийного устройства. Контроллер устанавливает CS в низкий уровень, чтобы начать транзакцию, и снова в высокий, чтобы её завершить; любое периферийное устройство со снятым CS полностью игнорирует шину и прекращает управлять своим выходом MISO.
Один байт 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 или одна из кадрированных шин.