« dsPIC DSPライブラリを試しに使ってみた。 | トップページ | 地味な話 ナル文字 strlenの注意 »

2018年11月11日 (日)

ArduinoをRaspberryPiとSPIでつなぐ

ラズパイのSPI通信のテスト環境として構築した。
こんな何でもないものでも色々注意が必要なポイントは一杯ある。

Arduino側ソース
クロックを受け取る毎にマスターに送信するデータを切り替える。
ここに書いたデータと関係ないデータが来ていたら通信がおかしいことがわかる。
でも大抵おかしければぐちゃぐちゃになるので、そんなに凝ったことを書かなくても十分わかる。

#include <SPI.h>
#define SS_PIN 10
#define SCK_PIN 13
#define MISO_PIN 12
#define MOSI_PIN 11

void setup() {
  Serial.begin(115200);
  Serial.println("Slave");

  pinMode(SS_PIN,INPUT);
  pinMode(SCK_PIN,INPUT);
  pinMode(MISO_PIN,OUTPUT);
  pinMode(MOSI_PIN,INPUT);

  SPI.setBitOrder(MSBFIRST);
  //SPI.setClockDivider(SPI_CLOCK_DIV2);//8MHz
  SPI.setClockDivider(SPI_CLOCK_DIV8);//2MHz
  SPI.setDataMode(SPI_MODE0);

  SPCR &= ~_BV(4);    //スレーブ設定
  SPCR |= _BV(6);   //SPI有効
  SPI.attachInterrupt();
}

ISR(SPI_STC_vect){
  static bool flip = false;
  byte ch;

  if(flip){
    ch = 0x55;
    flip = false;
  }
  else{
    ch = 0x65;
    flip = true;
  }
  SPDR = ch;
}

void loop() {
}

Raspberry pi側ソース wiringPiを使う。

#include <stdint.h>
#include <stdio.h>
#include <wiringPiSPI.h>
#include <unistd.h>

void main(void){
        int chan = 1;
        int speed = 2000000;
        uint8_t buff;
        
        if(wiringPiSPISetup(chan, speed) == -1){
                printf("could not initialize SPI\n");
                return;
        }

        printf("size = %d\n",sizeof(buff)/sizeof(buff[0]));

        while(1){
                wiringPiSPIDataRW(chan, buff, 1);
                usleep(100);

                printf("%d\n",buff[0]);
	}
}

Arduino側ピン配置
SCK  : 13 pin
MISO : 12
MOSI : 11
SS   : 10

Raspberry側の接続先
SCK  -> SCK
MISO -> MISO
MOSI -> MOSI
SS   -> CE1 (channel=1の時)

ラズパイ側はwiringPiを使ってやったので、SPIモードは図のような波形しか用意できない。なのでArduino側でSPIモードをmode0に合わせる。

Wiringpi_spi

注意
クロックは2MHzにしなければ正常に動作しなかった。

いい加減な信号線を使ってやろうとすると、受け取り側で読み取れなくなるくらい波形がなまるというのはよくあること。

ジャンプワイヤではまず成功せず、読み取ったデータは常にぐちゃぐちゃになった。
そもそも配線が長すぎるのだろう。

Spi8mhz

« dsPIC DSPライブラリを試しに使ってみた。 | トップページ | 地味な話 ナル文字 strlenの注意 »

Arduino」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/518723/67371220

この記事へのトラックバック一覧です: ArduinoをRaspberryPiとSPIでつなぐ:

« dsPIC DSPライブラリを試しに使ってみた。 | トップページ | 地味な話 ナル文字 strlenの注意 »