Arduino SPI在传输过程中挂起
Arduino SPI hangs during transfers
我正在进行一个项目,不知所措。我设法让2个Arduino通过SPI相互交谈,但在一系列传输过程中,从属设备似乎毫无理由地停止了。
真正令人不安的是,如果我从大师那里发送更多的传输,它就会继续这个系列,就好像它在等待继续一样。
我想有一些确认或标志可以停止代码执行,但我不知道。
#include <SPI.h>
boolean ack = 0;
#define ACK 2
byte buffer = 0;
byte rx = 0;
bool SSlast = HIGH;
byte clr = 0;
void stat_upd(byte dat, byte ric) {
Serial.println("---------------------------------------------");
Serial.println("Sent:");
Serial.println(dat, HEX);
Serial.println("Received:"); // 0x81 in teoria
Serial.println(ric, HEX);
return;
}
// Initialize SPI slave.
void SlaveInit(void) {
// Initialize SPI pins.
pinMode(SCK, INPUT);
pinMode(MOSI, INPUT);
pinMode(MISO, INPUT);
pinMode(SS, INPUT);
pinMode(ACK, OUTPUT);
// Enable SPI as slave.
SPCR = 0x6F;
clr = SPSR;
clr = SPDR;
SPI.begin();
}
// SPI Transfer.
byte SPItransfer(byte value) {
byte temp = 0;
SPDR = value;
// temp =SPI.transfer(value);
while (!(SPSR & (1 << SPIF)));
digitalWrite(ACK, LOW);
delay(1);
digitalWrite(ACK, HIGH);
delay(10);
return SPDR;
}
// The setup() function runs after reset.
void setup() { ///////////////// setup
Serial.begin(9600);
SlaveInit();
Serial.println("MC Initialized");
}
void loop() { ////////////// loop
// Slave Enabled?
if (!digitalRead(SS)) {
rx = SPItransfer(0x00);
stat_upd(0x00, rx);
rx = SPItransfer(0x08);
stat_upd(0x08, rx);
rx = SPItransfer(0x5a);
stat_upd(0x5a, rx);
rx = SPItransfer(0x5d);
stat_upd(0x5d, rx);
rx = SPItransfer(0x5c);
stat_upd(0x5c, rx);
rx = SPItransfer(0x5d);
stat_upd(0x5d, rx);
rx = SPItransfer(0x04);
stat_upd(0x04, rx);
rx = SPItransfer(0x00);
stat_upd(0x00, rx);
rx = SPItransfer(0x00);
stat_upd(0x00, rx);
rx = SPItransfer(0x80);
stat_upd(0x80, rx);
}
}
这是一个猜测,但我对Arduino代码的猜测通常是正确的。
检查您是如何通过Master发送数据的。
根据该代码,从设备等待SS引脚变低,然后与SPI通信,然后清除ack引脚1毫秒,然后通过串行端口将通信数据发送到PC。
我在这里看到的问题是,1毫秒太小了,主机无法正确检测到它。
所以我的猜测是,你已经以这样的方式编写了主代码,它不看ACK引脚。这意味着主机将清除SS引脚,进行通信,然后立即清除SS引脚。
这是一个问题,因为一旦完成通信,从设备就会与串行端口进行通信。这意味着,当主设备再次将SS引脚设置为低电平时,从设备可能正在向串行监视器发送数据,并可能完全错过通信。
要解决此问题,您需要更改从属代码,以便在SS引脚为低电平时持续与主机通话,并且仅在SS引脚变高时将数据发送回串行监视器。
相关文章:
- 如何防止C++遗留代码中的挂起指针
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- 如何在C++中挂起和恢复 POSIX 线程?
- 程序在没有操作系统信号的情况下在函数中的特定行挂起
- 如何在C++中挂起程序,然后"取消挂起"它
- 如何在Cocos2d Android应用程序中获得呼叫/挂起事件
- 在 Qt 中使用基本类型时挂起
- Arduino SPI在传输过程中挂起
- zmq_ctx_destroy() 在 MFC dll 中挂起
- 在自定义组合框下拉列表控件上等待超过5秒会导致win32 C++应用程序在Windows7中挂起
- std::thread::join 在析构函数中挂起
- 线程安全的有界队列在 Boost 1.54 中挂起
- 在显示过程中,Openfiledialog被挂起
- 阻止取消Boost.Asio中挂起的异步操作
- 带有互锁操作的线程同步在Visual Studio 2013 c++原生代码中挂起
- exit(3)在Linux C++中挂起
- 如何在c++中挂起和恢复进程和线程
- 等待用户 IO 的 C++ 线程 ('getchar()') 在主进程中挂起'Py_Initialize()'