Описание
Микроконтроллер SAM3X на Arduino Due предоставляет разработчику расширенные возможности по работе с интерфейсом SPI. При этом можно использовать как расширенное API, так и традиционный подходы, характерные платам на базе AVR-микроконтроллеров.
Расширенное API в качестве линий SS позволяет использовать контакты 4, 10 и 52.
Использование
Вначале необходимо указать контакты, которые будут использоваться в качестве линий SS для каждого SPI-устройства.
Arduino Due может автоматически управлять этими контактами, распределяя доступ к шине SPI между ведомыми устройствами. При этом каждое устройство может иметь индивидуальные настройки SPI-интерфейса, такие, как режим работы и скорость передачи данных.
Таким образом, для управления несколькими ведомыми устройствами необходимо объявить соответствующие им выводы SS в функции setup(). Ниже показан пример работы с двумя устройствами, расположенными на одной SPI-шине. Вывод SS одного устройства подключен к контакту 4, другого - к контакту 10.
void setup(){
// инициализируем шину для устройства, подключенного к контакту 4
SPI.begin(4);
// инициализируем шину для устройства, подключенного к контакту 10
SPI.begin(10);
}
После объявления контакту SS, каждому Slave можно задать индивидуальные настройки интерфейса 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. Управление линией SS осуществляется контроллером интерфейса 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 заставляет ведомое устройство быть активным между передачами. При передаче последнего байта этот параметр не указывается.
Примечание: после вызова функции SPI.begin(), контакт, переданный ей в качестве параметра, нельзя использовать в качестве контакта общего назначения.
Смотрите также
begin()
end()
setBitOrder()
setClockDivider()
setDataMode()
transfer()
Библиотека SPI
Справочник
Материалы взяты с официального сайта проекта Arduino и представлены по лицензии Creative Commons Attribution-ShareAlike 3.0 License.
Источник: http://arduino.cc/en/Reference/SPITransfer |