Arduino ラズパイ3 SPI通信テスト

今回はラズパイ3とArduinoを使って、簡単なSPI通信テストをやってみます。

とは言え、ネットに落ちてる情報を組み合わせてやってるだけなので、詳しくは探した方が解説付きでええかも。

これは自分の備忘録も兼ねてますので、ざっくりと手順を記載しています。

で、早速ラズパイ3とArduinoの接続からなんですが、ラズパイ3の入力って3.3VでAruduinoの出力は5Vなんですね。

なので、レベル変換する必要があります。

とは言え、難しい話ではなく、ただ単に1kΩ抵抗2本で分圧するだけで大丈夫です。

こんな感じ。

多分、図を書かなくても判って貰えるとは思ったのですが、一応書いてみました。

で、それぞれのピン配ですが、

ラズパイ3

Arduino

つう事で、

信号 ラズパイ3 Arduino
MOSI 19 11
MISO 21 12
CLK 23 13
CS 24 10
GND 39 GND

※MISOは分圧回路を経由して接続

※2018/05/04追記

fritzingなるソフトを見つけて、配線図を書いて見ました!

見づらいかなー?なんとなく判って貰えると嬉しいんだけどw

ソフトの話はこちらで

Arduino ラズパイ 配線描画ツール fritzing

※追記ここまで

Arduinoのプログラム

新規スケッチに下記を記載

/*
 SPI Slave
 Masterから受信した数字を、+1してシリアル出力&送り返す
 (注)Master側がCSをDisableにしてくれないとSlaveが送信レジスタにデータを書けないよ
 
 CS - to digital pin 10 (SS pin)
 SDI - to digital pin 11 (MOSI pin)
 SDO - to digital pin 12 (MISO pin)
 CLK - to digital pin 13 (SCK pin)
*/
 
#include SPI.h
 
void setup (void) {
	pinMode(MISO, OUTPUT);			//送信ポートを出力にする
	Serial.begin(9600);				//シリアル
 
	SPI.setBitOrder(MSBFIRST);		//LSBFIRST / MSBFIRST
	SPI.setDataMode(SPI_MODE0 );	//立ち上がりでラッチ
	SPCR |= _BV(SPE);				//SPI Enable
	SPI.attachInterrupt();			//SPI割り込み開始
}
 
// SPI割り込み処理
ISR (SPI_STC_vect) {
	byte cc = SPDR;					//SPIの受信バッファから取得
	cc++;
	SPDR = cc;						//送信データ格納
	Serial.println(cc);				//シリアル出力
}
 
//メインループは何もしてないよ
void loop (void)
{
}

パクリ参照元:Raspi と ArduinoでSPI通信

受信データをそのまま送信するシンプルなプログラムです。

ついで、ラズパイ3ですが、ラズビアン上でコンパイルします。

#include bcm2835.h
#include stdio.h

int main(int argc, char **argv)
{
	if (!bcm2835_init())	return 1;
	bcm2835_spi_begin();
	bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); 		// The default
	bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); 					// The default
	bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536);	// The default
	bcm2835_spi_chipSelect(BCM2835_SPI_CS0); 						// The default
	bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); 		// the default
 
	uint8_t send_data = 0x23;
	uint8_t read_data = bcm2835_spi_transfer(send_data);
	printf("Sent to SPI: 0x%02X. Read back from SPI: 0x%02X.\n", send_data, read_data);
	if (send_data != read_data)
		printf("Do you have the loopback from MOSI to MISO connected?\n");
	bcm2835_spi_end();
	bcm2835_close();
	return 0;
}

パクリ参照元:Raspberry PiのSPI通信

上記ソースをコンパイルします。

$ gcc -o spi spi.c -l bcm2835

実行する前に、ラズパイのMOSIとMISOを短絡しておきます。

ループバックテストですので、自分で送信し、受信出来るかの確認になります。

で、実行!

$ sudo ./spi
Sent to SPI: 0x23. Read back from SPI: 0x23.

上記はループバック成功のメッセージ。

短絡を外して実行すると、

$ sudo ./spi
Sent to SPI: 0x23. Read back from SPI: 0x00.
Do you have the loopback from MOSI to MISO connected?

接続されてませんよー!ってメッセージが出ます。

では、続いてラズパイ3とArduinoを接続。(写真の右上のが分圧してる所。)

次にArduinoのシリアルモニタを起動し、9600bpsに合わせます。

ラズパイ3から送信したデータを受信するとここに表示されます。

では、早速ラズパイで先ほどのプログラムを実行

ポチッ!

おおおおおおーーーーー!

シリアルモニタに受信データが表示されました!

では、オシロスコープで波形を確認。

しっかりと波形も取れております。

大成功です!(* ‘д’ノノ゙☆パチパチパチ

パクり先参考元の情報が良いので簡単に確認できました。

後は、FRAMが届いた時に色々弄って見たいと思います。

因みに、GNDはノイズの影響を受ける可能性があるので、接続しています。

管理人の場合、HDMIでモニター接続時には正常動作し、外すと正常に動作しない現象が発生し、モロGNDが弱いと気付き付けました。

環境によっては無くでも動作するかもしれませんが、元々ラズパイ自体GNDが弱いので、付けてた方が安心かも。

GND有り、無しの波形

同じ通信をしてるのに、この差です。

2018/6/30まで、オプション無料キャンペーンしてるよー。
凄いお得ですよー。

RIGOL (リゴル) デジタルオシロスコープ DS1054Z オプション10万円相当無料

シェアする

  • このエントリーをはてなブックマークに追加

フォローする