こんにちは、 @nxpチーム
S32K311ターゲット ハードウェアで DMA モードで UART 通信を使用していますが、マスターとスレーブの間で 1 回の転送も行われません。両側とも 512 バイトのバッファを使用しています。ただし、MCU 側ではコールバックがトリガーされ、LPUART_UART_IP_EVENT_ERROR が発生し、UartState のステータスは常にオーバーラン状態を示します。
私が試したボーレートの範囲は 100 kbps から 900 kbps です。
注:ボー レートに問題がないことを確認するために、定期的な送信だけでなく単一の送信でもテストしました。ただし、システムは常にオーバーラン状態になります。
設定を確認していただけますか?参考までに、設定のスクリーンショットと UART モジュールの設定を添付しました。
通信には UART から USB 用のチャネル UART3 とデバッグ モード用の UART0 が使用され、同様に USRT チャネルの両方に TX と RX 用の 4 つの DMA チャネルを作成しました。
@Julián_AragónMさん、返信ありがとうございます
実際、バージョン互換性の問題により、指定された例をシステムにロードできません。ただし、RM モジュールを追加してテストしてみます。
私の S32 IDE バージョンは3.6.3で、 RTD バージョンは6.0.0です。
こんにちは@jagannath 、
社内ケースにも入力されているようですが、そこでもあなたの問題に返信しましたが、念のため、こちらでも返信させていただきます。
使用している RTD と S32DS のバージョンを教えていただけますか?
画像から、「Rm」モジュールがプロジェクトに含まれていないことがわかります。DMA を使用するには、「リソース マネージャー」ドライバーを追加し、DMA Mux サポートを有効にして、それぞれの DMA MUX チャネルを構成する必要があります。
コミュニティ内の既存のルーチンを参照できます:例: DMA DS3.5 RTD300 を使用した S32K312 UART 送信と受信。
よろしくお願いします、
ジュリアン
@nxpこれについてさらに詳しい情報が必要な場合はお知らせください。
こんにちは@Julián_AragónM
RM モジュールを追加しましたが、 DMA Mux ソース フィールドが無効になっており、編集できません。これが私の設定と指定された例の設定の唯一の違いです。ただし、得られる結果は前のエラーと同じです。
サンプル構成のスクリーンショットと構成MEX ファイルを添付しました。
S32 IDE バージョン: 3.6.2
RTD バージョン: 6.0.0
ご都合の良い時にこれを見てもらえませんか?
こんにちは@jagannath 、
RTD 3.0.0から以降、DMA サポートは MCAL レイヤーから Rm モジュールに移動されました。RM モジュールは IP 層をサポートしていません。したがって、ユーザーは RM モジュールを High Layer に直接追加する必要があります。
S32K3XXRM からの DMAMUX マップ Excel ファイル添付ファイルを見ると、LPUART0 が DMAMUX0 に割り当てられ、LPUART3 が DMAMUX1 に割り当てられていることがわかります。
DMA Mux ソース フィールドは無効になっており、編集できません。
この発言は理解できません。画像から、最初の Dma Mux ソース コンテナーが使用可能であることがわかりますが、それらは 'REQ_DISABLED' として構成されています。LPUART チャネルを DMA MUX ソースと次のようにリンクする必要があります。
私が共有した例に関しては、プロジェクトはRTD 3.0.0で開発されているため、直接インポートすることはできません。RTD 6.0.0 を使用している場合。ただし、構成とメイン ファイルをワークスペースにコピーして、UART + DMA をテストすることはできます。
よろしくお願いします、
ジュリアン
こんにちは@Julián_AragónM
S32 IDE バージョン: 3.6.2
RTD バージョン: 6.0.0
注記:
MCAL は通常 AUTOSAR ベースのアーキテクチャ内で使用されるため、現在プロジェクトでは AUTOSAR モジュールを使用しておらず、MCAL モジュールを含める予定はありません。私たちの要件は、MCAL RM ドライバを使用せずに DMA ベースの通信を有効にすることです。MCAL(RM)に依存せずにDMAモードを動作させることが可能かどうか確認して頂けますでしょうか?
これまで詳細な情報を提供してくださった@Julián_AragónMに感謝します。
現在、MCU にデータを送信するとコールバックがトリガーされますが、イベントは常に「LPUART_UART_IP_EVENT_ERROR」になります。このため、私はこの問題から抜け出すことができません。例やコミュニティの投稿に基づいていくつかのアプローチを試しましたが、残念ながら、これまでのところどれも問題を解決していません。
ここに私のワークスペース全体を添付しました。何か問題がないか確認するために、確認していただけますか?可能であれば、あなたのシステムでも実行していただければ幸いです。
ご協力ありがとうございます。
こんにちは@jagannath 、
返信が遅くなってごめんなさい!
最初の問題については、プロジェクト内で UART バッファがキャッシュ不可能な領域で宣言されていないことがわかります。D-CACHE が有効な場合に発生する可能性のある一貫性の問題を回避するために、ユーザーは、TCD のソースおよび宛先として使用されるバッファが NON-CACHEABLE 領域に割り当てられていることを確認するか、キャッシュのアドレスを無効にする必要があります。
#pragma GCC section bss ".mcal_bss_no_cacheable"
uint8_t tx_data[15];
uint8_t rx_data[15];
#pragma GCC section bss
2 番目の問題については、割り込みとハンドラーを確認できますか?uart 転送関数を呼び出すと、何が返されますか?
よろしくお願いします、
ジュリアン
こんにちは@Julián_AragónM
サポートありがとうございます。今では状況は大幅に改善され、RM モジュールを追加して構成を修正した後、DMA 転送が機能し始めました。ただし、以下のように、データの欠落/上書きの問題がまだいくつかあるようです。
1.最初の(新しい)送信中は、データの最初の約 20 バイトと最後の約 10 バイトが常に欠落します。
マスターは100 ミリ秒ごとに 512 バイトのデータを定期的に送信します。
MCU バッファサイズも 512 バイトです。
MCU は512 バイトが受信されたと報告しますが、最初の約 20 バイト (場合によっては最後の約 10 バイト) が欠落しており、 21 バイト目以降の残りのバイトは正しいです。
2. 2回目以降の送信中:
バッファの内容は次のように断片化されて表示されます。
インデックス0~83 → 0xAA(デフォルト値)を含む
インデックス84~116 →有効データ
インデックス117~308 → 0xAA(デフォルト値)
インデックス308~340 →有効データ
インデックス340~372 → 0xAA(デフォルト値)
3. 4/5 転送後、データ転送は完全に停止しますが、パリティ/フレーミング/オーバーランなどのイベント情報は発生しません。
このパターンが継続し、数回の送信後にデータ転送が完全に停止します。
この動作の原因を特定するのにご協力いただけますでしょうか?
よろしくお願いします。
@Julián_AragónM さん、サポート本当にありがとうございます。問題は解決し、すべて正常に動作しています。ご協力いただき、大変感謝しております。
ありがとう