Arduino:Библиотеки/SPI/Расширенное использование шины SPI на Due
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Расширенное использование шины SPI на Due[1]
Эти API в новых проектах использовать не нужно. Ее функционал передан объекту SPISettings и функции SPI.beginTransaction() – параметры SPI теперь настраиваются с помощью них.
Модель Arduino Due оснащена чипом SAM3X, который имеет продвинутые SPI-возможности. Вы можете использовать и эти расширенные функции, и те, что используются для AVR.
Расширенный API может использовать для SS контакты 4, 10 и 52.
Использование
Вам нужно указать SS-контакт для всех SPI-устройств, которые вы хотите использовать.
Модель Due умеет самостоятельно выполнять SS-переключение между разными устройствами, которые делят одну и ту же шину SPI. Кроме того, у каждого из этих девайсов могут быть разные параметры вроде скорости и режима передачи данных.
При использовании нескольких устройств с разными SS-контактами вам нужно объявить эти контакты в блоке setup(). В примере ниже имеется два устройства, которые пользуются одними и теми же MISO, MOSI и SCK. У одного устройства SS-линия подключена к 4-ому контакту, а у другого – к 10-ому.
void setup(){
// инициализируем шину для девайса на контакте 4:
SPI.begin(4);
// инициализируем шину для девайса на контакте 10:
SPI.begin(10);
}
Когда контакт будет объявлен SS-контактом, мы можем менять его настройки. К примеру, если устройства работают на разных тактовых частотах, блок setup() может выглядеть примерно так:
void setup(){
// инициализируем шину для девайса на контакте 4:
SPI.begin(4);
// устанавливаем разделитель частоты на 4-ом контакте на «21»:
SPI.setClockDivider(4, 21);
// инициализируем шину для девайса на контакте 10:
SPI.begin(10);
// устанавливаем разделитель частоты на 10-ом контакте на «84»:
SPI.setClockDivider(10, 84);
}
Передача одного байта на устройство, подключенное к 4-ому контакту, может выглядеть следующим образом:
void loop(){
byte response = SPI.transfer(4, 0xFF);
}
Во фрагменте выше «0xFF» передается SPI-девайсу на 4-ом контакте, и данные, идущие от MISO, сохраняются внутри переменной response. Выбор устройства выполняется автоматически SPI-контроллером, а команда передачи данных подразумевает следующее:
- Активация SS путем установки 4-ого контакта на LOW
- Отправка «0xFF» через SPI-шину и возвращение полученного байта
- Выключение SS путем установки 4-ого контакта на HIGH
За один раз можно передать и больше одного байта, но при этом функции SPI.transfer() нужно сказать, чтобы она не выключала SS у SPI-устройства после передачи данных:
void loop(){
// передача «0x0F» устройству на 10-ому контакте; SS остается включенным:
SPI.transfer(10, 0xF0, SPI_CONTINUE);
// передача «0x00» устройству на 10-ому контакте; SS остается включенным:
SPI.transfer(10, 0×00, SPI_CONTINUE);
// передача «0x00» устройству на 10-ому контакте; сохраняем полученный байт в response1, SS остается включенным:
byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE);
// передача «0x00» устройству на 10-ому контакте; сохраняем полученный байт в response2 и выключаем SS:
byte response2 = SPI.transfer(10, 0×00);
}
Параметр SPI_CONTINUE нужен для того, чтобы устройство оставалось выбранным между передачами данных. У последнего вызова SPI.transfer() параметра SPI_CONTINUE нет – значит, это последний отправленный байт.
Для использования расширенных функций нужно знать правильный синтаксис базовых функций setClockDivider(), setDataMode(), transfer() и setBitOrder(), найти который можно на соответствующих страницах.
Примечание: Как только будет вызвана функция SPI.begin(), объявленный контакт уже нельзя будет использовать в качестве I/O контакта общего пользования.