こんにちは。NoMaYです。いま2つ気になっています。(1) ICCRL78とLLVM-RL78(とGNURL78)でワーニングレベルを上げるとワーニングがとてもたくさん出る(2) RL78スマートコンフィグレータGUI上でオンチップデバッグトレースを使用する設定にしても予約RAM領域を空けていない
チョコです。
コード生成でも最近問題になったのですが、スレーブ受信の"r_Config_IICA0_callback_slave_receiveend"を呼んでいる場所は最後のデータを受信した8クロック目のACK応答戻すタイミングの割り込みのところです。この後、1クロック経過したらACKを確認する9クロック目で割り込みが発生します。"r_Config_IICA0_callback_slave_receiveend"で長い処理を行うと、おかしなタイミングでの割り込みとなってしまいます。
正しくは9クロック目の転送まで終了した下側の赤い四角で囲んだ「WREL0 = 1U;」の後にすべきです。少なくとも、この後にIICA0の割り込み発生はない、本当の最後です。
また、callback関数の中(まだ割り込み処理の中です)で長い処理をゆるすのも問題があります。ここは、単純にフラグ処理だけにして、割り込みを抜けたところで続きの処理を行わせるべきではないでしょうか。
スレーブ処理については、まだまだ言いたいことがあります。IICA0の場合にはI2Cバスの状態はIICS0レジスタでモニタされています。勝手に作った"g_iica0_slave_status_flag"みたいな変数で制御するのは間違いです。
"if (0U == (g_iica0_slave_status_flag & _80_IICA_ADDRESS_COMPLETE))"は"if( 1==STD0)で判断すべきです。
ついでに、ストップ・コンディション検出割り込み処理の中でSPIE0を0にするのも間違いです。
>"if (0U == (g_iica0_slave_status_flag & _80_IICA_ADDRESS_COMPLETE))"は"if( 1==STD0)で判断すべきです。
これについて、少し追加しておきます。
マスタが、通信完了時にストップコンディションを発行しないで、リスタートを行うのはSCでもサポートされています。
マスタがリスタートを行ったときに、このスレーブの処理では対応できません。ここらが、コード生成でもリスタートに対応できなかった原因と考えられます。if( 1==STD0)で処理していればきちんと処理できるようになったと思われます。