首先,如果重复这个问题我会道歉。
我在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();
}
这次尝试是否正确?
答案 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);