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.

TMS320F28069: SCI 采用FIFO 中断模式发送会丢失数据

Part Number: TMS320F28069

发送中断代码:

代码中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 )个字节,也会导致发送的大量字符丢失

请问:

既然,TXFFIENA 使能后触发TXFFINT的条件是:TXFFST <= TXFFIL 

那么在TXFFINT进入中断的时候,是不是可以认为此时FIFO中可以继续写入 (16 - TXFFST )个字节?

使用FIFO的本意是减少中断次数以此降低CPU负荷,却无法得到想要效果。

  • 感谢您对TI产品的关注!已为您询问TI资深工程师,一旦得到回复会立即回复给您。

  • 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);
    		}
    	}

    当前代码能够正常运行。谢谢