在Arduino上设置ATSAM3X8E以进行SPI从设备操作

时间:2018-11-13 21:24:49

标签: raspberry-pi spi slave arduino-due

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

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

参见ATSAM3X8E datasheet

  • 9.3 I / O线上的外围信号多路复用
  • 31.4.1引脚复用