Глеб Гончаров

Системный администратор в ФанБоксе. Автоматизирую и сопровождаю инфраструктуру для проектов мобильных операторов.

Поддержка ведомых устройств в шине SPI Raspberry Pi

На днях решил научиться собирать метрики с отечественного монитора качества воздуха MasterKit MT8060, чтобы посчитать оптимальную частоту проветривания помещений в офисе. До этого мой опыт работы ограничивался лабораторными работами в университете, потому решил собрать первый прототип на Raspberry Pi 1 model B со знакомым окружением Linux Raspbian.

В Raspberry Pi работают с шиной SPI несколькими способами:

Третий способ удобнее, если вы пишете программу на языке отличном от C. Например, библиотека spidev, periph и gobot используют его для чтения и записи SPI.

В ходе исследования пришёл к неутешительному выводу, что реализовать задуманное будет непросто. Причиной тому отсутствие поддержки SPI slave в ядре Linux для Broadcom BCM2835, позволяющей хосту выступать в роли ведомого.

Этим вопросом задавались и другие пользователи чипа в 2015 году. Предположу, что если вопрос с поддержкой не был решён за три года, то прождать можно ещё долго. Моих же умений недостаточно для разработки своего модуля ядра или изменения кода существующего.

Возможно реализовать протокол в пространстве пользователя и управлять GPIO вручную. К сожалению, такой подход будет неэффективным из-за высокого потребления CPU от постоянного поллинга сигнала на пинах.

Ещё можно воспользоваться наработками Тайлера Никольса по использованию SPI в Raspberry Pi без Linux. Однако решение кажется излишне расточительным для чтения трёх метрик в секунду.

Выходит, практичнее приобрести микроконтроллер на Arduino и запрограммировать его. Или, если вы ещё выбираете датчик, возьмите MasterKit 8057S с поддержкой вывода метрик по USB. Для него даже есть пример приложения под Linux.