This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
设置FIFO接收深度为4级, 发送深度0级;
用串口调试助手发送数据 01 03 00 00 00 02 C4 0B 共8个bytes, 示波器波形如下图
上图中,第一个为串口调试助手发送数据, 第二个波形为DSP回复数据.
注意看第一个波形持续时间为4.52ms, 波特率为19200, 可以计算1/19200*11*8=4.583ms,这与示波器波形相符,说明发送数据正确;如果是12个字节的话1/19200*11*12 = 6.875ms,这两个时间差示波器能轻易区分.
再看CCS监测数据
reDtat为接收数据,完全正确
但是 reciveCounter 为进接收中断次数,串口助手发送8个字节按理应该进中断为 8 / 4 = 2次, 监测数据为进了3次;re_data_counter = 12, 12 = 4 * 3, 接收了12个数据, 每进一次中断都读取了FIFO有几个数据再读取;如下面这段代码
dataNum = mo->SCIFFRX.bit.RXFFIL; for (i = 0; i < dataNum; i++) { md->reDtat[md->re_data_counter] = mo->SCIRXBUF.all; md->re_data_counter++; }
很明显串口调试助手只发送了8个数据,按理FIFO尝试为4级的情况下只需进2次中断读8个字节;而实际28035却进了3次中断,读取了12个字节。并且示波器监测发送数据完全正确,28035读取数据也完全正确。但是进的中断次数却错了。
因此,在串口助手发送前我把reDtat[9]~reDtat[11]的数值手动改成其他数据,再用串口助手发送同样的数据,果然reDtat[9]~reDtat[11] 全部变为0。也就是说SCI在接收完毕后,在没有数据的情况下多进了一次中断,多接收了4个数据,且数据全为0.
目前, 我没有找到原因, 请各位大侠帮忙,如果需要我可以奉上代码.
你好,内容比较多,我整理了一下,大概意思是说:
F28035的SCI启用FIFO的情况下接收8个字节的消息进入了3次中断,而且最后一次中断接收的是全为00的4个数据。是这样吗?
上面概述没问题的话可能还是要给出一下SCI & FIFO的配置代码查看一下。
LZ,我遇到了同样的问题。FIFO发送中断可以正常工作,接收中断总是无法接收到正常的数据
初始化接收FIFO深度8
/**SCIFFRX: FIFO receive register * bit0-4.RXFFIL:8,RX FIFO深度,8 Byte,Modbus查询帧最小长度为8 * bit5.RXFFIENA:1,RX FIFO 中断开启 * bit13.RXFIFORESET:0,复位RX FIFO指针并保持复位 */ sciRegs->SCIFFRX.all = 0x0028;
接收中断:
__interrupt void SCIbRxISR(void) { SCIRxISR_Call(1); ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1; ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; }
/** * @brief 在FIFO接收中断调用,处理接收缓冲 * * @param sciNo: SCI编号,0:SCI-A;!=0:SCI-B */ void SCIRxISR_Call(Uint16 sciNo) { if (sciNo > 1) return; volatile struct SCI_REGS *sciRegs; /** 根据sciNo决定使用哪组寄存器*/ sciRegs = sciNo ? &ScibRegs : &SciaRegs; Uint16 i = 0; Uint16 rxRemained = sciRegs->SCIFFRX.bit.RXFFST; //设定RX接收8个字符才中断 while(rxRemained-- > 0) { SCI_RX_Buffer[sciNo][SCI_RX_Length[sciNo]++] = sciRegs->SCIRXBUF.all & 0xFF; } //设置标志,表明已经开始接收一帧了 SCI_RX_FirstChar[sciNo] = 1; }
定时器1ms调用的函数:
/** * @brief 在定时器(1ms)中定时调用此函数, * 用来判断接收超时,Modbus规定帧间隔3.5字符时间 * Ttimeout = 3.5*11/波特率 * 波特率9.6K : T = 4ms * 波特率19.2K : T = 2ms * 波特率115.2K : T = 0.4ms * 这里程序为了处理简单,统一设定超时时间5ms * @param sciNo: SCI编号,0:SCI-A;!=0:SCI-B */ void SCI_OnTimer(Uint16 sciNo) { if(sciNo > 1) return; volatile struct SCI_REGS *sciRegs; /** 根据sciNo决定使用哪组寄存器*/ sciRegs = sciNo ? &ScibRegs : &SciaRegs; //已经接收了至少1个字符 if(SCI_RX_FirstChar[sciNo]) { //接收超时 if(++SCI_RX_TimeCounter[sciNo] > SCI_RX_TIMEOUT) { SCI_RX_TimeCounter[sciNo] = 0; SCI_RX_FirstChar[sciNo] = 0; //先保存接收FIFO中的数据 Uint16 rxRemained = sciRegs->SCIFFRX.bit.RXFFST; while(rxRemained-- > 0) { SCI_RX_Buffer[sciNo][SCI_RX_Length[sciNo]++] = sciRegs->SCIRXBUF.all & 0xFF; } //超时表示帧接收完毕,调用回调函数进行帧数据处理 if(pReceive_Callback[sciNo] != NULL) { (*pReceive_Callback[sciNo])(&SCI_RX_Buffer[sciNo][0],SCI_RX_Length[sciNo]); } } } }
串口调试助手发送8个字节
第一次接入接收中断时,SCIFFRX.bit.RXFFST = 4(此值不固定,但总是不等于8),RXFFOVF=1,但是SCIRXBUF中连续4次读出的数据均不正确
在接收超时处理函数中,SCIFFRX.bit.RXFFST = 3,能够完整接收串口助手发来的最后3个字节
请问该如何处理接收FIFO中断呢?