*SPI通信 SPIとは、Serial Peripheral Interfaceの略であり、今回は決して就職活動のSPI試験のことではない。 DualshockやSDカードなどいろいろな通信で使われている、汎用性の高い規格。 I2Cと比較されることが多い通信規格であり、理解しておくとマイコン同士などの通信でも使用可能。 *SPIの規格 上位のPICには基本的にSPIモジュールが搭載されているので、そこで使用するように解説。 まず最低でも通信に必要な端子は、SDI(SSP DATA INPUT)、SDO(SSP DATA OUTPUT)、SCK(SSP CLOCK)と基準電圧の4本。 これにさらにSS(SLAVE SELECT)が加わると、最低5本必要となる。 ただし、SPIは一対多通信に向いている規格であり、一のほうをマスター、多のほうをスレーブと呼ぶ。 さきほどのSSはスレーブ側は一つでいいが、マスター側はスレーブの数必要となる。 つまり、 スレーブが2個の場合 マスター -SDO -SDI -SCK -SS1 -SS2 -GND スレーブ(2つそれぞれ) -SDO -SDI -SCK -SS -GND のようになる。 ちなみに、SDIとSDOはすべて並列に接続するので、接続数に対する端子の数が増えないという特徴を持つ。 ただしINとOUTは入れ替える必要があるので、マスターのSDIをスレーブのSDOにつなぎ、マスターのSDOをスレーブのSDIにつなぐ。 SSという端子がマスター側でスレーブの数増えることになる。 そしてSPI最大の特徴がリングバッファ通信である。 リングバッファ通信は、マスターとスレーブで送受信が同時に行われ、それぞれのデータが入れ替わるという特徴を持つ。 読み出しのタイミングや書き込みのタイミングを間違えると、通信に失敗することになる。 またSCK端子による同期式であるため、スレーブには通信速度を設定する必要は無い。 **SSの必要性 スレーブセレクトはスレーブの数だけ必要だが,一対一のときはスレーブセレクト端子なしで通信可能である. しかしSPI通信モジュールの一部には,クロックが合わないと合うまで待機してしまい,ビットにずれが生じて通信できなくなることがある. やはりENABLEとしてスレーブセレクト機能はあったほうがよさそうだ. *SPIの接続確認通信 PICのデータシートを読むと,SPI通信の信頼性を上げるためにバッファを用いた通信確認を行うことを推奨している. やり方はマスターが送りたい信号をA,スレーブが送りたい信号をB,任意のバッファデータをCとすると, ||マスター| |スレーブ| |1|A||C| |2|A||B| |3|C||B| と行い,受信されるデータが正しい(受信するデータが等しく,バッファデータが同一)かどうかを判断する. ただし一般的な機器はこの通信を行うことはできないので,自作した回路同士でどうぞ. *UARTをSPIに 接続に3ピン必要なSPIを,UARTの2ピンで通信できるよう,PIC12F1822でUARTtoSPI通信モジュールを作ってみた. PIC12F1822はピン配置を変更する機能があるため,わずか8ピンのマイコンでありながらUARTとSPIを同時に行うことが出来る. #image(UARTtoSPI.BMP,width=300,height=300,UARTtoSPI.BMP) ということでプログラム. #ref(UARTtoSPI.zip) マスターとスレーブのHEXファイルのセット. まだソースが適当なので,HEXファイルのみです. 最適化もかけてないので,アセンブリもひどいかと.