我正在尝试通过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启用”位也为零。 因此,我假设接口的初始化不正确/不完整。我错过了什么吗?
非常感谢您的帮助。
答案 0 :(得分:0)
使用pinMode(74, OUTPUT);
和类似的Arduino函数调用您只需更改引脚方向即可,而不能更改GPIO引脚的使用方式。要将这些引脚用作SPI线路,应设置引脚多路复用器。