SPI (Serial Peripheral Interface) — последовательный переферийный интерфейс, предложенный компанией Motorola в середине 80-х и широко применяемый для соединения электронных устройств до сих пор.
В чем идея? Есть главное устройство (ведущее устройство, master), которое управляет несколькими ведомыми (slave). К одному ведущему по общей шине могут подключиться несколько ведомых.
Кроме питания и земли есть 4 основных контакта для обмена данными. Информация может передаваться в обоих направлениях:
- MISO (master in slave out) — служит для передачи данных от ведомого устройства ведущему.
- MOSI (master out slave in) — служит для передачи данных от ведущего устройства ведомому.
- SCLK (=SCK, slave clock) — тактовый сигнал, задаваемый ведущим устройством, для синхронизации с ведомыми.
- SS (slave select) — вывод на ведомом устройстве для выбора этого ведомого устройства. Когда на нем логический 0, устройство взаимодействует с SPI-шиной, когда 1 — перестает. За счет этого можно по очереди подключаться к разным ведомым устройствам.
Есть ли такой интерфейс у Arduino и Raspberry? Да. Для указанного порядка пинов на Arduino UNO 13-10. На Arduino MEGA это выводы 50-53. На Raspberry Pi это GPIO-выходы 7-11.
Вместо стандартных пинов можно использовать специально предназначенную колодку ICSP. На ней нет SS вывода, так как обычно Arduino является ведущим устройством, но можно использовать любой из цифровых пинов.
Есть уже готовые программные решения? Конечно, например в Arduino достаточно подключить библиотеку SPI.h.
В чем преимущества? В отличие от I2C и UART требует больше сигналов, но зато работает на более высоких скоростях, потребляет меньше энергии и в отличие от I2C не требуется использовать подтягивающие резисторы. Обычно скорость ограничена быстродействием подключаемого устройства, а не самой шиной.
Когда использовать? Используйте SPI, когда вам нужно быстро взаимодействовать с несколькими устройства, поддерживающих этот интерфейс.