PSoC 3, PSoC 4, PSoC 5LP 設計での UDB UART のエラーコンディション対応 - KBA221688- Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
Community Translated by MoTa_728816 Version: **
質問:
PSoC 3, PSoC 4, PSoC 5LP を使用した設計で、UDB UART を使用時にエラーコンディションを正しく処理するのにはどうしたら良いでしょうか?
回答:
UDB UART はパリティ、ストップビット、オーバーランなどのエラー検出をサポートしています。これらのエラーを確かに検出するためにはコードを正しく処理する必要があります。以下、読みやすさのためにコンポーネントのインスタンス名は UART とします。
UART には2つのオペレーションモードがあります: FIFO モード (RX バッファのサイズが 4 の場合) と バッファモード (RX バッファサイズが 4より大きい場合)。
現行の UART_GetChar() 関数の実装においては:
・バッファモードでは RX FIFO を直接読んで、その後 RX FIFO のステータスをクリアします。そのため、RX の割込みは発生されません、
そして UART_GetChar() の戻り値が 0 の場合には以下のエラーが発生したことを示します。
・読むべきデータがない。
・UART でなんらかのエラーが発生した。
しかし、これらのケースを区別できる必要があります。もしエラーが発生した場合、その文字または受信したパケットを破棄する必要があります。一方、データが無い場合というのはパケットの終了を意味します。
そのためバッファモードで UART_GetChar() が使用されるとエラーを適切に検出できない可能性があります。ワークアラウンドとしては、バッファにデータがあるか確認後、UART_GetChar() をコールします。この方法であれば問題を原因となるデータの RX FIFO からの直接読出しが行われないことが保証されます。
問題を回避するために下記のコードをお使いいただけます。
void ReadPacket(void)
{
uint8 packet[PACKET_SIZE]; /* Rx バッファのサイズ > 4 */
uint8 idx = 0u;
/* UART バッファからパケットを取得する */
while ((UART_GetRxBufferSize() > 0u) && (idx < PACKET_SIZE))
{
packet[idx] = UART_GetChar();
/* 受信した1バイトをエコーする */
UART_PutChar(packet[idx]);
idx++;
}
/* エラー (例えばフレームエラー等)が発生したかを確認する */
if (0u != (UART_errorStatus & UART_RX_STS_STOP_ERROR))
{
/* パケットを無効にマークする */
packet[0u] = 0xFF;
UART_DisableRxInt();
/* RX バッファをクリアする */
UART_ClearRxBuffer();
/* エラー検出用変数をクリアする */
UART_errorStatus = 0u;
UART_EnableRxInt();
/* 以降にフレーミングエラーが発生したことを示す(例えば GPIO ピンを立てる等の)コードを追加できます。 */
}
}