Пример кода SPI с несколькими ведомыми устройствами Arduino DUE
Я пытаюсь заставить 2 устройства (камеру и SD-карту) работать на интерфейсе SPI с Arduino DUE. У меня возникли проблемы с поиском в сети примера кода, показывающего, как взаимодействовать с несколькими подчиненными устройствами на DUE, поскольку я знаю, что это немного отличается от UNO.
У меня есть следующие вопросы:
Как вы указываете, что хотите связаться с подчиненным устройством на выводе 4? Вместо digitalWrite(4,LOW) вы вызываете SPI.begin(4)? и т. д.
Может ли кто-нибудь опубликовать пример кода?
@bakalolo, 👍0
1 ответ
Лучший ответ:
Все, что вам нужно, есть здесь — нужно только знать, как это собрать:
Существуют варианты всех основных методов, которые принимают дополнительный параметр — этот параметр является первым параметром в списке параметров и определяет SS Pin для использования этой функцией. Это включает функцию .transfer()
.
Чтобы использовать его, вам нужно begin()
все пины, с которыми вы хотите использовать SPI. Затем вы можете использовать .transfer()
с этими пинами:
void setup() {
SPI.begin(10);
SPI.begin(4);
}
void loop() {
// Прием с использованием контакта 10 в качестве SS
byte byteFromTen = SPI.transfer(10, 0x00);
// Передать 123, используя контакт 10 как SS
SPI.transfer(10, 123);
// В обоих направлениях:
byte otherByteFromTen = SPI.transfer(10, 123);
// Прием с использованием контакта 4 в качестве SS
byte byteFromFour = SPI.transfer(4, 0x00);
// Передать 123, используя контакт 4 как SS
SPI.transfer(4, 123);
// В обоих направлениях:
byte otherByteFromTen = SPI.transfer(4, 123);
}
Выполнение многобайтовых передач немного сложнее, поскольку у вас нет контроля над выводом SS, поэтому вам придется использовать еще одну версию функции transfer()
, которая сообщает ей о необходимости «продолжить» транзакцию:
// Получение 3 байтов с использованием контакта 4:
byte firstByte = SPI.transfer(4, 0x00, SPI_CONTINUE);
byte secondByte = SPI.transfer(4, 0x00, SPI_CONTINUE);
byte thirdByte = SPI.transfer(4, 0x00);
Конечно, смешивание чтения и записи почти такое же, как обычно. Например, чтение значений порта A из MCP23S17 будет выглядеть так:
SPI.transfer(4, 0x41, SPI_CONTINUE); // Адрес 0, бит чтения установлен
SPI.transfer(4, 0x12, SPI_CONTINUE); // Выбор регистра 0x12 (GPIOA)
byte porta = SPI.transfer(4, 0x00);
SPI_CONTINUE
сообщает системе SPI о необходимости поддерживать вывод SS в состоянии LOW. Он повышается только после получения .transfer()
без SPI_CONTINUE
. Это то же самое, что и традиционный способ использования digitalWrite()
для понижения SS перед первой передачей и повышения его после последней передачи.
- Программирование ведомого SPI для Arduino
- Использование экрана SD-карты на Arduino Due
- Запуск передачи SPI с помощью прерывания в Arduino Due
- 16-битный SPI на Arduino Due
- Поддерживает ли MFRC522 собственный SPI Arduino Due?
- Проблема с настройкой Arduino Due SPI на АЦП.
- Отправка данных через SPI с DMA
- Arduino Due как Triggered DMA SPI Slave - возможно?