2013年8月5日月曜日

PIC C18 メモ(SPI関数)

----------------------------
関係するフラグ
----------------------------
【 BF (Buffer Full Status) 】
  • SSPBUF からデータを読むとL
    ①と③
  • SSPBUF に受信データが届いたら H
  • あるいは、BF=L はまだデータの交換が済んでいない(受信未完了でもある)
【 WCOL (Write Collision) 】
  • スレーブ側の書き込み衝突有りで H
    SSPBUFが空でないのに(BF=Hなのに)次のデータを書き込んだ
  • マスター側では書き込む前に SSPBUF を空読みするか、WCOLをクリアする
【SSPOV】
  • スレーブのオーバーフロー検出で H
    SSPBUF が空でないのに(BF=Hなのに)次のデータが送られてきた
  • マスター側は関係なし
----------------------------
ReadSPI 関数のなかみ【旧】
----------------------------
unsigned char ReadSPI( void )
{
  SSPBUF = 0x00;         //0x00をSSPBUFへ書き込む④
  while( !SSPSTAbits.BF);//BF=H を待つ②
  return( SSPBUF );      //SSPBUFには交換されたデータがある③
}
  • RD=ReadSPI(); で BF=L となり、受信完了③
  • SSPBUF にあったデータが互いに交換された状態②
----------------------------
WriteSPI 関数のなかみ【旧】
----------------------------
unsigned char WriteSPI( unsigned char data_out )
{
  SSPBUF = data_out      //SSPBUFにデータを書き込む④
  if( SSPCON1 & 0x80 )
    return( -1 )         //WCOL=H は送信データの衝突
  else{
    while( !SSPSTAbits.BF);//BF=H を待つ②
  }
  return( 0 );           //正常終了
}
  • WCOLを関数内で見ているので、予めSSPBUFを空読みする①か、WCOLをクリアしておかないと正常終了しない(-1を返してくる)
  • WriteSPI では BF=H の状態で送信完了②
  • WriteSPIを使わずに勝手に書き込む分には問題なく動く(WCOL無視)
----------------------------
マスターとスレーブの通信
----------------------------
  • マスター側は WriteSPI,ReadSPI
  • 書き込み前に BF=L にしておく必要がある(空読み)
  • スレーブ側は予めダミーデータを書いておく
  • 交換終了を知るには、まずBFフラグをLにしておく必要がある
  • BF=H になったらデータの交換終了、スレーブ側は次のアクションへ
2006.11.20
2013.08.09



ReadSPI 関数のなかみ【旧】、WriteSPI 関数のなかみ【旧】、となっているのは、今回再度開いてみたところ変更されていたため。【新】については分析していない。
2013.08.08