Использование расширенных возможностей SPI на Arduino Due
Микроконтроллер SAM3X на Arduino Due предоставляет разработчику расширенные возможности по работе с интерфейсом SPI. При этом можно использовать как расширенное API, так и традиционный подходы, характерные платам на базе AVR-микроконтроллеров.
Расширенное API в качестве линий CS позволяет использовать выводы 4, 10 и 52.
Как пользоваться
Вначале необходимо указать выводы, которые будут использоваться в качестве линий CS для каждого SPI-устройства.
Arduino Due может автоматически управлять этими выводами, распределяя доступ к шине SPI между ведомыми устройствами. При этом каждое устройство может иметь индивидуальные настройки SPI-интерфейса, такие, как режим работы и скорость передачи данных.
Таким образом, для управления несколькими ведомыми устройствами необходимо объявить соответствующие им выводы CS в функции setup(). Ниже показан пример работы с двумя устройствами, расположенными на одной SPI-шине. Вывод CS одного устройства подключен к выводу 4, другого - к выводу 10.
void setup(){ // инициализируем шину для устройства, подключенного к выводу 4 SPI.begin(4); // инициализируем шину для устройства, подключенного к выводу 10 SPI.begin(10); }
После объявления выводов CS, каждому ведомому устройству можно задать индивидуальные настройки интерфейса SPI. Например, если устройства работают на разной тактовой частоте, функция setup() будет выглядеть следующим образом:
void setup(){ // инициализируем шину для устройства, подключенного к выводу 4 SPI.begin(4); // устанавливаем для этого устройства коэффициент деления тактовой частоты 21 SPI.setClockDivider(4, 21); // инициализируем шину для устройства, подключенного к выводу 10 SPI.begin(10); // устанавливаем для этого устройства коэффициент деления тактовой частоты 84 SPI.setClockDivider(10, 84); }
Простая передача байта ведомому устройству, подключенному к выводу 4, будет выглядеть так:
void loop(){ byte response = SPI.transfer(4, 0xFF); }
В результате выполнения этого кода, значение "0xFF" будет отправлено SPI-устройству, подключенному к выводу 4, а ответные данные, пришедшие от устройства по линии MISO, будут помещены в переменную response. Управление линией CS осуществляется контроллером интерфейса SPI автоматически. Таким образом, команда transfer выполняет следующие операции:
- активизирует ведомое устройство, формируя на выводе 4 низкий уровень сигнала (LOW)
- отправляет значение 0xFF по шине SPI и возвращает полученный байт
- отключает ведомое устройство от шины SPI, формируя на выводе 4 высокий уровень сигнала (HIGH)
Также возможна отправка нескольких байт за одну транзакцию. Для этого команде transfer необходимо указать параметр, который заставит ее не отключать ведомое устройство после передачи байта:
void loop(){ //передаем 0x0F устройству, подключенному к выводу 10, оставляя его активным SPI.transfer(10, 0xF0, SPI_CONTINUE); //передаем 0x00 устройству, подключенному к выводу 10, оставляя его активным SPI.transfer(10, 0x00, SPI_CONTINUE); //передаем 0x00 устройству, подключенному к выводу 10, и сохраняем полученный //байт в переменной response1. По прежнему оставляем устройство активным byte response1 = SPI.transfer(10, 0x00, SPI_CONTINUE); //передаем 0x00 устройству, подключенному к выводу 10, и сохраняем полученный //байт в переменной response2, отключая устройство. byte response2 = SPI.transfer(10, 0x00); }
Параметр SPI_CONTINUE заставляет ведомое устройство быть активным между передачами. При передаче последнего байта этот параметр не указывается.
См. справку по функциям setClockDivider(), setDataMode(), transfer(), setBitOrder() для получения дополнительной информации об их синтаксисе при использовании расширенного API.
Примечание: после вызова функции SPI.begin(), вывод, переданный ей в качестве параметра, нельзя использовать в качестве вывода общего назначения.