Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Шина SPI (Serial Peripheral Interface, Последовательный периферийный интерфейс), в отличие от I2C, может применяться для одновременной передачи данных в обоих направлениях и с разными скоростями, в зависимости от типа используемого микроконтроллера. Однако сами взаимодействия все так же осуществляются по схеме ведущий/ведомый: плата Arduino играет роль ведущего устройства и определяет, с каким устройством (ведомым) она будет взаимодействовать.
Каждое устройство, поддерживающее подключение к шине SPI, имеет четыре линии, по которым осуществляется обмен данными: MOSI (Master-Out, Slave-In — ведущий посылает, ведомый принимает), MISO (Master-In, Slave-Out — ведущий принимает, ведомый посылает), SCK (Serial Clock Line, тактовая линия) и SS или CS (Slave Select или Chip Select — выбор ведомого или выбор устройства). Контакты с D11 по D13 на плате зарезервированы для подключения линий MISO, MOSI и SCK шины SPI, но линию SS можно подключить к любому другому цифровому контакту (часто для этого используется контакт D10, потому что он расположен рядом с контактами, зарезервированными для шины SPI).
В состав Arduino IDE входит библиотека SPI с двумя примерами .
Если используется одно устройство, его подключают к выводу D10 и сразу устанавливают значение HIGH, потому что большинство SPI-устройств переходят в активное состояние, когда на линии SS устанавливается низкий уровень. Затем происходит инициализация библиотеки. Существует два способа работы с данными. Некоторые устройства сначала посылают старший бит, а некоторые посылают его последним. Метод setBitOrder() позволяет задать порядок через константы MSBFIRST или MSBLAST.
#include <SPI.h>
void setup() {
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
// инициализация SPI:
SPI.begin();
SPI.setBitOrder(order); // на выбор
}
Чтобы послать данные SPI-устройству, сначала нужно установить на линии SS уровень LOW и таким образом сообщить устройству, что оно выбрано ведущим устройством (платой Arduino) для взаимодействий. А затем послать необходимое количество байтов данных соответствующим количеством вызовов следующей функции, — то есть эту функцию придётся вызвать для каждого байта:
SPI.transfer(byte);
Завершив взаимодействие с устройством, следует установить уровень HIGH на линии SS, чтобы сообщить устройству, что плата Arduino завершила сеанс связи. Каждое SPI-устройство должно подключаться отдельной линией SS. Например, если к шине SPI подключено два устройства, линия SS, соединяющая второе устройство, подключается к контакту D9 на плате Arduino.
RFID-модуль RC522 работает по протоколу SPI.