SPI通信処理の実装


前回の記事で書いたRaspberry Piを使った無線化後の動作テストですが、wifiで受け取ったデータをFPGAボードのCyclone Vに転送するSPI通信のソースコードを載せたいと思います。

今回は下記ページの記事で載せたRaspberry Piのマルチスレッドで動作するプログラムのthread2にSPI通信のソースを追加する形で実装しました。
・Raspberry Piでソケット通信

今回はPWMの指令値4ch(1ch 8bit)分をSPIでRaspberry PiからFPGAに送りたいので、wiringPiSPIDataRWの引数で一度に32bit送信するよう指定します。SSはwiringPiSPIDataRWの第1引数でチャンネルを指定すると、GPIO 07、08から出力できるようですが、3ch以上は制御できないのでプログラムから直接GPIOを叩いて生成しています。

//スレッド2 SPI通信処理
void* thread2(void* pParam)
{
	int i;
	int buffSize = 4;
	int speed;                                      //通信速度(Hz)
	unsigned char spi_buff[buffSize];                      //送受信用バッファ
	struct timespec req;
	
	//sleep設定
	req.tv_sec = 0;
	req.tv_nsec = 1000 * MILLI_SEC;				//sleep時間msで設定
	
	//バッファ初期化
	for(i = 0; i < buffSize; i++){
		spi_buff[i] = 0x0;
	}
	
	//SPI通信速度設定
	speed = 10000000;                               //通信速度100kHz
	
	//SPIチャンネル初期化
	if((wiringPiSPISetup (SPI_CHANNEL, speed)) < 0){
		printf("wiringPiSPISetup error \n");
		return -1 ;
	}
	
	printf("Setup SPI...\n");
	
	//GPIO初期化
	if(wiringPiSetupGpio() == -1){
		printf("wiringPiSetupGpio error\n");
		return -1;
	}
	pinMode(SS_PORT, OUTPUT);                       //22pinを出力に設定
	digitalWrite(SS_PORT, 1);                       //SS信号初期化
	
	printf("Start SPI...\n");
	
	//通信処理
	while(1){
		//送信用データをバッファにセット
		spi_buff[0] = g_sock_recv[0];		//PWM1
		spi_buff[1] = g_sock_recv[1];		//PWM2
		spi_buff[2] = g_sock_recv[2];		//PWM3
		spi_buff[3] = g_sock_recv[3];		//PWM4
		
		//SPI通信実行
		digitalWrite(SS_PORT, 0);                   //SS信号をLOW出力にして通信開始
		wiringPiSPIDataRW(SPI_CHANNEL, spi_buff, 4);             //データ送受信
		digitalWrite(SS_PORT, 1);                   //SS信号をHIGH出力にして通信終了
		
		//インターバル
		nanosleep(&req, NULL);
	}
	
	return 0;
}

g_sock_recvという配列はソケット通信で受信したPWM指令値が格納されたバッファです。
このプログラムで実装したら、FPGA側で問題なく32bitのデータを受信することができました。

Add a Comment

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