LSI Jiu-Jitsu

電子工作とブラジリアン柔術

Raspberry PiでSPI

f:id:mohran:20200515004533j:plain
Raspberry PiでSPI接続のOLEDを動かしてみましたので備忘録です。

C言語を通して制御しましたのでライブラリのWiring Piをインストールしておきます。

$ sudo apt-get install wiringpi


一般的なSPI接続のOLEDは、「GND」「VCC」の他にSPI通信用の「SCL」「SDA」「CS」と「RES(リセット)」「DC(データ/コマンド)」の7ピン構成になっています。

Wiring Piを使うことでSPI通信用の3本は自動で制御してくれますが、「RES」と「DC」は手動でポートを制御する必要があります。
f:id:mohran:20200516224143j:plain

gpioコマンドでポートの位置を確認できます。

$ gpio readall


SPIのピンは固定ですが、「RES」と「DC」は空きポートを使用しました。

f:id:mohran:20200516225429j:plain

C言語の記述はこのような感じです。

  • SPI通信
#include <wiringPiSPI.h>

#define SPI_CHANNEL 0
#define SPI_SPEED   1000000

if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) < 0){
  return(-1);
}

wd[0] = 0xaf;
wd[1] = 0x15;
wd[2] = 0x60;
wiringPiSPIDataRW(SPI_CHANNEL, wd, 3);

wiringPiSPISetupの第2引数はSPIクロック周波数を指定します。
(今回は1MHz)
wiringPiSPIDataRWの第2引数は送信するデータ配列で、第3引数は送信データ長となります。

  • ポート制御
#include <wiringPi.h>

#define PORT_RES 20
#define PORT_DC  21

if(wiringPiSetupGpio() < 0){
  return(-1);
}

pinMode(PORT_RES, OUTPUT);
pinMode(PORT_DC,  OUTPUT);

digitalWrite(PORT_RES, 1);
digitalWrite(PORT_DC,  0);

pinMode第1引数で指定するポート番号はgpio readallで表示されるBCM欄の番号になります。
なお、入力ポートの状態をリードするにはこのようになります。

pinMode(xx, INPUT);
rd = digitalRead(xx);


コンパイルする際にはWiring Piのライブラリをリンクさせる必要があります。

$ gcc spi.c -lwiringPi


SPIクロックの速度を500KHzと1MHzで観測してみたところ、設定通りの速度でした。
f:id:mohran:20200515015645j:plain

f:id:mohran:20200515015659j:plain


[参考記事]