Пример кода SPI с несколькими ведомыми устройствами Arduino DUE

Я пытаюсь заставить 2 устройства (камеру и SD-карту) работать на интерфейсе SPI с Arduino DUE. У меня возникли проблемы с поиском в сети примера кода, показывающего, как взаимодействовать с несколькими подчиненными устройствами на DUE, поскольку я знаю, что это немного отличается от UNO.
У меня есть следующие вопросы: Как вы указываете, что хотите связаться с подчиненным устройством на выводе 4? Вместо digitalWrite(4,LOW) вы вызываете SPI.begin(4)? и т. д.

Может ли кто-нибудь опубликовать пример кода?

, 👍0


1 ответ


Лучший ответ:

2

Все, что вам нужно, есть здесь — нужно только знать, как это собрать:

Существуют варианты всех основных методов, которые принимают дополнительный параметр — этот параметр является первым параметром в списке параметров и определяет 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 перед первой передачей и повышения его после последней передачи.

,