ネットの海を漂っていた後輩が結局よくわかっていなかったようなので説明した内容をまとめ
#ちっちゃいおっさん方式での説明
##頭のなかに用意するもの
- おっさん(マスター役)
- その部下(スレーブ役)
- ホワイトボードとマーカー(おっさんと部下に1セットずつ)
では、おっさんと部下との間でSPI通信をさせてみます。
##通信手順
- おっさんが部下に「お前と通信するぞ!」と伝えます。
- おっさんが「更新!」と号令をかけます。おっさんと部下はそれぞれ自分のホワイトボードを綺麗にして、相手に伝えたいことを1bit書きます。
- おっさんが「取り込み!」と号令をかけます。おっさんと部下はそれぞれ相手のホワイトボードに書いてあることをどこかにメモします。
- 更新と取り込みをおっさんの気が済むまで繰り返します。一般的に8bit(又はその整数倍)単位です。
- おっさんが部下に「お前との通信終わり!」と伝えます。
ちなみに部下は一切返事をしません。ただおっさんの声を聞いてデータを読み書きするだけです。
おっさんもおっさんで部下の様子なんて見ません。
部下の「データ用意できました!」とかそういう通知はSPIの枠外でやります。
##信号線名との対応
「お前と通信中」信号線をCSとかSSとかと呼び、
「更新!/取り込み!」信号線をSCLKなどと呼び、
おっさんのホワイトボード信号線をMOSI(Master Out Slave In、おっさんにとってのSDO、部下にとってのSDI)
部下のホワイトボード信号線をMISO(Master In Slave Out、おっさんにとってのSDI、部下にとってのSDO)などと呼びます。
部下が複数いる場合はCSもその分必要ですし、
おっさんが伝えることが何もない場合はMOSIは必要ないですし、
逆の場合はMISOが必要無くなります。
#細かい話
##CS
負論理です。
通信相手として選択している間はL、していない状態をHとします。
スレーブの数だけ必要です。
マスターのピン数が足りない場合は適当にデコーダをはさみます。
1対1でしか通信しないならICによってはLレベル固定にして省略可能です。
##SCLK
- 通信していない間の電圧レベルをどうするか
- SDOの更新を先にやるか、SDIの取り込みを先にやるか
で2x2=4種類あります。
更新、取り込みのタイミングはエッジを使います。
周期はスレーブのスペックをみて決めます。
通信していない間はL/Hとする方式をCPOL=0/1
更新を後/先にやる方式をCPHA=0/1
と呼びます。
CPOL=0,CPHA=1
cs ****\_________________________________________________....
sclk________/*********\______/*********\______/*********\_....
^ ^ ^ ^ ^ ^
update latch update latch update latch
_:L *:H /,\:Edge
別名にmode x,yとかmode z とかckp,ckeとかあります。
どれがどれに対応するか覚えるよりデータシート見ましょう。
取り込みを先に行う場合に、スレーブが先頭ビットをいつ用意するかもデータシート読む必要があります。
(※スレーブが何か出力する場合は、別で更新通知の信号線を用意していたり、MISOで更新通知する事が多い)
##MISO/MOSI
ICによっては入出力のどちらかがいらないものがあるので、そういうICでは片方が存在しません。