我正在尝试在RaspberryPI B+ (主)和Arduino Uno (从)之间建立全双工SPI通信。
主控端代码:
#include<sys/ioctl.h>
#include<linux/spi/spidev.h>
#include<fcntl.h>
#include<cstring>
#include<iostream>
#include<unistd.h>
using namespace std;
int fd;
unsigned int val;
unsigned int result;
int spiTxRx(unsigned int txDat);
int main(void){
fd = open("/dev/spidev0.0",O_RDWR);
unsigned int speed = 1000000;
ioctl(fd,SPI_IOC_WR_MAX_SPEED_HZ,&speed);
int ret = 0;
while(ret <=5){
ret++;
cout<<"input:";
cin>>val;
result=spiTxRx(val);
cout<<result<<endl;
usleep(10);
}
close(fd);
}
int spiTxRx(unsigned int txDat){
unsigned char rxDat;
struct spi_ioc_transfer spi;
memset(&spi,0,sizeof(spi));
spi.tx_buf = (unsigned long) &txDat;
spi.rx_buf = (unsigned long) &rxDat;
spi.len = 1;
ioctl (fd, SPI_IOC_MESSAGE(1), &spi);
return rxDat;
}从机端代码
byte clr;
int x = 0;
int readInput;
void setup (void){
Serial.begin (9600);
// have to send on master in, *slave out*
pinMode(MISO, OUTPUT);
// turn on SPI in slave mode. SPCR determine Arduino SPI settings
SPCR |= _BV(SPE);
clr = SPSR;
clr = SPDR;
delay(10);
}
void loop (void){
if ((SPSR & _BV(SPIF)) !=0){ //if byte has been received
readInput = SPDR;
if (readInput == 7){
x++;
SPDR = x;
}
}
} 所以,简单地说,我希望如果我发送一个输入(在这个例子中是7),Arduino递增变量x,并回复我x的值。
但我的输出如下所示:
init: x = 0;
(1st input)
Master send 7, Slave add x (so, x=1) and send me back unusual value
(2nd input)
Master send 7, Slave add x (x=2) and send me back 1 (previous value of x)
(3rd input)
Master send 7, slave add x (x=3) and send me back 2 (previous value of x)
(Nth input)
Master send 7, slave add x (x = k) and send me back k-1换句话说,如果我发送7,Arduino递增x,在while行中循环,并将相同的输入值返回给我。如果我再次发送一个值,Arduino会回复我正确的响应。
有人能帮帮我吗?
发布于 2017-02-01 00:07:11
我找到了解决我的问题的办法。
发送和接收消息之间的差异是由Arduino SPI数据寄存器(SPDR)引起的。SPDR由一个8位移位寄存器和一个8位接收缓冲器定义。当主机发送一个字节时,该字节被存储在接收缓冲器中,移位寄存器中的字节被发送回主机。因此,我们需要发送另一条消息来获得正确的响应。
https://stackoverflow.com/questions/41940870
复制相似问题