我正在尝试通过 SPI 在 Raspberry Pi 3B+ 和 Arduino Due 之间建立通信。我选择了 Raspberry Pi 作为主机,而 Arduino 作为从机。因此,我为 Raspberry 编写了一些 C 代码,用于配置接口并通过 MOSI 线发送两个字节的数据。我用逻辑分析仪观察了信号,它们与预期的一样,芯片选择在发送过程开始时下降到零,然后再次上升。
为了对 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”的位也为零。因此我假设,接口的初始化不正确/不完整。我错过了什么吗?
任何帮助是极大的赞赏。