H8/2378にてI2Cによる通信を行っています。
通信は100kbpsで本マイコンがマスタとなり送信と受信を交互に行い、スレーブはPIC24FJ64GB002です。
ここで20回に1回程度SCLのHI時間が短くなり、スレーブがデータを認識できずNACKとなってしまいます。
この現象が起きた後は次のパルスが帳尻を合わせるようにパルス幅が長くなり、その後は何事もなかったように
正常パルスとなります。
添付の青色の波形が本現象時のSCLです。中心部分でパルスが短くなってしまっているのがおわかりいただけるはずです。
スレーブ側では受信時のクロックストレッチは無効としているため、基本的にはマスタである本マイコンが
SCLを生成していると思いますが、このような現象になる原因はどのようなことが考えられますでしょうか。
よろしくお願いいたします。
型番はH8S/2378(S付き)で良いでしょうか。
テクニカルアップデートを見たら、I2C関連の注意事項がいくつか出ていました。
参照: japan.renesas.com/.../Technical_Update.jsp
例:
「IIC2, IIC3におけるマスタ受信モード切り替え時の注意事項について」
マスタ送信モードからマスタ受信モードへの切り替えの際、TRS=0クリア処理がマスタ送信モード時の9クロック目立ち下がりよりも前に行われた場合、IIC2、IIC3モジュールはICDRRのダミーリード有無に関わらず内部クロックに同期した受信クロックを出力します。
Higetakaさん
早々のご回答ありがとうございます。
注意事項については確認済ですが今回の現象はマスタ送信からマスタ受信に
切り替えるタイミングに限らず、送信継続中にも発生しています。
補足としまして制御プログラムは提供されているサンプルソースをベースに
使用しています。
念のため確認しましたが、切り替えの際のSCL立下りは確認後にTRS=0は行って
います。
その他に確認しなければいけない点などありましたらお願いします。
うーん。そうなると、環境にゆさぶりをかけて何かヒントが得られないか、ダメ元でやってみるという手はどうでしょうか。
(私は経験上、この手で救われたことが結構あります。意外な発見があるかもしれません)
まずは確実にマスタ側の問題かどうか切り分ける作業が必要だと思います。
案としては
・スレーブを切り離した状態にする。
・スレーブのSCL出力に抵抗を入れて、スレーブが駆動した時に弱めに引っ張られるようにする。
(SCLをLにする犯人を区別できるようにする)
・別のスレーブをつないでみる。
これで現象がどう見えるかで、見極めしやすくなるはずです。
回答ありがとうございます。
いただいた案をもとに現在の環境でできる限りの調査をしてみます。
スレーブはPIC24FJ64GB002これは正常でしょうか?I2CシリアルROMでも駆動させて確認はできませんか?
IKUZOさん
PIC側はほぼレジスタまかせですが、マニュアル通りに
制御しているつもりです。
なんとかI2CシリアルROMを接続して確認してみます。