2017-01-30 16 views
0

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

код Мастер-сторона:

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

Подчиненный-Side код

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

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

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^