« Ferrariの4人乗りミニクーペ | トップページ | MUSIC MAN Hyblid Guiter AMP回路図追加 »

2011年7月19日 (火)

PIC で I2C

PIC で I2Cをドライブしてみました。 
 PIC では、前回はライブラリがうまく動かなかったので、自前で制御するコードを書いていたのですが、今回再度ライブラリで動作させてみようと挑戦してみました。
使ったCPUは PIC18F4550 ライブラリは、"i2C.h" です。
これは MCC18¥src¥pmc_common¥i2C¥ 以下にあるファイルを使用しています。
通常では動作するのですが...
1つ問題がおこりました。実装されていないデバイスに対して書き込み(コマンド)を送るのですが、当然 ACKが帰ってきません。ソースを見ると、 i2c_write.c には
.....
{
 while( SSPSTATbit.BF) ;
 IdleI2C();
 if(SSPCON2bits.ACKSTAT ) //test for ACK condition
   return(-2);
 else return(0);
}
とあり、ACKが来なければ -2 を返すはずです。
しかしながら、デバッグすると
while( SSPSTATbit.BF) ;
で止まっているのでした。
送信が完了しないで止まっているので、ACKを確認できずにいるようでした。
何度かレジスタの設定を確認しましが、デバイスが繋がっていないとここで止まるようです。
仕方がないので、
 while( SSPSTATbit.BF) ;
の部分を
 n = 100;
 while( SSPSTATbit.BF) {
   --n;
   if( n == 0){
      IdleI2C();
      return(-2);
   }
 }
と変えて、100回ループで脱出するように修正しました。

 この writeI2C() を使っているサンプルを見ても、ACKが無いときの return(-2)の値を利用しているコードは見つかりませんでした。( -1) の場合の バス衝突時 には対応しているコードは見つかりました。私の環境が悪いのか、CPUによってくせがあるのか解りませんが、送信完了しないってことは不思議でした。もうちょっと使い込んで実験してみたいと思います。

|

« Ferrariの4人乗りミニクーペ | トップページ | MUSIC MAN Hyblid Guiter AMP回路図追加 »

トラブル対策」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: PIC で I2C:

« Ferrariの4人乗りミニクーペ | トップページ | MUSIC MAN Hyblid Guiter AMP回路図追加 »