Инженерные руководства
I²C против SPI для датчиков давления — выберите правильную шину или возненавидите свою схему позже
Вы выбрали датчик давления. Вы знаете дальность, точность, комплектацию. Затем на странице заказа вы увидите два варианта: I²C и SPI. Тот же датчик. Та же цена. Разные четыре буквы. Вот как решить — с помощью реальных цифр, а не теории из учебника.
Двухминутный курс повышения квалификации
Пропустите это, если вы уже подключили обе шины раньше. Если вы еще этого не сделали, вот достаточно, чтобы прочитать остальную часть статьи:
- Провода: 2 — SDA (данные) + SCL (тактовые часы)
- Тип сигнала: Открытый сток, подтянутый резисторами
- Адресация: 7-битный адрес на устройство
- Направление: Полудуплекс
- Скорость: 100 кГц/400 кГц/1 МГц/3,4 МГц
- Контроль: По инициативе Мастера; подчиненные отвечают только при обращении
- Провода: 4 — MOSI, MISO, SCLK + 1 × CS на устройство
- Тип сигнала: Двухтактный КМОП
- Адресация: Нет — линия CS выбирает устройство.
- Направление: Полнодуплексный
- Скорость: от 1 МГц до 50 МГц
- Контроль: Мастер управляет часами; никаких растягиваний часов
В этот момент вы можете подумать: "SPI is faster, so SPI wins, end of article." Не совсем — скорость практически не имеет значения для датчика давления. Вот почему.
Аргумент скорости, который не имеет значения
Типичный датчик давления MEMS снимает показания каждые от 1 до 100 миллисекунд — доминирует время преобразования АЦП, а не скорость шины. Даже при 1 мс на выборку (выборка 1 кГц) вы передаете, возможно, 48 бит на чтение. Это 48 кбит/с.
I²C на частоте 400 кГц передает ~320 кбит/с после служебных данных. SPI на частоте 1 МГц передает 1 Мбит/с. Любой из них От 7× до 20× быстрее чем скорость передачи данных датчика. Если вы не отбираете пробы на ультразвуковых частотах (а это не так, поскольку давление не меняется так быстро), скорость шины не имеет значения. Узким местом является датчик, а не провода.
Итог по скорости: не имеет значения. АЦП датчика является ограничивающим фактором. Примите решение по другим основаниям.
Количество выводов: аргумент, который действительно имеет значение на небольших платах
| Сценарий | Используемые контакты I²C | Используемые контакты SPI |
|---|---|---|
| 1 датчик | 2(СДА+СКЛ) | 4 (МОСИ + МИСО + СКЛК + CS) |
| 2 датчика | 2 (общий автобус) | 5 (общая шина + 2× CS) |
| 4 датчика | 2 (общий автобус) | 7 (общая шина + 4× CS) |
Если ваш MCU — STM32 с 80 GPIO — кого это волнует. Но на ESP32-C3 с 15 пригодными для использования GPIO, дисплеем, BLE, двумя кнопками и SD-картой — эти 2 дополнительных контакта для SPI. I²C экономит количество контактов независимо от того, сколько датчиков используют одну шину.
Примечание. I²C стоит вам дорого. два подтягивающих резистора. SPI ничего не стоит. Два резистора 0402 сопротивлением 4,7 кОм стоят в общей сложности около 0,002 доллара и занимают 2 мм² места на плате — не пустяки, но близко к этому.
Итог по контактам: I²C выигрывает, когда GPIO подтянуты. При наличии микроконтроллера с большим количеством выводов преимущество исчезает — принимайте решение по другим факторам.
Мультисенсорные конструкции: где I²C действительно сияет
Три датчика давления на одной плате — один эталонный барометрический, один уровень в резервуаре, одно выпускное отверстие насоса. С I²C: назначьте каждому датчику отдельный адрес, подключите SDA и SCL параллельно, готово. Два следа. Три датчика. Ноль дополнительных контактов MCU. С SPI: три отдельные линии CS поверх общего MOSI/MISO/SCLK — всего шесть проводов.
Осторожно: Устройствам I²C нужны уникальные адреса. Большинство датчиков давления предлагают именно два адреса (булавка привязана высоко или низко). Это означает, что вы подключаете к шине два датчика, прежде чем понадобится мультиплексор I²C, такой как TCA9548A, что добавляет ~ 0,50 доллара и несколько мм². У SPI такого ограничения нет; просто добавьте линию CS для каждого датчика.
Итог по мультисенсору: I²C выигрывает за простоту подключения до двух одинаковых датчиков. Кроме того, используйте SPI или мультиплексор I²C — ни один из них явно не лучше, это вызов макета.
Шумоустойчивость: то, где SPI вырывается вперед
Датчики давления с высоким разрешением измеряют изменения всего в 0,03 гПа — это примерно вес комара, приземлившегося на ваш стол, который преобразуется в электрический сигнал. При таком разрешении шум имеет значение.
Шумовые характеристики I²C
Линии с открытым стоком и подтягивающими резисторами создают фронты RC-преобразования, а не чистые переходы CMOS. Значения подтягивания — это компромисс: слишком сильное приводит к потере энергии; слишком слабый делает время нарастания медленным и открывает окно для шумовой связи. В шумной среде — рядом с драйвером двигателя, импульсным регулятором или чем-либо еще с ШИМ — I²C может дать сбой. В протоколе нет встроенного средства обнаружения ошибок, кроме бита ACK (некоторые датчики добавляют в полезную нагрузку байт CRC, что помогает).
Шумовые характеристики SPI
Двухтактные драйверы CMOS активно управляют как высокими, так и низкими состояниями. Края острые. Линия CS шлюзует именно тогда, когда ведомое устройство должно слушать, игнорируя все остальное на шине. По своей сути лучшее SNR.
На практике чистая разводка печатной платы с короткими дорожками, плоскостью заземления и байпасными конденсаторами обеспечит работу I²C в большинстве проектов. Но если ваш датчик подключен к кабелю на расстоянии метра от микроконтроллера или находится в одном корпусе с чем-либо, что коммутирует ток в амперах, помехоустойчивость SPI является настоящим преимуществом.
Итог по шуму: SPI — более безопасный выбор в электрически агрессивных средах. На той же печатной плате, находящейся в нескольких сантиметрах от микроконтроллера, I²C в порядке.
Сложность прошивки: тай-брейк, о котором никто не говорит
Прошивка I²C
A state machine. Start condition → send address + R/W bit → wait for ACK → read/write register pointer → read/write data → stop condition. Every step has a timeout, a retry path, and a "what if the sensor holds SDA low because it's still converting" case. Most MCU vendors provide a HAL. Most of those HALs have edge-case bugs you'll discover at 11 PM.
SPI-прошивка
Assert CS → shift bytes → de-assert CS. That's it. The sensor doesn't get to say "I'm not ready" by clock-stretching or NAKing. The master controls the clock; the slave responds or stays silent.
Отладочная боль: Когда SPI не работает, вы проверяете четыре строки логическим анализатором и видите, что именно происходит. Когда I²C не работает, вы смотрите на экран, полный NAK, и задаетесь вопросом, дело ли в подтягивающих значениях, адресе, времени или емкости шины. Логический анализатор стоимостью 8 долларов решает обе проблемы, но I²C отнимет у вас больше времени.
Итог по прошивке: SPI меньше раздражает «голое железо». С HAL или библиотекой это примерно пустяк. I²C требует больше времени для отладки, когда он выходит из строя.
Энергопотребление: оба являются ошибками округления
Шина I²C 400 кГц с подтягивающими сопротивлениями 4,7 кОм горит примерно 00,7 мА пока активен. SPI практически ничего не сжигает на уровне шины — чисто ток переключения CMOS на этих скоростях (микроамперы).
Context: the pressure sensor element and ADC draw ~5 µA at 1 Hz sampling and 0.3 µA in standby. Whether the bus burns 0.5 mA or 0.05 mA for the 2 ms it takes to read a sample — the energy difference is picowatt-hours. Your BLE radio burns more power sending one "hello" packet than the bus choice will save across the sensor's entire operating lifetime.
Итог по питанию: не выбирайте I²C или SPI в зависимости от мощности. Разница слишком мала, чтобы иметь значение. Вместо этого определитесь с выводами, шумом или работоспособностью прошивки.
Последовательность принятия решений — четыре вопроса, без матрицы
1Сколько одинаковых датчиков на одной шине?
Никакого преимущества в любом случае. Переходим к вопросу 2.
Два адреса, два провода. Если датчики далеко друг от друга — тогда SPI.
Если только вам не нравится читать таблицы данных мультиплексора I²C.
2На каком расстоянии датчик от MCU?
I²C работает на уровне платы с чистой компоновкой.
Или I²C с дифференциальным буфером (PCA9615). I²C никогда не предназначался для кабелей.
Используйте 4–20 мА или RS-485. Вы находитесь на территории промышленных передатчиков.
3Какова среда EMI?
Чистая компоновка с байпасными крышками обеспечивает удобство I²C.
Двухтактные драйверы и стробирование CS предотвратят фантомные показания.
4Это ты драйвер пишешь?
Абстракция делает разницу незначительной. Используйте то, что использует остальная часть доски.
Меньше состояний, нет растягивания часов, нет конфликтов адресов.
Большинство библиотек датчиков любителей по умолчанию используют I²C. Сначала проверьте библиотеку.
The "Why Not Both" Card
Двойной интерфейсНекоторые датчики поставляются с и I²C, и SPI на одном кристалле, выбирается через контактную планку или бит регистра. Это действительно полезно в двух сценариях:
Гибкость прототипирования
Начните с I²C на Arduino или коммутационной плате, потому что его проще подключить. Когда вы создаете свою собственную печатную плату, переключитесь на SPI, если это принесет пользу вашей разводке. Тот же датчик, та же логика прошивки, просто другой вызов HAL.
Гибкость производства SKU
Один дизайн печатной платы, разные артикулы. Один SKU использует I²C, поскольку он использует общую шину с датчиком температуры/влажности. Другим требуется SPI для более длительных трассировок до платы удаленного датчика. Вы ничего не переделываете — меняете линию спецификации и резисторную планку.
Если ваш кандидат на датчик не поддерживает обе шины, это не является препятствием. Но возможность выбора — это одна из тех вещей, которые вы не оцените, пока не начнете повторно крутить доску в 2 часа ночи.
Параллельное резюме
| Фактор | I²C | SPI | Победитель |
|---|---|---|---|
| Количество проводов | 2 | 4 + 1 на датчик | I²C |
| Скорость | До 3,4 МГц | До 50 МГц | Связь — датчик АЦП является узким местом |
| Мультисенсор (того же типа) | Макс. 2 без мультиплексора | Без ограничений (один CS на датчик) | SPI за пределами 2 датчиков |
| Помехоустойчивость | Открытый сток, края RC | Двухтактная CMOS, острые края | SPI |
| Сложность прошивки | Конечный автомат, ACK/NAK, таймауты | Подтверждение CS, сдвиг байтов, готово | SPI (голый металл); Галстук (с HAL) |
| Сложность отладки | Сложнее — НАК охота | Проще — простые сигналы | SPI |
| Потребляемая мощность | ~0,7 мА (подтягивания активны) | ~0 мА (без подтягиваний) | Ничья — дельта — это пиковатт-часы. |
| Кабельные трассы | Не рекомендуется >200 мм | Выдерживает более длинные следы | SPI |
| Внешние компоненты | 2 × подтягивающих резистора | Никто | Связь — 2 резистора × 0402 ≈ 0,002 доллара США. |
ТЛ;ДР
Не знаете, нужен ли вам в первую очередь датчик абсолютного, избыточного или дифференциального давления? Прочтите руководство на простом английском языке →
Не уверены, какой интерфейс подойдет вашему дизайну? Сообщите нам свой MCU, ограничения вашей платы и вашу среду — мы укажем вам нужную часть, обычно в течение часа.
Свяжитесь с нами →



