はじめて投稿させていただきます。
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よろしくお願いいたします。
チョコです。
アップされたプロジェクトをビルドしてシミュレータで動作させましたが、エラーは発生しませんでした。
(ダウンロードした段階で、「自動送信」をクリックしてからブレークポイント有効で実行させました。)
受信バッファには受信した値がきちんと入っています。
また、受信エラー割り込みにブレークポイントを設定しておきましたが、ブレークはかかりませんでした。
このプロジェクトで気になったのは、WDTが禁止されていない(動作している)のに何もケアされていないことです。
コード生成ではディフォルトでWDTが許可されているので、使わないなら禁止に設定してください。
失礼しました。ブレークポイントの位置を間違えていました。
こちらでも、同様の現象を確認できました。
ブレークしたときのタイミングチャートを眺めてみると、割り込みを受け付けた状態では、RxDが立ち上がってすぐのタイミングになっています。
ここが、12432クロック目のスタートビットの立下りから2504クロック目に相当します。このタイミング波形自体は問題ないのですが、UART は、このタイミングではサンプリングしません。必ず、ビットの中央でサンプリングするので、2640辺りでサンプリングして、結果を割り込みで知らせるはずです。
つまり、シミュレータでは、UART のRxD信号のサンプリングタイミングを間違えています。(サンプリングが早い方にずれているので、TDRの値を大きくしたら正常になったものです。
シミュレータのバグです。(又は手抜きです。)
データのMSBが1になっていれば、フレーミングエラーは発生しなかったと考えられます。