在Arduino Mega上处理两个SPI设备

时间:2015-03-20 04:31:43

标签: arduino spi

首先,如果重复这个问题我会道歉。

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

是否可以将引脚53(默认芯片选择引脚)以外的另一个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();
}

这次尝试是否正确?

1 个答案:

答案 0 :(得分:2)

是。 注意SS作为其他引脚是多功能的。因为它是正常的GPIO和SPI的从机选择。如果您的应用程序是使用SPI作为主服务器,请释放SS。它有一个约束条件,当SPI为主时,SS必须是输出。如果是输入则将SPI改为主设备。

因此,在主模式下,当从器件选择其他器件时,可以自由使用任何GPIO引脚(注意其约束)。如上面的代码示例基本上是正确的。

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

也不一定需要SPI.end()。它只清除SPI ENable位。

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);