【问题标题】:SPI Communication RaspberryPI ArduinoSPI 通信 RaspberryPI Arduino
【发布时间】:2017-01-30 16:31:11
【问题描述】:

我正在尝试在 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;
      }
  }
} 

所以,我只是希望,如果我向 throw 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,循环进入 while 行并返回相同的输入值。如果我再次发送一个值,Arduino 会以正确的方式回复我。

有人可以帮助我吗?

【问题讨论】:

    标签: c++ arduino raspberry-pi spi


    【解决方案1】:

    我找到了解决问题的方法。

    发送和接收消息之间的差异是由 Arduino SPI 数据寄存器 (SPDR) 引起的。 SPDR 由一个 8 位移位寄存器和一个 8 位接收缓冲器定义。当主机发送一个字节时,它被存储在接收缓冲区中,移位寄存器中的字节被发送回主机。所以我们需要发送另一条消息来获得正确的响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-05
      • 2019-06-14
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      相关资源
      最近更新 更多