1

我正在尝试通过 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”的位也为零。因此我假设,接口的初始化不正确/不完整。我错过了什么吗?

任何帮助是极大的赞赏。

4

1 回答 1

0

使用pinMode(74, OUTPUT);和类似的 Arduino 函数调用您只需更改引脚方向但不会将引脚用法更改为 GPIO。要将这些引脚用作 SPI 线,您应该设置引脚多路复用器。

参见ATSAM3X8E 数据表

  • 9.3 I/O 线上的外设信号复用
  • 31.4.1 引脚复用
于 2018-11-17T17:07:17.497 回答