RL78/G13:シミュレータ上でのUARTのフレーミングエラーについて

はじめて投稿させていただきます。

RL78/G13(R5F100LEAFB)を使用しています。
シミュレータGUI上でUART0の動作確認をしたところ,フレーミングエラーが発生してしまい,質問させていただきました。

・fCLK=32MHz
・UART0
 ・ボーレート: 115,200bps
 ・データサイズ : 8bit
 ・パリティ: なし
 ・ストップビット: 1bit
 ・フローコントロール : なし

 

シミュレータGUIの「自動送信」ボタンを押したところ,5バイト目を受信したところで,フレーミングエラーとなりました。

ソースコードはUART0のドライバを自動生成後,

 ・初期化時のR_UART0_Start()呼び出し

 ・main関数でのR_UART0_Receive()呼び出し

だけ追加しています。

void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
    {
        uint8_t buf[100] = {0};

        MD_STATUS err;
        err = R_UART0_Receive(buf, 99);
        while(1) {

        }
    }
    /* End user code. Do not edit comment generated here */
}

 

void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    R_UART0_Start();
    EI();
    /* End user code. Do not edit comment generated here */
}

 

分周比(SDRレジスタのビット15~9)を見ると68になっており,手計算でも確かに64になります。

r_cg_serial.h 376行目

#define _8800_UART0_RECEIVE_DIVISOR (0x8800U)

試しに分周比を69に変更したところ,フレーミングエラーは発生しなくなりました。
しかし,なぜボーレートの誤差が少ない方がフレーミングエラーになるのか理由が分からず,質問させていただいた次第です。

分周比68 誤差 0.64%
分周比69 誤差 -0.79%

 

プロジェクトファイル一式を添付いたします。

0825.uart.zip
よろしくお願いいたします。

Parents
  • チョコです。

    アップされたプロジェクトをビルドしてシミュレータで動作させましたが、エラーは発生しませんでした。

    (ダウンロードした段階で、「自動送信」をクリックしてからブレークポイント有効で実行させました。)

    受信バッファには受信した値がきちんと入っています。

    また、受信エラー割り込みにブレークポイントを設定しておきましたが、ブレークはかかりませんでした。

     

    このプロジェクトで気になったのは、WDTが禁止されていない(動作している)のに何もケアされていないことです。

    コード生成ではディフォルトでWDTが許可されているので、使わないなら禁止に設定してください。

     

  • チョコです。
    追加情報です。7/20にCS+がバージョンアップされています。私は、その新しいバージョンに更新済の環境で評価しました。
    念のために、最新版にバージョンアップして確認されることをお勧めします。

    なお、受信チャネルのSDRでの分周比を大きくすると、受信のサンプリングタイミングは遅くなります。通常の通信の場面では、それでフレーミングエラーがなくなるということは、受信信号の速度が遅すぎると考えられます。しかし、シミュレータでは、同じタイミングになっているはずです。にもかかわらず、フレーミングエラーが発生するということはシミュレータがおかしいと考えるべきでしょう。(対策はバージョンアップ?)
  • チョコ様

    ツールのバージョンとWDTの情報,ありがとうございます。
    UART周りだけ見ていて,WDTの問題には気が付いておりませんでした。

    (どうやらシミュレータが怪しいとの結論が出ておりますが)
    そちらでは現象が再現しなかったとのこと,
    添付していただいた画面では,
    r_cg_serial_user.cの

    129行目 r_uart0_callback_receiveend(void) 受信完了割込み
    にブレークポイントが設定されているようですが,

    93行目 r_uart0_interrupt_error(void) 受信エラー割込み
    にブレークポイントを設定しても同様でしょうか?

    当方では,
    ・ツールを最新版に更新
    ・プロジェクトを新規に作成
    ・WDTを使用しない設定に変更して,再度,コード生成
    して試しましたが,フレーミングエラーが変わらず発生しました。

    実行手順
    1.シミュレータへプログラムをダウンロード
    2.ブレークポイントを設定
    3.CPUリセット後,プログラム実行
      (受信待ちになる。)
    4.シミュレータGUIの「自動送信」ボタンを押す
      (フレーミングエラーが発生)

    よろしくお願いいたします。
  • チョコです。

    失礼しました。ブレークポイントの位置を間違えていました。

    こちらでも、同様の現象を確認できました。

    ブレークしたときのタイミングチャートを眺めてみると、割り込みを受け付けた状態では、RxDが立ち上がってすぐのタイミングになっています。

    ここが、12432クロック目のスタートビットの立下りから2504クロック目に相当します。このタイミング波形自体は問題ないのですが、UART は、このタイミングではサンプリングしません。必ず、ビットの中央でサンプリングするので、2640辺りでサンプリングして、結果を割り込みで知らせるはずです。

    つまり、シミュレータでは、UART のRxD信号のサンプリングタイミングを間違えています。(サンプリングが早い方にずれているので、TDRの値を大きくしたら正常になったものです。

    シミュレータのバグです。(又は手抜きです。)

    データのMSBが1になっていれば、フレーミングエラーは発生しなかったと考えられます。

     

  • チョコ様

    再度のテストと詳しい解説をいただき,ありがとうございます。

    ここ数日間,解決できずに困っていたのですが,
    ツール側の問題ということで納得いたしました。

    ありがとうございました。
  • チョコです。

    この件は、やはりシミュレータの手抜き(いろんな項目のトレードオフの結果)でした。
    この暫定対策と言える方法が分かりました。
    RL78のSAUで設定したボーレートの計算値をシミュレータのフォーマットのボーレートに設定すればいいようです。
    この場合には、RL78のSAUの設定は、fMCK=fCL/2=16MHz なので、
      16*10^6 / (68+1) / 2 = 115942bps
    がRL78の実際のボーレートになります。
    そこで、115200ではなく、この値(115942)を設定すればいいとのことでした。

    最終的な対策はシミュレータの修正が必要ですが、細かいところまでデバイスに合わせようとすると性能が出なくなる(使い物になるスピードが得られない)ようです。そこらは、ルネサスのシミュレータの担当の頑張りを期待します。
  • チョコ様

    情報,ありがとうございます。
    回避策が分かり,大変,助かりました。
Reply Children
No Data