この記事では、i.MX6シリーズで発生することがある問題について、1つのヒントを示します。RXラインがずっとハイのときに、UARTが継続的にRX割り込みを生成し、0xFFを受信するという問題です。
以下に、imx6DLを用いて説明いたします。一部の設定は、再現を容易にするためのものです。
BSP バージョン:L5.4.70-2.3.0
ボードHW:MCIMX6DL-SDB
問題が発生する状況
この状態では、RX ラインをハイに戻しても、UART は継続的に RX 割り込みを生成し、0xFF を受信していることが表示されます。
問題が発生する原因
このローの時間は正常な範囲内になく、当社の仕様から外れています。
i.MX6DLのAECのドキュメントには、次のような「UARTレシーバ」というセクションがあります。
1200ボーを使用する場合、有効な1ビットの時間は833マイクロ秒です。そして仕様には、「各ビットで1/(16 x Fbaud_rate)の許容誤差を認める」との規定があります。つまり1200ボーの場合には、有効な1ビットの範囲は781~885マイクロ秒です。しかし、問題を再現するときのロー・レベルの時間は360マイクロ秒です。この範囲外の時間によって、UARTのステート・マシンが混乱します。
解決方法
実際には、当社の仕様に従っていただくのが最善の方法です。お客様の環境でこのような未知の状況が発生する場合には、お客様が直面する問題を解決するためのヒントとして、次のような方法が考えられます。
割り込みハンドラは USR1[AWAKE] を確認します。
2 AWAKEがアサートされている場合は、それをクリアして、通常どおり処理を進めます(有効なデータがあると想定します)。それ以外の場合は、USR1[AGTIM] がアサートされているかどうかを確認します。
3 AGTIMがアサートされている場合は、それをクリアして、通常どおり処理を進めます。それ以外の場合は、ソフトウェア・リセットを実行します(データが無効であるものと想定します)。
AGTIMをチェックするのは、RX FIFOにいくつかの文字(RXTL未満)があるものの、それ以上のデータが入ってこないときの競合状態に対処するためです。
この手順に従うと、ブロック割り込みが発生したときにUARTはソフトウェア・リセットを実行します。
注:お客様の報告によると、RXラインで有効なスタート・ビットが検出された場合には、エラーがクリアされる可能性があります。これはお客様自身で確認していただく必要があります。
テストコードは添付ファイルに含まれています。
Besst Regards