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によってくせがあるのか解りませんが、送信完了しないってことは不思議でした。もうちょっと使い込んで実験してみたいと思います。
| 固定リンク
「トラブル対策」カテゴリの記事
- SwitchBot スマートプラグ 修理のはなし(2024.08.02)
- ソーラ発電その後のはなし(2024.03.28)
- シリアル通信トラブル集( インターフェイス2024年3月号)のはなし(2024.02.29)
- パワーアンプ PROTECT故障のはなし(2023.11.16)
- ダイナミックマイクのロー抜け修理のはなし(2021.05.24)
コメント