SPI Связь RaspberryPI Arduino

Я пытаюсь установить полнодуплексную связь SPI между RaspberryPI B + (Master) и Arduino Uno (slave).

Основной код:

#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;
}
}
}

Итак, просто я хочу, чтобы, если я посылаю входную строку MOSI (в данном случае 7), Arduino увеличивает значение var 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, зацикливает в то время как строку и возвращает мне то же самое входное значение. Если я отправлю еще раз значение, Arduino ответит мне правильным ответом.

Кто-нибудь может мне помочь?

0

Решение

Я нашел решение по моей проблеме.

Расхождение между отправленным и полученным сообщением было вызвано регистром данных SPI Arduino (SPDR). SPDR определяется 8-битным сдвиговым регистром и 8-битным приемным буфером. Когда мастер посылает байт, он сохраняется в буфере приема, а байт в сдвиговом регистре отправляется обратно в мастер. Поэтому нам нужно отправить еще одно сообщение, чтобы получить правильный ответ.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]