Урок 8 из 18 · Модуль 3. SPI: скоростной конвейер
Протоколы в БАС: полный курс · Урок 8 из 18 · Модуль 3. Шины датчиков: I²C, SPI, CAN
Четыре провода и мегагерцы: как полётный контроллер читает гироскоп 8000 раз в секунду и почему для этого не годится I²C.
Гироскоп — на SPI, потому что контур стабилизации читает его до 8000 раз в секунду. I²C-гироскопы (MPU6050) ушли в прошлое именно из-за нехватки скорости шины.
Содержание
1. Цели урока
После этого урока вы сможете:
- объяснять роли линий SCK, MOSI, MISO и CS;
- называть устройства на SPI в современном дроне;
- сравнивать SPI и I²C и выбирать шину под задачу.
2. Шина SPI
SPI (Serial Peripheral Interface) — синхронный дуплексный протокол для самых быстрых данных на борту. Если I²C — это неспешный разговор, то SPI — конвейер: мастер выставляет такт, и по каждому такту в обе стороны одновременно передаётся по биту. Именно на SPI работает гироскоп — самое критичное устройство дрона: пока контроллер не прочитал угловую скорость, он не может стабилизировать полёт.
Провода и роли
SPI использует четыре линии. В отличие от I²C, где все устройства висят на одной паре проводов, каждое SPI-устройство выбирается отдельным проводом CS:
| Линия | Направление | Роль |
|---|---|---|
| SCK (Serial Clock) | мастер → ведомый | тактовый сигнал. Мастер всегда генерирует такт; по каждому импульсу одновременно сдвигается один бит в обоих направлениях |
| MOSI (Master Out Slave In) | мастер → ведомый | данные от мастера к ведомому: команды, адреса регистров, записываемые значения |
| MISO (Master In Slave Out) | ведомый → мастер | данные от ведомого к мастеру: результаты измерений, статусные байты |
| CS (Chip Select, активный LOW) | мастер → ведомый | выбор устройства. Мастер опускает CS нужного чипа в LOW перед транзакцией и поднимает в HIGH после. Остальные устройства на шине игнорируют SCK и MOSI и не выводят данные на MISO |
Транзакция всегда состоит из трёх шагов:
- CS↓ — мастер опускает линию выбранного устройства в LOW;
- обмен байтами — по каждому такту SCK одновременно передаётся один бит по MOSI и один бит по MISO;
- CS↑ — мастер поднимает CS в HIGH, транзакция завершена.
Несколько устройств на одной шине. SCK, MOSI и MISO у всех ведомых общие; у каждого — свой провод CS. Чтобы добавить второе устройство, достаточно подключить его к тем же SCK/MOSI/MISO и провести от процессора отдельный провод CS. Именно поэтому на плате FC один IMU может висеть на CS1, второй — на CS2, флеш-память — на CS3, а все три делят одни и те же линии SCK/MOSI/MISO.
Реальный пример — полётный контроллер читает один байт данных гироскопа из ICM-42688-P. Регистр GYRO_DATA_X1 имеет адрес 0x1F. Чтобы прочитать его по SPI, мастер устанавливает старший бит адреса в 1 (флаг чтения) и отправляет 0x9F. Ответные данные поступают на следующем байте. Допустим, гироскоп возвращает 0x5A.
Как читать диаграммы: HIGH (логическая единица) — линия вверху; LOW (логический ноль) — линия внизу. CS активен LOW (транзакция идёт, когда линия внизу). MOSI и MISO работают одновременно — это и есть полный дуплекс. Бит считывается по переднему фронту импульса SCK.
Фаза 1 — CS↓: мастер выбирает гироскоп
До начала транзакции CS удерживается в HIGH — гироскоп игнорирует шину. Мастер опускает CS в LOW: с этого момента гироскоп слушает MOSI и готовится выводить данные на MISO.

Фаза 2 — Байт 1: MOSI = 0x9F (адрес регистра + флаг чтения), MISO = 0x00 (dummy)
0x9F = 1 0 0 1 1 1 1 1. Старший бит b7 = 1 — флаг чтения. Остальные семь бит — адрес регистра 0x1F. Гироскоп в это время ещё не знает, какой регистр запрошен, поэтому на MISO выставляет 0x00 (dummy-байт — бесполезные данные, которые мастер игнорирует).

Два HIGH на MOSI: 1 0 0 1 1 1 1 1 → группы 1 и 11111. На MISO — тишина.
Фаза 3 — Байт 2: MOSI = 0x00 (dummy), MISO = 0x5A (данные гироскопа)
0x5A = 0 1 0 1 1 0 1 0. Теперь роли меняются: мастер гонит пустой байт 0x00 по MOSI только для того, чтобы сгенерировать такты SCK. Гироскоп использует эти такты и выдаёт по MISO реальное значение угловой скорости по оси X.

