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负荷,却无法得到想要效果。