Настройка ATSAM3X8E на Arduino Due для работы ведомого SPI - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь установить связь между Raspberry Pi 3B + и Arduino Due через SPI. Я выбрал Raspberry Pi в качестве хозяина, а Arduino - в качестве раба. Поэтому я написал некоторый C-код для Raspberry, который конфигурирует интерфейс и отправляет два байта данных через линию MOSI. Я наблюдал за сигналами с помощью логического анализатора, они, как и ожидалось, Chip Select падает до нуля в начале процесса отправки и затем снова повышается.

Для программирования Arduino Due Я работаю с Arduino IDE. Поскольку Arduino SPI.h не поддерживает подчиненный режим, я хочу получить доступ к соответствующим регистрам на ATSAM3X8E напрямую. Во-первых, я определяю режим контактов SPI (номера выводов из «неофициальной» должной распиновки) как ввод / вывод. После этого я настраиваю регистры ATSAM3X8E для работы ведомого SPI. Настройки для CPOL и CPHA такие же, как на Raspberry. Поскольку делитель для скорости передачи последовательного тактового сигнала не может быть равен нулю, я выбрал самый большой доступный делитель, хотя я предполагаю, что этот параметр не имеет никакого эффекта, поскольку мастер определяет скорость передачи. Это код для конфигурации:

pinMode(74, OUTPUT);  // PIN_SPI_MISO
pinMode(75, INPUT);   // PIN_SPI_MOSI
pinMode(76, INPUT);   // PIN_SPI_SCK
pinMode(10, INPUT);   // Slave Select

REG_SPI0_CR   = 0x00000001;   // SPI Enable 

REG_SPI0_MR   = 0x00000000;   // Slave-Mode, Fixed Peripheral Select, 
                              // Chip  Select directly connected
                              // Mode Fault detection enabled, 
                              // Loopback disabled

REG_SPI0_WPMR = 0x00000000;   // Write Protection disabled

REG_SPI0_CSR  = 0x0000ff02;   // Chip select Register
                              // CPOL = 0, CPHA = 1 
                              // 8 Bit per transfer
                              // serial Clock Baud Rate of 84 MHz/255=330 kHz 

После этого в цикле биты регистра приема данных сохраняются в буфере:

unsigned int buf = 0;
buf = REG_SPI0_RDR & 0x0000ffff; // store 16 Bits of Receive Data Registers in buffer

Однако буфер остается пустым. Если я читаю биты регистра состояния, все биты равны нулю, даже биты для «Обнаружен восходящий фронт NSS» или «SPI Enbled» равны нулю. Поэтому я предполагаю, что инициализация интерфейса не является правильной / полной. Я что-то пропустил?

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 17 ноября 2018

Используя pinMode(74, OUTPUT); и аналогичные функции Arduino, вы просто меняете направление вывода, но не меняете его использование как GPIO.Для использования этих выводов в качестве линий SPI необходимо настроить мультиплексор выводов.

См. Таблицу данных ATSAM3X8E

  • 9.3 Мультиплексирование периферийных сигналов на линиях ввода / вывода
  • 31.4.1 Мультиплексирование контактов
...