在 Arduino Mega 上处理两个 SPI 设备

Handling two SPI devices on Arduino Mega

首先,如果重复这个问题,我深表歉意。

我在 Arduino Mega 和 SPI 中使用两个 DWM1000 模块(数据表:Decawave DWM1000)与它们通信。我只与一个模块通信没有问题。但我需要至少使用两个模块,一个作为发射器,另一个作为接收器。

是否可以将引脚 53(默认芯片 select 引脚)以外的另一个 GPIO 引脚分配为第二个模块的 SS 引脚?

void setup() {
  pinMode(53, OUTPUT);
  pinMode(45, OUTPUT);
  SPI.begin();

  digitalWrite(53, LOW);
  // communicating first module here using SPI.transfer()
  // MOSI and MISO data transfer have to go between a LOW digitalWrite and a HIGH digitalWrite
  digitalWrite(53, HIGH);

  digitalWrite(45, LOW);
  // communicating second module here using SPI.transfer()
  digitalWrite(45, HIGH);

  SPI.end();
}

这个尝试是否正确?

是的。 请注意 SS,因为其他引脚都是多功能的。因为它是普通的 GPIO 和 SPI 的从设备 Select。您的应用程序将 SPI 用作主机,从而释放 SS。它有一个限制,即当 SPI 为主时,SS 必须是输出。如果是输入,则 SPI 不再是主控。

所以在主控模式下,可以自由使用任何 GPIO 引脚(注意它们的限制)作为从属选择到其他设备。如您上面的代码示例基本正确。

为了将来参考,您可能需要在每次使用时设置其他 SPI 参数。如果您混合使用不同类型的设备。说一个 SdCard、Temp Sense、Audio 等...因为它们每次都会设置它们的 SPI 参数并且可能会干扰你的。不必假设 SPI 是您离开时的样子。

另外 SPI.end() 也不是必须的。它仅清除 SPI 启用位。

pinMode(53, OUTPUT);
pinMode(45, OUTPUT);
SPI.begin();

digitalWrite(53, LOW);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(spi_Write_Rate);      

SPI.transfer(0x02); //send your stuff
//...
digitalWrite(53, HIGH);

digitalWrite(45, LOW);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(spi_Write_Rate);      

SPI.transfer(0x02); //send your stuff
//...
digitalWrte(45, HIGH);