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)
それがあなたの助けになることを願っています。
それでもご不明な点がございましたら、お気軽にお知らせください。
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