EZ-USB FX3でのDMAを使用したUSB-UARTについて

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
適用対象外

EZ-USB FX3および、SDK 1.3.1を使用して開発を行っております。

機能の一部にSDK内蔵のサンプルプログラム"cyfxusbuart"を参考にUARTからUSBへのDMAを使用したデータ転送機能を

実装しております。

その中でUARTから受信したデータがUSBで送信されず、UARTの受信のオーバフローとなる現象が発生する場合があります。

現象発生時にUARTからUSBへのデータ転送を行っているDMAの状態を"CyU3PDmaChannelGetStatus"関数を使用して

確認したところ、DMA Channelのstateが"CY_U3P_DMA_ERROR"となっておりました。

これについて、代理店を通して問合せを行ったところ、

"UARTのDMAがラップアップの最中にUARTの受信データを受け取ってしまった場合にそのstateになる"

という事と、本件についてはSDK 1.3.3までにある既知の問題であるとの回答を頂きました。

(FX3 SDK Release Note Version 1.3.1の11  Known Issues & Solutions、No8に該当するとの

回答を頂いております。)

本件について、現象発生の原因および、対策に関する下記事項を教えてください。

1) ラップアップ処理について

    既知の問題としてUARTのDMAがラップアップ中にUARTにてデータを受信した場合にDMAの状態が

    "CY_U3P_DMA_ERROR"になるとのことですが、ラップアップ処理とはSDKで提供頂いている

    APIの"CyU3PDmaChannelSetWrapUp"関数のことで、ラップアップ中とは"CyU3PDmaChannelSetWrapUp"関数を

    コールして戻ってくるまでの間のことであるとの認識であっておりますか。

   

2) 現象が発生する条件・タイミングについて

    USB-UARTのDMA転送トリガとして下記の2パターンがあると認識しておりますが、

    上記1)の認識が合っているとした場合、今回の問題は②のパターンにおいて、

    "CyU3PDmaChannelSetWrapUp"関数の処理中にUARTでデータを受信した場合にのみ今回の現象が

    発生するとの認識ですがあっておりますか。

   

    認識が異なる場合、具体的にどのようなタイミングでUARTでデータを受信した場合に

    問題が発生するのか教えてください。

   

    ・DMA転送トリガ

      ① UART受信データによりDMAのバッファがフルになった時

      ② ソフトウェアによって"CyU3PDmaChannelSetWrapUp"関数がコールされた時

   

3) 回避策について

    現象の回避策について、"ラップアップの前にUARTのRxブロックを無効にし、ラップアップが終わった後に

    有効にする"ことにより回避が可能との回答を代理店経由で頂いているのですが、

    これは、具体的には"CyU3PDmaChannelSetWrapUp"関数のコールの前にUARTの受信を禁止し、関数から戻った際に

    受信を許可するという認識でよろしいでしょうか。

   

    受信の許可・禁止は、UARTのUART_CONFIGレジスタのbit0:RX_ENABLEにて許可・禁止を行えるとの

    認識ですがあっておりますか。

   

    また、UARTにて1byte受信の途中で上記レジスタで受信を禁止した場合、受信中のデータは

    破棄されるのでしょうか。それとも受信中のデータについては正常に受信を完了するのでしょうか。

0 件の賞賛
1 解決策
lock attach
Attachments are accessible only for community members.
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

1) ラップアップ処理について

はい、ご認識いただいている通りでございます。

2) 現象が発生する条件・タイミングについて

はい、ご認識いただいている通りでございます。

3) 回避策について

> "CyU3PDmaChannelSetWrapUp"関数のコールの前にUARTの受信を禁止し、関数から戻った際に受信を許可するという認識でよろしいでしょうか。

はい、ご認識いただいている通りでございます。

> 受信の許可・禁止は、UARTのUART_CONFIGレジスタのbit0:RX_ENABLEにて許可・禁止を行えるとの認識ですがあっておりますか。

はい、ご認識いただいている通りでございます。

代理店様にもお送りしましたが、参考までにラップアップ前のUART Rxブロックの無効処理、そしてラップアップ後の有効処理が書かれたプロジェクトファイルを添付致します。

"cyfxusbuart.c"の"USBUARTAppThread_Entry"をご確認ください。

> UARTにて1byte受信の途中で上記レジスタで受信を禁止した場合、受信中のデータは破棄されるのでしょうか。

破棄されます。

回避策としては、UART_CTSピンにGPIOピンを接続し、ハードウェアフロー制御を行うことでございます。

(2019年2月追記) SDK 1.3.4からこの回避策が実装されています。

Hirotaka Takayama

元の投稿で解決策を見る

0 件の賞賛
4 返答(返信)
lock attach
Attachments are accessible only for community members.
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

1) ラップアップ処理について

はい、ご認識いただいている通りでございます。

2) 現象が発生する条件・タイミングについて

はい、ご認識いただいている通りでございます。

3) 回避策について

> "CyU3PDmaChannelSetWrapUp"関数のコールの前にUARTの受信を禁止し、関数から戻った際に受信を許可するという認識でよろしいでしょうか。

はい、ご認識いただいている通りでございます。

> 受信の許可・禁止は、UARTのUART_CONFIGレジスタのbit0:RX_ENABLEにて許可・禁止を行えるとの認識ですがあっておりますか。

はい、ご認識いただいている通りでございます。

代理店様にもお送りしましたが、参考までにラップアップ前のUART Rxブロックの無効処理、そしてラップアップ後の有効処理が書かれたプロジェクトファイルを添付致します。

"cyfxusbuart.c"の"USBUARTAppThread_Entry"をご確認ください。

> UARTにて1byte受信の途中で上記レジスタで受信を禁止した場合、受信中のデータは破棄されるのでしょうか。

破棄されます。

回避策としては、UART_CTSピンにGPIOピンを接続し、ハードウェアフロー制御を行うことでございます。

(2019年2月追記) SDK 1.3.4からこの回避策が実装されています。

Hirotaka Takayama

0 件の賞賛
Anonymous
適用対象外

ご回答ありがとうございます。

現象・対策方法については、理解できました。

一点、教えてください。

>参考までにラップアップ前のUART Rxブロックの無効処理、そしてラップアップ後の有効処理が書かれたプロジェクトファイルを添付致します。

対象のプロジェクトファイルは、どこから取得できるのでしょうか。

プロジェクトファイルが見つけられず、困っております。

0 件の賞賛

cyfxusbuart.rarという名前で添付致しました。

CDCのバグか何かわからないのですが、見れなくなっておりました。申し訳ありません。

現在は確認いただけると思いますので、ご参照ください。

よろしくお願い致します。

Hirotaka Takayama

0 件の賞賛
Anonymous
適用対象外

ご対応ありがとうございます。

添付ファイルについては、無事に取得できて対策方法も確認できました。

ありがとうございました。

0 件の賞賛