fsl_usart.c: How to properly handle RX FIFO overflows, i.e., kStatus_USART_RxError

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

fsl_usart.c: How to properly handle RX FIFO overflows, i.e., kStatus_USART_RxError

74件の閲覧回数
danielholala
Senior Contributor II

Hello,

on LPC5528/LPC5526/LPC55xx, I'm using the USART driver from the SDK, see

https://github.com/nxp-mcuxpresso/mcuxsdk-core/blob/main/drivers/flexcomm/usart/fsl_usart.c#L1123

The code works properly when requesting to receive single bytes using 

USART_TransferReceiveNonBlocking()

It also recovers on RX FIFO overflows by reinitiating reception.

Situation is different when using  

USART_TransferReceiveNonBlocking()

with xfer->dataSize  > 1. For example, the receive callback inspects the RX FIFO level and if the RX FIFO level is > 1, it calls  USART_TransferReceiveNonBlocking()  with the exact number of bytes of in the RX FIFO to retrieve these bytes more efficiently, say 10 bytes.

However, if the system is busy handling other interrupts, the RX FIFO might overflow. Then 

void USART_TransferHandleIRQ(USART_Type *base, usart_handle_t *handle)

clears the RX FIFO overflow bit, empties the FIFO and calls the callback with kStatus_USART_RxError. All the bytes from the FIFO are therefore discarded and cannot be received any more.

However, it does not reset rxDataSize. So the callback will not be called again until the number of bytes (in the example ten bytes) have been received. Until this, the receive mechanics hangs.

How do you recover from this situation?

Resetting the dataSize by calling USART_TransferReceiveNonBlocking() with xfer->dataSize = 1does not work as the receive mechanics is still in status kUSART_RxBusy.

 

So I wonder what is the proper way to handle RX FIFO overflows with the SDK drivers.

Thanks.

Daniel

 

PS: sorry for the strange text formatting. I tried to markup code so it is easier to read but screwed up.

 

 

 

