I2Cスレーブ→マスタ通信時のデータ~データ間ウエイトのバラツキについて

R78/G13のIICAを使用して、マスタ:RaspberryPi 3 - スレーブ:RL78 の通信を行っています。

スレーブからマスタへの通信(I2Cリード)時に、データ~データ間のウエイト時間が2.5us~6us程度の幅でバラつくのですが、

考えられる要因として、何があるのでしょうか?

 

RaspberryPi 側のI2Cがクロックストレッチに対応していないため、

添付画像のようにウェイト時間のバラツキによりクロックストレッチが発生した場合に、

データが化ける問題が起きています。(RL78は悪くないのですが)

 

・IICAの割り込み処理はチョコさんの r_IICA0_LIB.c (2016/06/10) をベースにし、多重割り込みを許可しています。

 また、Low Byte送信部の処理はほぼ同じです。

・割り込みは、IICAの他にタイマとRTCを使用していますが、IICAを高優先、他を低優先としています。

・IICA割り込み処理の時間は、逆アセンブル情報からの概算で約2.5us程度であり、これはウェイト時間バラツキの最小と合っています。

・IICAはファーストモードでデジタルフィルタをONにしています。I2Cの通信レートは100kbps(RaspberryPi のデフォルト)です。

 ※標準モードでデジタルフィルタOFFにしても現象に変わりはありませんでした。(感覚として頻度が下がっている気はしました)

 

   

 

  • チョコです。

    >・IICAの割り込み処理はチョコさんの r_IICA0_LIB.c (2016/06/10) をベースにし、多重割り込みを許可しています。

    > また、Low Byte送信部の処理はほぼ同じです。

    >・割り込みは、IICAの他にタイマとRTCを使用していますが、IICAを高優先、他を低優先としています。

    上記の1行目と3行目が矛盾しています。多重割り込みで,優先度の高い方は単に優先度を高く設定していればいいだけで,多重割り込みだから何かする必要はありません。何かしないといけないのは,優先度の高い割り込みを許可していい優先度の低い割り込みの方です(EI();でベクタ割り込みを許可するだけです)。ここらの,制御を確認してください。どうも,左側の波形では,RL78/G13側の割り込み応答処理が他のプログラムのせいで割り込み応答が遅くなっているようです。

    また,RaspberryPi 側はリアルタイム処理が苦手なはずです。他の処理との関係で処理時間が変動するので,こちらの待ち時間に余裕を持たせるのも手じゃないかと思います。

     

     

  • チョコさん

    回答ありがとうございます。

    おっしゃる通り矛盾した記載がありました。すみません。
    元々はすべて同レベルに設定していたので多重割り込みを許可していたのですが、
    ウェイトのバラツキを調べていく中で、IICA割り込みだけが最高優先度になっています。

    チョコさんの回答にある「割り込み応答処理が他のプログラムのせいで」というのは
    やはり他の割り込み処理との関係ということでしょうか?

    使用している他の割り込み(RTC割り込み、タイマ割り込み)については
    ベクタ内でフラグのセット程度しかしていませんので、
    数usも応答が遅れる原因とは考えにくいと思っています。

    とりあえずはチョコさんのアドバイスにもありますが
    時間に余裕をもたせるために通信レートを遅くして対応するつもりです。

    ※記載漏れておりましたが、fclkは高速オンチップ32MHzで、
     データフラッシュライブラリも使用しています。
  • チョコです。
    >データフラッシュライブラリも使用しています。
    データフラッシュの書込み中には割り込み禁止になっていませんか?
  • チョコさん

    割り込み禁止にしている処理について考えから抜けていました。
    ご指摘ありがとうございます。

    あらためてコードを見直したところ該当する部分が見つかりました。
    (送信データを更新する処理でIICA割り込みをマスクしてました)

    ありがとうございました。