Три HIGH на MISO: 0 1 0 1 1 0 1 0 → группы 1, 11, 1. На MOSI — тишина.
Фаза 4 — CS↑: транзакция завершена
После последнего такта SCK мастер поднимает CS в HIGH. Гироскоп освобождает MISO и перестаёт слушать MOSI. Шина готова к следующей транзакции — следующему опросу, который произойдёт через 125 мкс (при 8 кГц петле стабилизации).

Вся транзакция одной строкой — так она выглядит в окне логического анализатора:

Соответствие полей в декодере логического анализатора (Saleae Logic, PulseView):
| Поле в декодере | Значение | Пояснение |
|---|---|---|
| CS | ↓ … ↑ | границы транзакции; всё между ними — один обмен с одним устройством |
| MOSI Byte 1 | 0x9F |
0x1F | 0x80 — адрес регистра с установленным флагом чтения (MSB=1) |
| MISO Byte 1 | 0x00 |
dummy — гироскоп ещё не знает, какой регистр запрошен; мастер игнорирует |
| MOSI Byte 2 | 0x00 |
dummy — мастер гонит нули, чтобы генерировать такты SCK для приёма данных |
| MISO Byte 2 | 0x5A |
реальные данные из регистра GYRO_DATA_X1 — угловая скорость по оси X |
Ключевое отличие от I²C: в SPI нет адресного кадра, нет ACK/NACK и нет условий START/STOP. Устройство выбирается проводом CS, а не байтом адреса. Поэтому декодер SPI в логическом анализаторе показывает просто потоки байт по MOSI и MISO — интерпретировать их смысл нужно по даташиту конкретного чипа.
Проверка диаграм:
| Байт | Линия | Двоичный |
|---|---|---|
0x9F |
MOSI | 1 0 0 1 1 1 1 1 |
0x00 |
MISO (dummy) | 0 0 0 0 0 0 0 0 |
0x00 |
MOSI (dummy) | 0 0 0 0 0 0 0 0 |
0x5A |
MISO | 0 1 0 1 1 0 1 0 |
Где SPI в дроне
| Устройство | Примеры | Зачем такая скорость |
|---|---|---|
| Гироскоп/акселерометр (IMU) | ICM-42688-P (стандарт де-факто), BMI270, ICM-20689, ICM-20602; проверенный временем MPU6000 | контур стабилизации читает гироскоп до 8000 раз/с — UART и I²C такое не тянут. Аппаратный предел ICM-42688-P составляет 32 кГц, однако серийные прошивки (Betaflight, ArduPilot) работают на 3,2–8 кГц |
| Барометр | SPL06, BMP390, DPS310 (на новых FC) | быстрое чтение без влияния на шину гироскопа |
| Флеш blackbox | W25Q128 (128 Мбит) на плате FC | запись логов полёта со скоростью сотни кБайт/с |
| SD-карта | на логгерах и ArduPilot-платах | бортовые журналы (.bin / .bfl) |
| ELRS SPI-приёмник | встроенный в AIO-платы микродронов: SX1280 (ELRS 2,4 ГГц) или SX127x (ELRS 900 МГц) | радиочип подключён напрямую к процессору FC — отдельного приёмника нет |
| OSD-чип MAX7456 | старые FC (F3/F4 эпохи) | наложение текста на аналоговое видео — устарело, современные FC рисуют OSD процессором |
SPI против I²C — когда что
| Критерий | SPI | I²C |
|---|---|---|
| Скорость | до десятков МГц | до 400 кГц (в дронах) |
| Проводов | 4 + по одному CS на устройство | всегда 2 на всю шину |
| Дуплекс | полный (MOSI+MISO одновременно) | полудуплекс (одна линия SDA) |
| Адресация | по проводу CS | по 7-битному адресу |
| Подтягивающие резисторы | не нужны | обязательны |
| Длина линий | короткие, в пределах платы | до ~1 м на 100 кГц |
| В дроне | гироскоп, флеш, SD | компасы, OLED, лидары, часть барометров |
3. Чек-лист самопроверки
Урок освоен, если каждый пункт выполнен на практике:
- Объясняю, зачем каждому устройству свой провод CS
- Знаю, где в полётном контроллере расположена флеш-память blackbox и почему она на SPI
- Могу выбрать SPI или I²C для нового датчика
4. Что дальше
- Предыдущий урок: Урок 7. I²C: шина датчиков
- Следующий урок: Урок 9. CAN: физика шины и арбитраж
- Полный перечень тем — в статье «Содержание курса».
