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 або одна з шин із кадруванням є кращим вибором.