Arduino:Библиотеки/SPI/Расширенное использование шины SPI на Due

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Расширенное использование шины 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 контакта общего пользования.

См.также

Внешние ссылки