SPIモードによる PIC間の通信
  
SPI モード
PIC の持つ SPI(Serial Peripheral Interface)モードは PIC 相互間や PICと他の周辺IC間とシリアル通信を行うものです。使用するときは一方をマスタモード、他方をスレーブモードとして使用します。
マスタモードとスレーブモードは SSPSTAT(同期シリアルポートステータスレジスタ)により設定します。

SPIモードを持つ PICには次のピンが用意されています。
  SDO:シリアルデータ・アウト
  SDI:シリアルデータ・イン
  SCK:シリアルクロック
  SS :スレーブセレクト(使用しない設定もできます)

上記の各ピンは PORTB とか PORTCなどの I/Oピンと重複して割り当てられているので SSPCON(同期シリアルポートコントロールレジスタ)を設定することにより選択します。

SPI用ピンの配置やSSPSTAT レジスタと SSPCON レジスタの設定については PIC デバイスのデータシートに記載されています。

SPIの初期化設定
上記 SPIモード用のピンやマスタ、スレーブの設定のほか SSPCONレジスタのbit3〜bit0までの4ビットでマスタモードの場合はクロックの設定ができます。スレーブモードの場合はスレーブ側の選択用ピン(SS)を使うか使わないかの設定ができます。PIC をマスタにした場合、クロックは SSPCONレジスタのbit3--bit0 (SSPM3:SSPM0)に入れる値により
 '0000' = Fosc/4 (Fosc:クロック用発振周波数)
 '0001' = Fosc/16
 '0010' = Fosc/64
 '0011' = TMR2の出力の1/2
等の設定ができます。

このほかの設定ではクロックの極性や送信されるときのクロックのエッジなどの選択ができます。

通信相互間の距離
SPI のクロックはかなり高速ですが、RS-232C などのようにケーブルで離れたデバイス間の通信をするのでなく、基盤上のデバイス間通信に使います。

送受信の単位
送受信するデータは1バイト(8ビット)を単位としておこなわれます。デバイス内には8ビットのシフトレジスタやバッファレジスタが内蔵されているので、1バイトのデータを1ビットづつにわけて8回送受信するプログラムなどを作る必要はありません。デバイス内のハードウエアで自動的に処理されます。

SPIモード・テスト基板
PIC16F819 2個を使った SPIモード・テスト基板(下の写真)を作りマスタとスレーブのプログラムをテストしてみました。

テストプログラムはマスタ側で H'0F' から 1つづつ減らし H'01'までのデータを送信、スレーブ側ではそのデータを受信して PORTA の下位 4bit の LEDを点滅、データが=0になったら最初にもどり繰り返します。単に送受信したのでは高速すぎて LEDの点滅状態がわからないので送信データは1バイトごとに 500mSecの遅延時間を入れてあります。
 
2007.4.20
   
SPIモード・テストプログラム
;マスタ ここまではBANK 0 で来ている
MAIN MOVLW B'00001111' ;送信初期データを
MOVWF CNT0 ;データ用レジスタ CNT0に入れる
LOOP_1 BCF SS ;#DEFINE SS PORTB,5 スレーブSPI有効
MOVF CNT0,W ;(この行 '07.11.11追記)
MOVWF SSPBUF ;CNT0 の値を SPI バッファへ入れる
BSF STATUS,RP0 ;BANK 1
LOOP_2 BTFSS SSPSTAT,BF ;バッファのフラグチェック
GOTO   LOOP_2
BCF STATUS,RP0 ;BANK0
MOVF SSPBUF,W ;受信データ取得(ここでは使わない)
BSF SS ;#DEFINE SS PORTB,5 スレーブSPI無効
CALL DLY500M ;500mSec 遅延タイマサブルーチン呼び出し
DECFSZ CNT0,F ;CNT0=CNT0-1
GOTO   LOOP_1 ;CNT0>0 なら LOOP_1へ
GOTO MAIN ;CNT0=0 なら MAIN へ戻りCNT0再設定
     
;スレーブ
MAIN BSF STATUS,RP0 ;BANK 1
MOVLW SSPSTAT ;同期シリアルポートレジスタの内容を
MOVWF FSR ;FSR に入れる
BTFSS INDF,BF ;FSR に入れた内容をINDFで見てBFを調査
GOTO   MAIN ;BF=0(入力無し)ならMAINへ
;BF=1(入力有り)なら次へ
BCF STATUS,RP0 ;BANK 0
MOVF SSPBUF,W ;SSPバッファレジスタの状態で
  MOVWF PORTA ;PORTA のLED 点灯 
GOTO MAIN
  
  
マスタ側がPIC以外のデバイスで1バイト送信ごとにSS制御信号が来ない場合、スレーブ側のプログラム   MOVF  SSPBUF,W  の次に

         BCF   SSPCON,SSPEN
         BSF   SSPCON,SSPEN    ;SSPENのON-OFF-ON

の2行を追加して1バイト受信ごとにスレーブ側のSPIをリセットさせます。
スレーブ側の SSPCON bit3--0 は '0101' にしてSSピンは使わない設定にします。
  
ここで使用したテスト回路などは次の各行をクリックするとご覧になれます。
 
  テスト回路図(JOB07041001.pdf 41KB)
  基板部品配置、配線図(SPI_TEST.pdf 91KB)
  マスタモードプログラム(MST_01.pdf 66KB)
  スレーブモードプログラム(SLV_01.pdf 58KB)