Raspberry PiでSPI通信(3)


前回に引き続きRaspberry PiのSPI通信についてです。

今回はRaspberry Piをマスターとした場合の、ソースコードの実装についてです。
作成したソースコードは以下の通りです。

・Raspberry PiでSPI通信(1)
でセットアップしたSPI通信用のライブラリを使用しています。

#include <wiringPiSPI.h>
#include <wiringPi.h>
#include <stdio.h>
//定数定義
#define SS_PORT 22									//GPIO 22
#define SPI_CHANNEL 0								//SPIチャンネル

int main(void)
{
	int speed;										//通信速度(Hz)
	unsigned char buff;							//送受信用バッファ
	
	speed = 10000000;								//通信速度100kHz
	
	if((wiringPiSPISetup (SPI_CHANNEL, speed)) < 0){//SPIチャンネル初期化
		printf("wiringPiSPISetup error \n");
		return -1 ;
	}
	
	if(wiringPiSetupGpio() == -1){					//GPIO初期化
		printf("wiringPiSetupGpio error\n");
		return -1;
	}
	pinMode(SS_PORT, OUTPUT);						//22pinを出力に設定
	digitalWrite(SS_PORT, 1);						//SS信号初期化
	buff = 0x0;									//バッファ初期化
	
	//通信処理
	while(1){
		buff = 0x24;								//送信用データをバッファにセット
		digitalWrite(SS_PORT, 0);					//SS信号をLOW出力にして通信開始
		wiringPiSPIDataRW(SPI_CHANNEL, &buff, 1);				//データ送受信
		digitalWrite(SS_PORT, 1);					//SS信号をHIGH出力にして通信終了
		
		printf("0x%x\n", buff);					//受信データを出力
		delay(1000);
	}
	return 0;
}

まずwiringPiSPISetupはSPIチャンネルを初期化する関数です。
第1引数は使用するチャンネル(1 or 2を指定)
第2引数は通信の速度を設定します。(単位:Hz)
今回は100KHzを設定しています。

続いてwiringPiSetupGpioでGPIOを初期化します。
wiringPiSPISetupとwiringPiSetupGpioを実行する順番を逆にしてしまうと、GPIOを制御する処理が正しく動作しませんでした。

最後に変数buffに送信したいデータをセットし、wiringPiSPIDataRWで送受信します。
通信したいスレーブに接続されているSS信号を送信する前にLOW出力にし、データ送信後にHIGHに戻します。
wiringPiSPIDataRWを実行すると、buffに格納されていた値を送信するのと同時に、相手側から送られてきたデータがbuffに上書きされます。

処理説明は以上です。
次回は実際にこのプログラムを使って動作確認を行った結果を書きたいと思います。

【関連記事】
・DE0 SPI通信用ピンヘッダ作成
・DE0 SPI通信でRaspberry Piと接続する


※一部ソースコードの不備を修正しました。(2017/03/08)

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です