ゆるく楽しむプログラミング

IC間のデータ通信 SPI

【SPI通信】 SPI(Serial Peripheral Interface)は周辺デバイス とのシリアル通信の方式で、主にLCD/OLEDやSDCARDなどとの高速通信を実現 する方式です。

SPI接続

SPIバスには複数のデバイスを接続できます。
どのデバイスと通信を行うかは、Sleva Select(SS) スレーブセレクト信号線によって選択します
スレーブセレクト信号線がデバイスの数だけ必要ですが、デバイスが一つしかない場合には常に選択状態にする事で、Sleva Select(SS) の接続を省略できます。

データ通信は
Serial Clock(SCK) : クロック
Master In Slave Out(MISO) : マスターのスレーブらかの受信
Master Out Slave In(MOSI) : マスターからスレーブへの送信
の3本の信号で行います。



マスターとスレーブの動作電圧の違い

ArduinoやRaspberryPIの電圧は5Vですが、センサー類は省電力化の為に3Vとか1.5Vとか低い動作電圧で設計されている場合があります。
高い電圧を繋ぐとセンサー等が破損する可能性がありますので動作電圧が異なる場合にはレベルシフター等を入れて電圧を変換する必要があります。

SPIでの通信手順

マスターからスレーブにデータを送信する場合
クロックが変化したタイミングのMaster Out Slave In(MOSI)が送信データになります。
クロックはマスター側が操作し、スレーブが対応できる速度以下の間隔で変化させなければなりません。




スレーブのデータをマスターが受信する場合
クロックが変化したタイミングのMaster In Slave Out(MISO)が受信データになります。
クロックはマスター側が操作し、スレーブが対応できる速度以下の間隔で変化させなければなりません。
同期通信なので、マスターの準備が出来たタイミングでクロックを変化させればよいです。




送受信を行う場合
送信時にも受信時にも、タイミング(クロクの変化)はマスターが決定するので、送信と受信を同時に行うことができます。



SPI MODE

送受信のタイミングはクロックの変化をトリガーとして行いますが
クロックがLOWからHIGHに変化した瞬間をトリガーとするか、HIGHからLOWに変化した場合をトリガーとするか。
クロックを LOW=0、HIGH=1と解釈するか、LOW=1、HIGH=0と解釈するかの組み合わせで、動作条件(SPI MODE)が4種類あります。

どのモードで動作するかは、デバイス毎に異なります。
また、モードの表記が統一されていないので注意が必要です。

モードの表記例
 モード表記  動作
MODE 0

 0から1に切り替わる瞬間をトリガーとする クロックはLOW=0、HIGH=1 
MODE 0,0  
CKP=0,CKE=1 
MODE 1 

 1から0に切り替わる瞬間をトリガーとする クロックはLOW=0、HIGH=1   
MODE 0,1 
CKP=0,CKE=0 
MODE 2 

 0から1に切り替わる瞬間をトリガーとする クロックはLOW=1、HIGH=0   
MODE 1,0 
CKP=1,CKE=1 
MODE 3 

 1から0に切り替わる瞬間をトリガーとす クロックはLOW=1、HIGH=0  
MODE 1,1  
CKP=1,CKE=0 
※何も通信しないときは0にしておく(MODE0/MODE1のときはLOW, MODE2/MODE3のときはHIGH)

解説動画