Перейти к содержимому

Урок 8 из 18 · Модуль 3. SPI: скоростной конвейер

23 августа 2026
Пилоту БПЛА | Технику БПЛА | Хобби

Протоколы в БАС: полный курс · Урок 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_master_slaves_style01_a5ad8.png

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

Транзакция всегда состоит из трёх шагов:

  1. CS↓ — мастер опускает линию выбранного устройства в LOW;
  2. обмен байтами — по каждому такту SCK одновременно передаётся один бит по MOSI и один бит по MISO;
  3. CS↑ — мастер поднимает CS в HIGH, транзакция завершена.

Несколько устройств на одной шине. SCK, MOSI и MISO у всех ведомых общие; у каждого — свой провод CS. Чтобы добавить второе устройство, достаточно подключить его к тем же SCK/MOSI/MISO и провести от процессора отдельный провод CS. Именно поэтому на плате FC один IMU может висеть на CS1, второй — на CS2, флеш-память — на CS3, а все три делят одни и те же линии SCK/MOSI/MISO.

Подтягивающие резисторы не нужны: в отличие от I²C, SPI использует двухтактные (push-pull) выходы. Линии активно управляются в обе стороны, поэтому нет ни подтяжки, ни ограничений на ёмкость шины, характерных для open-drain. Отсюда — возможность работы на десятках МГц.

 

Реальный пример — полётный контроллер читает один байт данных гироскопа из 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.

spi phase1 125c8

Фаза 2 — Байт 1: MOSI = 0x9F (адрес регистра + флаг чтения), MISO = 0x00 (dummy)

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

spi_phase1_f311d.png

Два 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.

spi_phase2_be7f2.png

Три HIGH на MISO: 0 1 0 1 1 0 1 0 → группы 1, 11, 1. На MOSI — тишина.

Фаза 4 — CS↑: транзакция завершена

После последнего такта SCK мастер поднимает CS в HIGH. Гироскоп освобождает MISO и перестаёт слушать MOSI. Шина готова к следующей транзакции — следующему опросу, который произойдёт через 125 мкс (при 8 кГц петле стабилизации).

spi_phase3_d3691.png

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

spi_transactions_fb418.png

Соответствие полей в декодере логического анализатора (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 — когда что

КритерийSPII²C
Скорость до десятков МГц до 400 кГц (в дронах)
Проводов 4 + по одному CS на устройство всегда 2 на всю шину
Дуплекс полный (MOSI+MISO одновременно) полудуплекс (одна линия SDA)
Адресация по проводу CS по 7-битному адресу
Подтягивающие резисторы не нужны обязательны
Длина линий короткие, в пределах платы до ~1 м на 100 кГц
В дроне гироскоп, флеш, SD компасы, OLED, лидары, часть барометров
Почему гироскоп именно на SPI: Внутри FC всё на одной плате, провода короткие — ограничения SPI не мешают, а его скорость является определяющим фактором. I²C-гироскопы (старый MPU6050) ушли в прошлое именно потому, что шина 400 кГц не справлялась: на чтение шести осей уходило больше времени, чем длился цикл стабилизации. MPU6050 поддерживал только I²C и не имел SPI-интерфейса — это и стало причиной его вытеснения. MPU6050 по I²C — устарело.

3. Чек-лист самопроверки

Урок освоен, если каждый пункт выполнен на практике:

  • Объясняю, зачем каждому устройству свой провод CS
  • Знаю, где в полётном контроллере расположена флеш-память blackbox и почему она на SPI
  • Могу выбрать SPI или I²C для нового датчика
Результат: все пункты выполнены — переходите к следующему уроку.
↑ К оглавлению

4. Что дальше

  • Предыдущий урок: Урок 7. I²C: шина датчиков
  • Следующий урок: Урок 9. CAN: физика шины и арбитраж
  • Полный перечень тем — в статье «Содержание курса».
↑ К оглавлению
8