0 件の賞賛
返信
0 返答(返信)
%3CLINGO-SUB%20id%3D%22lingo-sub-2295145%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3Efsl_usart.c%3ARX%20FIFO%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC%EF%BC%88kStatus_USART_RxError%EF%BC%89%E3%82%92%E9%81%A9%E5%88%87%E3%81%AB%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2295145%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%3C%2FP%3E%3CP%3ELPC5528%2FLPC5526%2FLPC55xx%E3%81%A7%E3%81%AF%E3%80%81SDK%E3%81%AEUSART%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fnxp-mcuxpresso%2Fmcuxsdk-core%2Fblob%2Fmain%2Fdrivers%2Fflexcomm%2Fusart%2Ffsl_usart.c%23L1123%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%3Ehttps%3A%2F%2Fgithub.com%2Fnxp-mcuxpresso%2Fmcuxsdk-core%2Fblob%2Fmain%2Fdrivers%2Fflexcomm%2Fusart%2Ffsl_usart.c%23L1123%3C%2FA%3E%3C%2FP%3E%3CP%3E%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%3CSTRONG%3E%E3%80%81%E5%8D%98%E4%B8%80%E3%83%90%E3%82%A4%E3%83%88%E3%81%AE%3C%2FSTRONG%3E%E5%8F%97%E4%BF%A1%E3%82%92%E8%A6%81%E6%B1%82%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E6%AD%A3%E5%B8%B8%E3%81%AB%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E%3CFONT%20face%3D%22andale%20mono%2Ctimes%22%3E%3CSPAN%3EUSART_TransferReceiveNonBlocking()%3C%2FSPAN%3E%3C%2FFONT%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%E3%81%BE%E3%81%9F%E3%80%81%E5%8F%97%E4%BF%A1%E3%82%92%E5%86%8D%E9%96%8B%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%20RX%20FIFO%20%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC%E3%81%8B%E3%82%89%E5%9B%9E%E5%BE%A9%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%E4%BD%BF%E7%94%A8%E6%99%82%E3%81%AF%E7%8A%B6%E6%B3%81%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%3C%2FP%3E%3CP%3E%3CFONT%20face%3D%22andale%20mono%2Ctimes%22%3E%3CSPAN%3EUSART_TransferReceiveNonBlocking()%3C%2FSPAN%3E%3C%2FFONT%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%3CSTRONG%3Exfer-%26gt%3BdataSize%20%26gt%3B%201%20%E3%81%AE%3C%2FSTRONG%3E%E5%A0%B4%E5%90%88%E3%80%82%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0%E3%80%81%E5%8F%97%E4%BF%A1%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AF%20RX%20FIFO%20%E3%83%AC%E3%83%99%E3%83%AB%E3%82%92%E6%A4%9C%E6%9F%BB%E3%81%97%E3%80%81RX%20FIFO%20%E3%83%AC%E3%83%99%E3%83%AB%E3%81%8C%201%20%E3%82%88%E3%82%8A%E5%A4%A7%E3%81%8D%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81RX%20FIFO%20%E5%86%85%E3%81%AE%E6%AD%A3%E7%A2%BA%E3%81%AA%E3%83%90%E3%82%A4%E3%83%88%E6%95%B0%20(%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0%2010%20%E3%83%90%E3%82%A4%E3%83%88)%20%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%3CFONT%20face%3D%22andale%20mono%2Ctimes%22%3EUSART_TransferReceiveNonBlocking()%3C%2FFONT%3E%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%80%81%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E3%83%90%E3%82%A4%E3%83%88%E3%82%92%E3%82%88%E3%82%8A%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%E3%81%9F%E3%81%A0%E3%81%97%E3%80%81%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%8C%E4%BB%96%E3%81%AE%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E5%87%A6%E7%90%86%E3%81%A7%E3%83%93%E3%82%B8%E3%83%BC%E7%8A%B6%E6%85%8B%E3%81%AE%E5%A0%B4%E5%90%88%E3%80%81RX%20FIFO%20%E3%81%8C%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC%E3%81%99%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%81%9D%E3%82%8C%E3%81%8B%E3%82%89%3CBR%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%3CDIV%3E%3CDIV%3E%3CP%3E%3CFONT%20face%3D%22andale%20mono%2Ctimes%22%3E%3CSPAN%3Evoid%3C%2FSPAN%3E%20%3CSPAN%3EUSART_TransferHandleIRQ%3C%2FSPAN%3E%20%3CSPAN%3E(%3C%2FSPAN%3E%20%3CSPAN%3EUSART_Type%3C%2FSPAN%3E%20%3CSPAN%3E*%E3%83%99%E3%83%BC%E3%82%B9%E3%80%81%3C%2FSPAN%3E%20%3CSPAN%3Eusart_handle_t%3C%2FSPAN%3E%20%3CSPAN%3E*%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB)%3C%2FSPAN%3E%3C%2FFONT%3E%3C%2FP%3E%3CP%3E%3CSPAN%3ERX%20FIFO%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC%E3%83%93%E3%83%83%E3%83%88%E3%82%92%E3%82%AF%E3%83%AA%E3%82%A2%E3%81%97%E3%80%81FIFO%E3%82%92%E7%A9%BA%E3%81%AB%E3%81%97%E3%81%A6%E3%80%81%3C%2FSPAN%3E%20%3CSPAN%3E%3CSTRONG%3EkStatus_USART_RxError%3C%2FSTRONG%3E%E3%82%92%E5%BC%95%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81FIFO%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%90%E3%82%A4%E3%83%88%E3%81%8C%E7%A0%B4%E6%A3%84%E3%81%95%E3%82%8C%E3%80%81%E5%8F%97%E4%BF%A1%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3C%2FDIV%3E%3C%2FDIV%3E%3CP%3E%3CSPAN%3E%E3%81%9F%E3%81%A0%E3%81%97%E3%80%81%20%3CSTRONG%3ErxDataSize%3C%2FSTRONG%3E%E3%81%AF%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82SO%E3%80%81%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E3%83%90%E3%82%A4%E3%83%88%E6%95%B0%20(%E3%81%93%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%AF%2010%20%E3%83%90%E3%82%A4%E3%83%88)%20%E3%81%8C%E5%8F%97%E4%BF%A1%E3%81%95%E3%82%8C%E3%82%8B%E3%81%BE%E3%81%A7%E3%80%81%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AF%E5%86%8D%E5%BA%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%80%81%E5%8F%97%E4%BF%A1%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%BA%E3%83%A0%E3%81%AF%E3%83%8F%E3%83%B3%E3%82%B0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%E3%81%93%E3%81%AE%E7%8A%B6%E6%B3%81%E3%81%8B%E3%82%89%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%A6%E7%AB%8B%E3%81%A1%E7%9B%B4%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%EF%BC%9F%3C%2FP%3E%3CP%3E%3CSPAN%3E%3CFONT%20face%3D%22verdana%2Cgeneva%22%3Exfer-%26gt%3BdataSize%20%3D%201%3C%2FFONT%3E%3CFONT%20face%3D%22helvetica%22%3E%20%3C%2FFONT%3E%E3%81%A7%3CFONT%20face%3D%22verdana%2Cgeneva%22%3E%20USART_TransferReceiveNonBlocking()%20%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A6%20dataSize%3C%2FFONT%3E%3C%2FSPAN%3E%20%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%97%E3%81%A6%E3%82%82%E3%80%81%20%E5%8F%97%E4%BF%A1%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%BA%E3%83%A0%E3%81%8C%E3%81%BE%E3%81%A0%3CSPAN%3E%20kUSART_RxBusy%20%E7%8A%B6%E6%85%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%81%9F%E3%82%81%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%3CSTRONG%3E%E3%81%9D%E3%81%93%E3%81%A7%E3%80%81SDK%20%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%A7%20RX%20FIFO%20%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E9%81%A9%E5%88%87%E3%81%AA%E6%96%B9%E6%B3%95%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%E3%80%82%3C%2FSTRONG%3E%3C%2FP%3E%3CP%3E%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E%E3%83%80%E3%83%8B%E3%82%A8%E3%83%AB%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%E8%BF%BD%E8%A8%98%EF%BC%9A%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%8C%E3%81%8A%E3%81%8B%E3%81%97%E3%81%8F%E3%80%81%E7%94%B3%E3%81%97%E8%A8%B3%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E8%AA%AD%E3%81%BF%E3%82%84%E3%81%99%E3%81%8F%E3%81%AA%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E3%80%81%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%3C%2FP%3E%3CBR%20%2F%3E%3CBR%20%2F%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E