チョコさん、こんにちは。NoMaYです。すみません、掲題の件、下記のスレッドでの話題ですが、コード生成されたソースの以下のコードのことでしょうか?r_cg_serial_user.c
static void __near r_csi00_interrupt(void){ if (g_csi00_tx_count > 0U) { SIO00 = *gp_csi00_tx_address; gp_csi00_tx_address++; g_csi00_tx_count--; } else { if ((SSR00 & _0040_SAU_UNDER_EXECUTE) == 0U) { r_csi00_callback_sendend(); /* complete send */ } else { SMR00 &= ~_0001_SAU_BUFFER_EMPTY; } }}
RL78/G14のEEPROMのI2C通信についてjapan.renesasrulz.com/cafe_rene/f/002-2095199602/5962/rl78-g14-eeprom-i2c/33068#33068「チョコです。鈴木さん,MAX7219をCSIで制御してLED表示を行っていて,問題を見つけました。CSIの連続送信で最後のデータを書き込んだ後で,割り込みタイミングを書き換えてますが,転送速度とプログラムの実行速度の関係で,最後の割り込みが発生しない可能性があります。」RL78/G13 CSIのマスタ連続送受信でオーバーランエラーが発生するjapan.renesasrulz.com/cafe_rene/f/002-2095199602/5972/rl78-g13-csi/33137#33137「チョコです。この現象については,「RL78/G14のEEPROMのI2C通信について」で少し触れていますが,次のような動作になっていると考えられます。①最後のデータを書き込むための割り込みが発生します。②CSIは最後のデータを送信します。③CPUは割り込みを受け付けると,最後のデータの送信中かチェックして,最後のデータなら割り込みタイミングを転送完了に書き換えます。ところが,③で割り込みタイミングを書き換える前に送信が完了してしまっていると,書き換えた時点では,送信完了割り込みの発生タイミングを終了しているので,期待した最後の割り込みが発生しません。そのため,通信処理を終えることができなくなってしまいます。」なお、以下のCS+ V8.03の画面コピーは先程のソースを生成させた時のコード生成機能の設定内容です。
チョコです。
NoMaYさん,半年くらい前のものですね。
>すみません、掲題の件、下記のスレッドでの話題ですが、コード生成されたソースの以下のコードのことでしょうか?
はい,そうです。
問題は,「if ((SSR00 & _0040_SAU_UNDER_EXECUTE) == 0U)」の段階では,まだ送信中でこのif文は不成立で,elseの「SMR00 &= ~_0001_SAU_BUFFER_EMPTY;」で割り込みタイミングを変更する前に転送が完了したときです。この場合には,割り込みのタイミングを転送完了に変更した段階ではすでに割り込みのトリガになる転送完了は終わっているので,割り込みタイミングを変更しても新たな割り込みは発生しません。
この現象は,転送スピードを速くしないと出てきません。