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.
发送中断代码:
代码中sciNo为了兼容2个SCI口而设置的变量
#define SCI_FIFO_CHAR_NUM 1
if (SCI_TX_Len_Remained[sciNo] >= SCI_FIFO_CHAR_NUM) { while (i < SCI_FIFO_CHAR_NUM) { sciRegs->SCITXBUF = SCI_TX_Buffer[sciNo][SCI_TX_Index[sciNo] + i++]; } SCI_TX_Len_Remained[sciNo] -= SCI_FIFO_CHAR_NUM; SCI_TX_Index[sciNo] += SCI_FIFO_CHAR_NUM; //设置TxFIFO中断 } //剩余发送字节数不满4字节 else if (SCI_TX_Len_Remained[sciNo] > 0) { while (i < SCI_TX_Len_Remained[sciNo]) { sciRegs->SCITXBUF = SCI_TX_Buffer[sciNo][SCI_TX_Index[sciNo] + i++]; } SCI_TX_Len_Remained[sciNo] = 0; SCI_TX_Index[sciNo] = 0; } //没有剩余待发送数据了 else { /** 禁用FIFO发送中断,否则会一直中断进入此处*/ sciRegs->SCIFFTX.bit.TXFFIENA = 0; /** 最后一个字节还未发送完成,置标志*/ if(!sciRegs->SCICTL2.bit.TXEMPTY) SCI_Wait_LastChar[sciNo] = 1; }
SCI初始化部分代码:
sciRegs->SCICTL1.bit.TXENA = 1; sciRegs->SCICTL1.bit.RXENA = 1; sciRegs->SCICTL2.bit.TXINTENA = 0; sciRegs->SCICTL2.bit.RXBKINTENA = 0; /** 波特率设置 */ Uint16 brr = SCI_ConvertBAUD(baud); sciRegs->SCIHBAUD = (brr >> 8) & 0xFF; sciRegs->SCILBAUD = (brr & 0xFF); sciRegs->SCIFFTX.all = 0xC000; sciRegs->SCIFFRX.all = 0x0024; sciRegs->SCIFFCT.all = 0x000B; /** 软复位SCI*/ sciRegs->SCICTL1.all = 0x0063; sciRegs->SCIFFTX.bit.TXFIFORESET = 1; // Re-enable rx FIFO operation sciRegs->SCIFFRX.bit.RXFIFORESET = 1; // Re-enable tx FIFO operation
实际测试发现(字符丢失是指接收方正常应该接收到N个字符,实际只接收到N - X个字符,X随着配置的变化会有不同),
1. SCI_FIFO_CHAR_NUM <= 4 :可以正常发送数据,否则会发送的数据中会丢失一些字符
2.将TCFFIL设置为16,同时将SCI_FIFO_CHAR_NUM 设置成16,发送的数据会丢失更多的字符
3.当进入TXFFINT中断的时候,如果尝试往SCITXBUF中连续写入 (16 - TXFFST )个字节,也会导致发送的大量字符丢失
请问:
那么在TXFFINT进入中断的时候,是不是可以认为此时FIFO中可以继续写入 (16 - TXFFST )个字节?
使用FIFO的本意是减少中断次数以此降低CPU负荷,却无法得到想要效果。
TXFFIENA 使能后触发TXFFINT的条件是:TXFFST <= TXFFIL那么在TXFFINT进入中断的时候,是不是可以认为此时FIFO中可以继续写入 (16 - TXFFST )个字节?
您可以,我认为最好的办法是在 TXFFST 显示 FIFO 为空时写入 tx 缓冲区(以节省您的 CPU 时间)。
你好,我现在对程序做了以下2点措施,目前先让程序正常运行起来:
1.TXFFIL设置为2,意思是只有FIFO中字节数小于等于2才继续往FIFO中写入数据,每次写入2个字节的新数据
2.修改一帧数据发送完成的判断条件,保证一帧数据最后一个字节不会丢失
下面的代码是定时1毫秒调用的,只有当连续2次(TX的FIFO及SHIFT均空闲超过至少1毫秒),才将RS458转换成接收状态
if((SCI_Wait_LastChar[sciNo]) && sciRegs->SCICTL2.bit.TXRDY && sciRegs->SCICTL2.bit.TXEMPTY && !sciRegs->SCIFFTX.bit.TXFFST) { if(u16WaitSendOver++ >= 2) { u16WaitSendOver = 0; SCI_Wait_LastChar[sciNo] = 0; SCI_EnableRx(sciNo); } }
当前代码能够正常运行。谢谢