Я пытаюсь установить связь между 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» равны нулю.
Поэтому я предполагаю, что инициализация интерфейса не является правильной / полной. Я что-то пропустил?
Любая помощь очень ценится.