2017-01-30 19 views
0

私は、RaspberryPI B +(マスタ)とArduino Uno(スレーブ)の間で全二重SPI通信を確立しようとしています。SPI通信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; 
} 

スレーブ側のコード

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

私の問題についての解決策が見つかりました。

Arduino SPIデータレジスタ(SPDR)が送信メッセージと受信メッセージの不一致を引き起こしました。 SPDRは、8ビットのシフトレジスタと8ビットの受信バッファで定義されます。マスタがバイトを送信すると、それは受信バッファに格納され、シフトレジスタのバイトはマスタに返されます。したがって、適切な応答を返すために別のメッセージを送信する必要があります。

関連する問題