UART3 オーバーラン エラーが RT1020 で発生 Hi, RT1020のuart3割り込みを使用していますが、rs-485通信にはuart3を使用しており、その速度は3MBpsです。 また、他の通信にはLPSPI4 CMSISドライバーハンドラーを使用しています。 uart3 個々は正常に動作しますが、spi ハンドラを追加すると、オーバーランが発生し始めます。 まだオーバーランフラグをクリアしていますが、なぜこのフラグが設定されているのですか。 また、このフラグが設定されている場合の1つのクエリは、この場合、すべてのデータを受け取るか、または失われます Uart_status register.PNG ? i.MXRT 102倍 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
お返事ありがとうございます。
NXPのポリシーにより、ソースコードを直接お送りすることはできません。
私の確認コードはMIMXRT1020-EVKおよびMIMXER1064-EVKボードに基づいていますが、私の確認コードはカスタマイズされたボードに適しているとは思いません。
また、あなたの質問に関する重要なコードのスクリーンショットをお送りしました。
次の3つのプロジェクトを検証プロジェクトに統合します。
MIMXRT1020-EVKボードの場合:
1: evkmimxrt1020_pit
2:evkmimxrt1020_lpi2c_edma_b2b_transfer_master
3:evkmimxrt1020_lpuart_edma_transfer
MIMXRT1064-EVKボードの場合:
1:evkmimxrt1064_lpi2c_edma_b2b_transfer_slave
それでもI2Cプログラムが正しく機能しない場合は、I2Cプログラムに問題がある可能性があります。他の機能を無効にして、I2Cだけをテストして、正常に動作するかどうかを確認することをお勧めします。
私は現在の問題を解決したと思います。このケースを閉じるように私に言ってください。
それでも問題が解決しない場合は、新しいケースを作成してください、ありがとう。
BR
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu、 貴重なご提案をいただき、ありがとうございます。 あなたのコードを私と共有していただけませんか。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant ,
edma_b2b_transfer_masterとしてMIMXRT1020-EVKボードを使用し、edma_b2b_transfer_slaveとしてMIMXRT1064-EVKボードを使用します。
mayliu1_4-1732184845065.jpeg
MIMXRT1020-EVKボードをベースにプロジェクトを作成し、このボードをI2Cマスターとして設定し、UART TX、UART RXを追加し、完全に4つのDMAチャネルを使用します。MIMXRT1020-EVKプロジェクトとMIMXRT1064-EVKプロジェクトの両方のコードを一部修正します。
その結果、両方のプロジェクトが正常に実行されます。
mayliu1_5-1732184992668.png
だから、あなたのコードを確認してください、私があなたに示した重要なコードは以下です。
mayliu1_0-1732184067449.png
mayliu1_1-1732184078401.png
mayliu1_2-1732184103892.png
mayliu1_3-1732184133614.png
試してみて、このケースを閉じるように私に言ってください。
それでも疑問がある場合は、新しいケースを作成してください。
BR
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu 、 返信ありがとうございます。 freeRTOSではなく、裸のmatelを使用しています。 裸のボードプロジェクトを確認して下さい。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant ,
あなたの返信をありがとう、私は私の側でそれをやってみます。
プロジェクトがFreeRTOSオペレーティングシステムを使用しているか、ベアボードを使用しているかを教えてください。私はあなたが行うようにプロジェクトを作成し、検証しようとします、それは非常に重要です。
どうかご辛抱ください、ありがとう。
BR
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu、 返信ありがとうございます。 2つのDMAを追加するだけで、これらのことをシミュレートできますか:1つはUART、もう1つはI2Cで、優先度が競合するかどうかを確認できます Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant ,
返信ありがとうございます。
よろしければ、現在のケースリストの項目が多すぎるため、新規にケースを作成してください。
モジュールを DMA で適切に動作させる場合、特に一部のモジュールをタイムリーに処理する必要がある場合は、使用するすべての DMA チャネルの優先順位付けを検討する必要があります。
あなたのプロジェクトとDMAの優先設定がわかりません。ですから、都合が良ければコードを送ってください。
不便な場合は、この2つの機能を検討し、パラメータを再確認することをお勧めします。
void EDMA_SetChannelPreemptionConfig(DMA_Type *base, uint32_t channel, const edma_channel_Preemption_config_t *config)
NVIC_SetPriority
それがあなたの助けになることを願っています。 それでもご不明な点がございましたら、お気軽にお知らせください。
BR
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu、 返信ありがとうございます。 この問題を解決する方法を教えてください。 それでも、私はこのDMAの優先課題に直面しています。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant ,
更新していただきありがとうございます。
私はあなたの返信を再確認しました、私はあなたが正しいと思います。おそらく、I2C DMAとUART DMAの優先順位が競合しているためです。
それがあなたの助けになることを願っています。 それでもご不明な点がございましたら、お気軽にお知らせください。
よろしくお願いいたします。
mayliu
Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu、 更新していただきありがとうございます、 私のカスタムボードRT1020はi2cマスターで、スレーブDACに接続されており、正常に動作します。 しかし、私の問題は、チャネルの優先度(EDMA_SetChannelPreemptionConfig)構成コードを追加しようとすると、コードがi2c dmaに固執することです。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant ,
更新していただきありがとうございます。
アプリケーションがスタックする理由は、開発ボードのI2CマスターノードをI2Cスレーブノードに接続する必要があるためです。
開発ボードで確認しましたが、I2Cスレーブノードに接続しないと、あなたと同じようにエラーが発生します。2つの開発ボードを使用する場合、1つは「lpi2c_edma_b2b_transfer_master」、もう1つは「lpi2c_edma_b2b_transfer_slave」です。2つのボードを正しく接続すると、プログラムは正常に動作します。
"lpi2c_edma_b2b_transfer_master" プロジェクトを作成でき、検証する他のコードを追加しないでください。
よろしくお願いいたします。
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu、 これは「lpi2c_edma_b2b_transfer_master」であり、この名前の下に、uart、dma、spi、i2c、dmaなどのすべてのモジュールを追加しました。 優先度関連を削除したとき、アプリケーションは正常に動作します Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant ,
この問題は、現在のケーステーマ「UART3オーバーランエラーがRT1020で発生する」とは関係ないと思います。
私はあなたと同じようにSDKデモをインポートします、私はこのデモ「lpi2c_edma_b2b_transfer_master」がスレーブとして他のボード上のlpi2cインスタンスを必要とすることを発見しました。
mayliu1_0-1731493594740.png
I2Cスレーブがないため、lpi2c_master_callbackを呼び出すことができず、アプリケーションがスタックしました。
mayliu1_1-1731493614957.png
BR
mayliu
Re:UART3オーバーランエラーがRT1020で発生 Hi @mayliu1 更新していただきありがとうございます。 I2c DMA に引っかかっています。 ここで1つの質問があります:I2C DMAとUART DMAの間で優先順位が競合していますか しかし、I2C DMAでは、優先度を設定していません。 Re:UART3オーバーランエラーがRT1020で発生 親愛なる@hanmant、
更新していただきありがとうございます。
関数を追加すると、アプリケーション全体がスタックすると言いました。
アプリケーション全体が行き詰まったときの詳細情報を教えてください。
1:アプリケーションが行き詰まった場所、どの機能か教えてください。
2:アプリケーションが動かなくなった場合は、RT1020レジスタ、障害、周辺機器のステータスを読み取り、何か異常がないか確認してください。
次の図は、問題を確認するためのデモにすぎません。
mayliu1_0-1731480630949.png
それがあなたを助けることを願っています!
よろしくお願いいたします。
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu このコードが機能していないのは、この行のコードをコードに追加すると、アプリケーション全体が動かなくなったことを意味します 定数 edma_channel_Preemption_config_t Channel_preemption_config = { .enableChannelPreemption= false、 .enablePreemptAbility= trueの場合、 .channelPriority(英語)= 15ユー }; 定数 edma_channel_Preemption_config_t Channel14_preemption_config = { .enableChannelPreemption= false、 .enablePreemptAbility= trueの場合、 .channelPriority(英語)= 14U }; EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR,LPUART_TX_DMA_CHANNEL,&Channel_preemption_config); EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR、LPUART_RX_DMA_CHANNEL、&Channel14_preemption_config); 注:このuart DMAには別のi2c DMAもありますが、i2c DMAの優先度は設定していません Re:UART3オーバーランエラーがRT1020で発生 親愛なる@hanmant、
私はあなたの成功を願っています、そしてまた私は少しアドバイスがあります。
LPUART_TransferCreateHandleEDMA機能の後にNVIC_SetPriority機能を置く方が良いでしょう。
あなたの良いニュースを待っています。
mayliu1_0-1730453159868.png
よろしくお願いいたします。
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu、 返信ありがとうございます lpuart_config_t lpuartConfig; lpuart_transfer_t sendXfer; lpuart_transfer_tはXferを受け取ります。 edma_config_t userConfig = {0}; uint32_t uiCnt = 0; /* LPUART を初期化します。*/ /* ※lpuartConfig.baudRate_Bps= 115200U; * lpuartConfig.parityMode = kLPUART_ParityDisabled; * lpuartConfig.stopBitCount= kLPUART_OneStopBit; * lpuartConfig.txFifoWatermark= 0; * lpuartConfig.rxFifoWatermark= 0; * lpuartConfig.enableTx = false; * lpuartConfig.enableRx = false; */ LPUART_GetDefaultConfig(&lpuartConfig); lpuartConfig.baudRate_Bps= UART3_BAUDRATE; lpuartConfig.enableTx = true; lpuartConfig.enableRx = true; LPUART_Init(DEMO_LPUART, &lpuartConfig, DEMO_LPUART_CLK_FREQ); DMA 割り込みの NVIC 優先度を最高優先度に設定します NVIC_SetPriority(DMA0_DMA16_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));DMA0割り込みの優先度が最も高い DMA1_DMA17_IRQn #if 定義(FSL_FEATURE_SOC_DMAMUX_COUNT) & FSL_FEATURE_SOC_DMAMUX_COUNT /* DMAMAX を初期化する */ DMAMUX_Init(EXAMPLE_LPUART_DMAMUX_BASEADDR); /* LPUARTのチャンネルを設定 */ DMAMUX_SetSource(EXAMPLE_LPUART_DMAMUX_BASEADDR、LPUART_TX_DMA_CHANNEL、LPUART_TX_DMA_REQUEST); DMAMUX_SetSource(EXAMPLE_LPUART_DMAMUX_BASEADDR、LPUART_RX_DMA_CHANNEL、LPUART_RX_DMA_REQUEST); DMAMUX_EnableChannel(EXAMPLE_LPUART_DMAMUX_BASEADDR、LPUART_TX_DMA_CHANNEL); DMAMUX_EnableChannel(EXAMPLE_LPUART_DMAMUX_BASEADDR、LPUART_RX_DMA_CHANNEL); #endif /* EDMAモジュールを初期化します */ EDMA_GetDefaultConfig(&userConfig); #if 定義(BOARD_GetEDMAConfig) BOARD_GetEDMAConfig(userConfig); #endif EDMA_Init(EXAMPLE_LPUART_DMA_BASEADDR, &userConfig); EDMA_CreateHandle(&g_lpuartTxEdmaHandle, EXAMPLE_LPUART_DMA_BASEADDR, LPUART_TX_DMA_CHANNEL); EDMA_CreateHandle(&g_lpuartRxEdmaHandle, EXAMPLE_LPUART_DMA_BASEADDR, LPUART_RX_DMA_CHANNEL); #if 定義(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX EDMA_SetChannelMux(EXAMPLE_LPUART_DMA_BASEADDR、LPUART_TX_DMA_CHANNEL、DEMO_LPUART_TX_EDMA_CHANNEL); EDMA_SetChannelMux(EXAMPLE_LPUART_DMA_BASEADDR、LPUART_RX_DMA_CHANNEL、DEMO_LPUART_RX_EDMA_CHANNEL); #endif DMAチャネルの優先順位を設定 EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI[LPUART_TX_DMA_CHANNEL] = (EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI[LPUART_TX_DMA_CHANNEL] & ~DMA_DCHPRI_CHPRI_MASK) |DMA_DCHPRI_CHPRI(15); EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI[LPUART_RX_DMA_CHANNEL] = (EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI[LPUART_RX_DMA_CHANNEL] & ~DMA_DCHPRI_CHPRI_MASK) |DMA_DCHPRI_CHPRI(15); EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI0 定数 edma_channel_Preemption_config_t Channel_preemption_config = { .enableChannelPreemption= false、 .enablePreemptAbility= trueの場合、 .channelPriority(英語)= 14U }; 定数 edma_channel_Preemption_config_t Channel14_preemption_config = { .enableChannelPreemption= false、 .enablePreemptAbility= trueの場合、 .channelPriority(英語)= 15ユー }; EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR,LPUART_TX_DMA_CHANNEL,&Channel_preemption_config); EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR、LPUART_RX_DMA_CHANNEL、&Channel14_preemption_config); /* LPUART DMA ハンドルを作成します。*/ LPUART_TransferCreateHandleEDMA(DEMO_LPUART, &g_lpuartEdmaHandle, LPUART_UserCallback, NULL , &g_lpuartTxEdmaHandle, &g_lpuartRxEdmaHandle); 私はこの方法を使うことを考えています。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant ,
以下の定義の違いを確認し、必要に応じて使用してください。
EDMA_SetChannelPreemptionConfig:主にDMAチャネルのプリエンプション優先度を設定するために使用され、複数のDMAタスクが同時に発生した場合に、最も重要なタスクを最初に処理できるようにします。
NVIC_SetPriority:割り込みの優先度を設定するために使用され、複数の割り込みが同時に発生した場合に、優先度の高い割り込みにCPUが最初に応答して処理できるようにします。
よろしくお願いいたします。
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu、 私はこのように追加することを考えています、 定数 edma_channel_Preemption_config_t Channel_preemption_config = { .enableChannelPreemption= false、 .enablePreemptAbility= trueの場合、 .channelPriority(英語)= 14U }; 定数 edma_channel_Preemption_config_t Channel14_preemption_config = { .enableChannelPreemption= false、 .enablePreemptAbility= trueの場合、 .channelPriority(英語)= 15ユー }; EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR,LPUART_TX_DMA_CHANNEL,&Channel_preemption_config); EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR、LPUART_RX_DMA_CHANNEL、&Channel14_preemption_config); それは正しいですか、そうではありません。 ご確認ください Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant ,
更新情報ありがとうございます。
私はあなたがNVIC_SetPriority(IRQn_Type IRQn、uint32_t優先度)機能を使用できることをお勧めします。
1: 最初のパラメータはIRQn_Typeです。
デザインによって異なりますが、UART3 が DMA チャネル 0(#define LPUART_TX_DMA_CHANNEL 0U) を使用している場合、最初のパラメーターは DMA0_DMA16_IRQn です。
2:2番目のパラメータは優先度で、値が小さいほど、対応する割り込みの優先度が高くなります。
よろしくお願いいたします。
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu、 CPUよりもDMAコントローラーにHighest the Priorityを設定する方法を教えてください。 また、DMAでは、SPIよりもUART受信とTXに最高の優先度を設定したいと思います。 プロセスとAPIまたは例を教えてください。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
遅延機能を追加するだけです、私はあなたに示しました。
SDK_DelayAtLeastUs(100000, CLOCK_GetFreq(kCLOCK_CpuClk));
1:さらに、UARTの送受信のデータ形式が一貫しているかどうかを確認することをお勧めします。
2:NXP開発ボードとTI開発ボードが共通の基盤を共有しているかどうかを確認してください。
3:UARTの送信と受信の接続が安全かどうか確認してください。
BR
mayliu Re:UART3オーバーランエラーがRT1020で発生 返信ありがとうございます。 ソースコードファイルを共有していただけませんか。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
問題の原因はわかっていると思います。
プログラム内での継続的なデータ伝送により、TiボードUARTレシーバーがオーバーランし、異常なデータ転送が発生する可能性があります。
52バイトのUARTデータを送信した後、遅延を追加することをお勧めしますので、ぜひお試しください。
私はこれを私の側で100回テストおよび検証しましたが、データの送受信は一貫しています。
mayliu1_1-1729667293341.png
それがあなたの助けになることを願っています。 それでもご不明な点がございましたら、お気軽にお知らせください。 Re:UART3オーバーランエラーがRT1020で発生 Hi @mayliu1 , 返信ありがとうございます。 今のところ、私はuartレシーバーを使用していません。 私が共有したものは UART 送信のみ (サイズ 52 バッファー) ですが、DMA を使用して Ti ボードで正しいデータを受信しません。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
更新情報ありがとうございます。
おっしゃるように、UARTデータのみを送信する場合、なぜUARTオーバーランエラーが発生しましたか?
UART オーバーラン エラーは、UART 受信に関連しています。
そして、UARTデータを送信したい場合は、 それは非常に簡単で、LPUART_SendEDMAを呼び出すだけです。
mayliu1_0-1729663958271.png
BR
mayliu Re:UART3オーバーランエラーがRT1020で発生 返信ありがとうございます。 このプロジェクトでは、DMA uartを使用してデータを送信するだけです。 つまり、私のレシーバーはTiプロセッサデバイスです。 この例ではDMA Uartのみが実行されているため、この例では優先度は重要ではないと思います。 2バイトのデータを送信しようとしましたが、それでも同じ問題があります。 この単純なuart DMA伝送のため、これを機能させるための確固たる解決策を教えてください。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
更新情報ありがとうございます。
DMA UART 受信機能インターフェースをいつ、どこで呼び出すのか教えてください。
「ソースファイル内(lpuart_edma_transfer.c)あなたが送信した、DMA UARTデータ受信インターフェースへの呼び出しは見当たりませんでした。
以下の手順で確認をお試しください。 1:DMA_UART割り込みの優先度を他のモジュールよりも高く設定します。 2:ピンポンバッファを使用してUARTデータを受信します。
それがあなたの助けになることを願っています。 それでもご不明な点がございましたら、お気軽にお知らせください。
よろしくお願いいたします。
mayliu Re:UART3オーバーランエラーがRT1020で発生 Hi @mayliu1 , あなたの提案に従って、私はDMAでuartを設定しましたが、それでも損失が見られます。 レシーバー側で明確な損失が見られます(私のレシーバーは別のデバイスコンポートです)。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
特にUARTのボーレートが特に高い場合は、DMA UARTを使用することを強くお勧めします。
BR
mayliu Re:UART3オーバーランエラーがRT1020で発生 それで、私はDMA uartを実装する必要がありますか? Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
質問: このオーバーランの問題は、spi cmsis ハンドラが含まれた後に発生します。
回答:spi cmsisハンドラの追加により、UART割り込みのエントリが遅延し、UARTデータを時間内に受信できなくなります。
BR
mayliu Re:UART3オーバーランエラーがRT1020で発生 返信ありがとうございます。 このオーバーランの問題は、spi cmsis ハンドラを組み込んだ後に発生します。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
更新情報をいただきありがとうございます。
UART割り込みを使用してUARTデータを送受信すると、UARTバイトごとにUART割り込みがトリガーされます。
UARTのボーレートが非常に高く(3MBps)、頻繁にUART割り込みが発生しますが、これは不合理です。
UARTのボーレートが非常に高い場合にUART割り込みを使用することはお勧めしません。
よろしくお願いいたします。
mayliu Re:UART3オーバーランエラーがRT1020で発生 こんにちは @mayliu1 、 注意:現在、DMA uartを使用していません。uart割り込みを使用しています。 Re:UART3オーバーランエラーがRT1020で発生 Hi @mayliu1 , 返信ありがとうございます。 現在、DMA uartを使用しています。uart割り込みを使用しています。 以下のコードスニペットを参照してください。 Re:UART3オーバーランエラーがRT1020で発生 Hi @hanmant
私たちの製品に興味を持ち、コミュニティをご利用いただき、誠にありがとうございます。
通常、UARTのオーバーランエラーには様々な原因があり、データ処理速度や割り込み処理など、さまざまな側面を考慮する必要があります。
問題を解決するために、以下の質問に回答してください。 まず、UARTデータを受信するためにどのDMA_UARTインターフェース機能を呼び出すか教えてください 次に、インターフェース機能をいつどこで呼び出すか教えてくださいDMA_UART。
私はあなたにいくつかの提案があります。 1:DMA_UART割り込みの優先度を他のモジュールよりも高く設定します。 2:ピンポンバッファを使用してUARTデータを受信します。
それがあなたの助けになることを願っています。 それでもご不明な点がございましたら、お気軽にお知らせください。
良い一日をお過ごしください!
よろしくお願いいたします。
mayliu
記事全体を表示