2013年8月5日月曜日

PIC C18 メモ(SPI通信の改良)

-----------------------------
コマンドとデータ交換手順の変更
-----------------------------
マスター側のクロックを上げたら、スレーブ側が反応しない場合が発生、通信が不安定に。マスター側の通信間隔を空けると解決できる。スレーブ側とマスター側の応答処理時間がたまたまうまくいっていたようだ。
"Ready"を予め書き込んでいたが、「Ready だった」のであって、「Readyになった」分けではないので、そこを改めた。

【変更後・スレーブ側の正常応答】
マスター側スレーブ側
WriteSPI(0x00); →0x00 SSPBUF=Busy;
while(!SSPSTAbits.BF);
←Busy
SSPBUF=Command;
while(!SSPSTAbits.BF);
→Command SSPBUF=Ready;
while( !SSPSTAbits.BF);
←Ready
RD=SSPBUF;//(*1)
WriteSPI(Data); →Command SSPBUF=0x00;
while(!SSPSTAbits.BF);
←0x00

【変更後・スレーブ側がビジー】
マスター側スレーブ側
WriteSPI(0x00); →0x00 SSPBUF=Busy;
while(!SSPSTAbits.BF);
←Busy
SSPBUF=Command;
while(!SSPSTAbits.BF);
→Command
←0x00
RD=SSPBUF;//(*2)
  • 変更前は、スレーブが"Ready"にないのにマスター側が勝手に書き込む場合がでる
  • (*1)RD=Ready に変わっていたら通信モードへ
  • (*2)RD=0x00のままなら、スルーする
  • マスター側は、数ms周期でポーリングする
  • スレーブ側はコマンド処理が終わったら、SSPBUFに"Busy"を書き込み、コマンド待ちのアイドルループへ
  • 通信途絶(ケーブル未接続)でもマスター側は立ち往生しない
  • スレーブ側のコマンド処理に入ってからはこれまでと同じ
  • Write/Read の間の待ち時間(20~80us)もこれまでと同じ
    2007.12.19
    2013.08.07



    SPIの相互通信は自己流。後に、uALFATやI2Cデバイスとの接続など経験して、これらにならった方がいいと思える点(改良案のページへ)が多い。
    2011.09.05