C 为什么SPI.transfer()在我第二次调用它时会冻结?
我正在尝试学习如何让Arduino通过SPI与XBee PRO S3B模块通话。作为一个hello world,我想我会尝试阅读一些关于XBee模块配置的信息(特别是它的DL设置)。读取此信息需要首先通过SPI发送一个8字节长的命令 我使用Arduino SPI库的C 为什么SPI.transfer()在我第二次调用它时会冻结?,c,arduino,spi,xbee,C,Arduino,Spi,Xbee,我正在尝试学习如何让Arduino通过SPI与XBee PRO S3B模块通话。作为一个hello world,我想我会尝试阅读一些关于XBee模块配置的信息(特别是它的DL设置)。读取此信息需要首先通过SPI发送一个8字节长的命令 我使用Arduino SPI库的SPI.transfer()函数一次发送一个字节的命令。看起来我可以很好地发送第一个字节——问题是,在我第二次调用SPI.transfer()时,代码似乎冻结了 在我的代码中,命令的数据存储在一个名为AT_getDL_CMD的字节数组
SPI.transfer()
函数一次发送一个字节的命令。看起来我可以很好地发送第一个字节——问题是,在我第二次调用SPI.transfer()
时,代码似乎冻结了
在我的代码中,命令的数据存储在一个名为AT_getDL_CMD
的字节数组中,其长度(8)存储在AT_getDL_LEN
中。以下是守则的相关部分:
// start the SPI library:
SPI.beginTransaction(SPISettings(3000000, MSBFIRST, SPI_MODE0));
// initalize the pins:
pinMode(SPI_ATTN, INPUT);
pinMode(SPI_SSEL, OUTPUT);
digitalWrite(SPI_SSEL, LOW);
// wait a little bit for the radio to be ready:
delay(1000);
Serial.println("Sending getDL API command");
for (int i = 0; i < AT_getDL_LEN; i++) {
Serial.print(SPI.transfer(AT_getDL_CMD[i]));
Serial.print(", ");
}
//启动SPI库:
SPI.beginTransaction(SPISettings(3000000,MSBFIRST,SPI_MODE0));
//初始化引脚:
引脚模式(SPI_附件,输入);
pinMode(SPI_SSEL,输出);
数字写入(SPI_SSEL,低);
//请稍等收音机准备好:
延迟(1000);
Serial.println(“发送getDL-API命令”);
for(int i=0;i
我从中得到的结果是:
发送getDL-API命令
0,
因此,循环似乎只运行一次迭代,但在第二次迭代中调用SPI.transfer()
时会冻结
这可能是什么原因造成的?这更可能是Arduino端的问题,还是XBee端的问题?我是否错误地使用了SPI库?可以肯定的是,在Arduino端,SPI总线没有任何应答/握手机制。即使另一端没有从设备,您也可以进行传输(在本例中,将接收垃圾—MISO引脚的逻辑状态)。那么,当我调用SPI.transfer()时,它是否会被占用?我在这里查看了一下,似乎还有
SPI.begin()代码>尝试在循环之前调用此。谢谢!看来这已经解决了。我假设begin()和beginTransaction()都做了同样的事情。现在我需要弄清楚区别是什么(end()和endTransaction()之间的区别是什么)。在Arduino端,SPI总线没有任何确认/握手机制。即使另一端没有从设备,您也可以进行传输(在本例中,将接收垃圾—MISO引脚的逻辑状态)。那么,当我调用SPI.transfer()时,它是否会被占用?我在这里查看了一下,似乎还有SPI.begin()代码>尝试在循环之前调用此。谢谢!看来这已经解决了。我假设begin()和beginTransaction()都做了同样的事情。现在我需要弄清楚区别是什么(end()和endTransaction()之间的区别是什么)