Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么SPI.transfer()在我第二次调用它时会冻结?_C_Arduino_Spi_Xbee - Fatal编程技术网

C 为什么SPI.transfer()在我第二次调用它时会冻结?

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的字节数组

我正在尝试学习如何让Arduino通过SPI与XBee PRO S3B模块通话。作为一个hello world,我想我会尝试阅读一些关于XBee模块配置的信息(特别是它的DL设置)。读取此信息需要首先通过SPI发送一个8字节长的命令

我使用Arduino SPI库的
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()之间的区别是什么)