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