SPI通信

基本操作

SPI(シリアルペリフェラルインタフェース)通信では,マスタデバイスが1つと,1つ以上のスレーブデバイスがある.マイクロコントローラは,マスタデバイスとしてもスレーブデバイスとしても設定できる.

1.gif

SCK(シリアルクロック)信号はマスタによって生成される.クロック線はSCLK線またはCLK線とも呼ばれる.マスタはMISO(マスタ入力スレーブ出力)線を介してスレーブからデータを受け取る.マスタがデータをスレーブに送信するときはMOSI(マスタ出力スレーブ入力)線を使用する.どの時点においても,マスタと1つのスレーブの間で通信が行われている.マスタはスレーブのSS(スレーブ選択)線をLowにプルすることでスレーブと通信を行う.SSピンはCS(チップ選択)ピンと呼ばれることもある.通信の最後に,マスタはSS線をHighにプルする.

以下のSPI指定が使用できる:

"SELECT"スレーブを選択する
"DESELECT"スレーブの選択を解除する
"READ"SPIデバイスから入力チャンネルに読み込む
"WRITE"出力チャンネルからSPIデバイスに書き込む
"data"data をSPIデバイスに書き込む

SPI指定

"SELECT""DESELECT"はマスタデバイスのみが指定する."READ"は入力チャンネルが,"WRITE"は出力チャンネルが使用し,data は入出力チャンネルのどちらでも使うことができる.

マイクロコントローラが通信する必要のあるSPIデバイスの指定は"SPI"オプションで"SPI"->{name1->{spec11,spec12,},name2->{spec21,spec22,},}として与えられる.SPIデバイスの namei は,以下の値を取ることができる:

名前
マイクロコントローラのモード
SS接続
"pin"masterSPIデバイス上のSSへのマイクロコントローラの pin
"label"master接続されておらず,"SELECT""DESELECT"は使用されていない
"Master"slaveマスタSPIデバイス上の適切なピンへのマイクロコントローラのSSピン

マイクロコントローラに接続されたSPIデバイスの可能な名前

マイクロコントローラのSPIチャンネル:

{"MIS0 pin", "SPI", "Conversion" }入力チャンネル
{"MOSI pin", "SPI","Conversion" }出力チャンネル

SPIの入出力チャンネル

入力チャンネルでは,サブオプション"Conversion"は,届いたデータをどのように変換して入力に割り当てる必要があるのかを指定する.

出力チャンネルでは,サブオプション"Conversion"は出力をどのように変換して送信する必要があるのかを指定する.

この例では,ArduinoをSPIバスを介してデータの送受信を行うマスタモードで使用する.また,スレーブモードのArduinoも使用し,こちらもデータの送受信を行う.つまり,この例ではマスタモードとスレーブモードの両方において,送信と受信の両方を行う.

2.gif

ポテンショメータとLEDはマスタとスレーブの両方に接続する.マスタはポテンショメータの値をスレーブに送る.スレーブはこの値をもとにLEDの輝度を設定する.マスタはスレーブのポテンショメータの値を受け取り,その値を使ってLEDの輝度を設定する.

3.gif

パッケージをロードする.
埋め込むシステムはマスタとスレーブどちらについても同じである.

マスタのピンまたはその他のどのピンでも,スレーブを選択するのに使うことができる.その他の接続には変更があってはならない.

SSがLowになったとき,マスタがデータを送ろうとしているのか,データの送信を要求しているのかをスレーブはどのようにして知るのだろうか.これを明確にするために,SSがLowになった後の最初のバイトを使って,マスタがスレーブから読み取ろうとしているのか,スレーブに書き込もうとしているのかを示す.

マスタデバイスから読み取る,またはマスタデバイスに書き込む交換シーケンス:

ポテンショメータはからVまでの値を示す.これをからまでの値に変換し,それをSPIバス上で送信する.

電位計の値の出力される前の変換.

マイクロコントローラがからまでの範囲のデータバイトを受け取ったら,それをLEDの輝度として設定する前にからまでの値に変換する.

受信したSPIバイト値のLEDに送られる前の変換.

実際には,の値の範囲からの範囲に変換し,さらにもとに戻す必要はない.ここでは変換をどのように指定するのかを説明し,必要に応じて使えるようにするために行う.

次に,スレーブがSPIバス上で見る交換シーケンスを指定する.writeToSlave バイトを見たらスレーブは次のバイトを読む必要があり,readFromSlave バイトを見たら,マスタが読めるようにSPIバスにバイトをロードする.

マスタデバイスから読み込む,またはマスタデバイスに書き込む交換シーケンス:

マスタはSSピンがマスタのピンに接続されている1つのスレーブとトークする.読み込む,または書き込むためには,マスタはまずスレーブを選択し,データを読み込むのか書き込むのかを設定し,操作を行い,スレーブの選択を解除する.

マスタデバイス用の交換シーケンス:

これで,スレーブの入出力チャンネルを指定し,コードを埋め込むことができる.

スレーブの入力チャンネル:
スレーブの出力チャンネル:
スレーブに埋め込む:

次はマスタである.

マスタの入力チャンネル:
マスタの出力チャンネル:
スレーブとの通信を始めるために,2つ目のArduinoにマスタのコードを埋め込む: