嗨,大家好,我是一位PSOC4的新手,請教一個關於UART的問題。
問題敘述:
目前UART傳送與接收都需要處理16 筆Bytes的資料,所以我將UART Advanced 的Buffers size改成16Bytes,
因為之前我都是使用外部中斷來處理RX的資料,但是當我改成16Byte後就不能用外部中斷了,請問有人能跟
我說明如何處理接收的程式嗎?
若能協助的話,可以提供Sample Code 或 教育訓練的文件嗎?
已解决! 转到解答。
1:
因为缓存分为: 硬件缓存或者软件缓存。 硬件缓存称之为FIFO,软件缓存称之为Buffer。
外部中断只能应用于缓存为FIFO的情况。
但是如果你在组件里面配置了超过8字节,这个时候就会切换为缓存buffer,所以只能用内部中断,也就是Internal ISR。
2:
接受中断的 中断处理函数如下:
UART_SetCustomInterruptHandler(RxHandler);
Interrupt processing function:
CY_ISR(RxHandler)
{
if (0u !=
(UART_GetRxInterruptSourceMasked() &
UART_INTR_RX_NOT_EMPTY)) {
while (UART_SpiUartGetRxBufferSize() !=
0) {
uint8 dat = UART_UartGetChar();
if (dat != 0) {
UART_UartPutChar(dat);
}
}
}
UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY);
}
Note:
Clear RX interrupt action should be done after all data in buffer has been read.
3: 希望的回复能对你有所帮助。
我推測是因為 UART_INTR_TX_NOT_FULL 造成的,但不太確定,有人能幫助我解惑嗎?
推測1.試著用GPIO去觀察是那些中斷源造成
CY_ISR(RxHandler)
{
if(0u != (UART_GetTxInterruptSourceMasked()&UART_INTR_TX_NOT_FULL))
{
RxHandler_Flg^=1;
if(RxHandler_Flg) RxHandler_Output_Write(1);
else RxHandler_Output_Write(0);
}
if (0u !=(UART_GetRxInterruptSourceMasked()&UART_INTR_RX_NOT_EMPTY))
{
NotEmpty_Flg^=1;
if(NotEmpty_Flg) NotEmpty_Output_Write(1);
else NotEmpty_Output_Write(0);
uint8 dat = UART_UartGetByte();
RX_Array[Rx_Cnt]=dat;
if((++Rx_Cnt)>=16) {Rx_Cnt=0;}
UART_SpiUartClearRxBuffer();
}
UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY);
}
推測2.DATASHEET 註明TX buffer size 大於 TX FIFO時,會將中斷模式設定為內部中斷,並且當資料由circular software buffer轉移到TX FIFO時會利用TX FIFO NOT FULL interrupt source來操作資料轉移的流程。
Hi,
你好
Can this sample of mine be any help?
我的这个样本能帮上什么忙吗?
tty_utils a utility sample for CLI type program
moto
基
Thanks!
您好,抱歉 因為最近比較忙,現在才有時間回覆自己的問題。
您說的沒錯,目前程式我只需要UART RX的中斷,但是我發現當TX傳送資料的過程,會進入
CY_ISR(RxHandler) 中斷處理程式,經由測試後我發現是UART_INTR_TX_NOT_FULL造成的,
但是並沒有開啟任何UART TX的中斷。
所以我想確認,這樣的情形是不是因為以下的原因,(The interrupt mode is automatically set to
the internal and the TX FIFO not full interrupt source is reserved to manage software buffer operation:
move data from the circular software buffer into the TX FIFO.)
也就是說當TX Buffer>TX FIFO的時候會產生以下情形:
1.UART中斷源會自動改為內部中斷,且禁止使用UART外部中斷。
2.TX FIFO not full會被用來管理softwaer buffer資料的位移,也就是將資料位移至 TX FIFO。
因此造成就算我沒開TX任何的中斷源,但是我在傳送資料時,仍會進入到CY_ISR(RxHandler) 中斷處理程式。
UART是这样处理的。
1.UART中斷源會自動改為內部中斷,且禁止使用UART外部中斷。
2.TX FIFO not full會被用來管理softwaer buffer資料的位移,也就是將資料位移至 TX FIFO。
你在中断函数里面不要再用not full的tx中断了。 具体的RX的中断处理函数和工程,我已经在之前的回复中上传了。