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」は手動でポートを制御する必要があります。
gpioコマンドでポートの位置を確認できます。
$ gpio readall
SPIのピンは固定ですが、「RES」と「DC」は空きポートを使用しました。
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で観測してみたところ、設定通りの速度でした。
[参考記事]