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 中断模式下发送数据时将丢失数据

Guru**** 2542340 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1173175/tms320f28069-sci-will-lose-data-when-sending-them-under-fifo-interruption-mode

器件型号:TMS320F28069

大家好、

我发送了中断代码:

为了与2个 SCI 端口兼容、sciNo 设置如下所列的变量:

#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;
		//Set the TxFIFO interruption
	}
	//The rest of data to be sent is less than 4 bytes
	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;
	}
	//There are no data left to be sent
	else
	{
	    /** Disable the FIFO sending interruption. Otherwise, it will always be interrupted and end up here*/
	    sciRegs->SCIFFTX.bit.TXFFIENA = 0;
		/** The sending of the last byte hasn't been finished. A symbol has been placed*/
		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;

	/** Set Baud rate */
	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;

	/** The soft reset of 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 中断时、如果我连续地将(16减去 TXFFST)字节写入 SCITXBUF、那么所发送数据中的大量字符也会丢失。

我的查询是:

由于启用 TXFFIENA 后触发 TXFFINT 的条件是"TXFFST <= TXFFIL"、因此当 TXFFINT 进入中断状态时、在这种情况下、我能否继续在 FIFO 中写入(16减去 TXFFST)字节?

使用 FIFO 的最初目的是减少中断次数、从而减少 CPU 负载、但无法获得所需的效果。

此致、

凯瑟琳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Katherine、

    [引用 userid="543421" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1173175/tms320f28069-sci-will-lose-data-when-sending-them-under-fifo-interruption-mode "]由于启用 TXFFIENA 后触发 TXFFINT 的条件是"TXFFST <= TXFFIL",因此当 TXFFINT 进入中断状态时,在这种情况下,我是否可以继续在 FIFO 中写入(16减去 TXFFST)字节?[/QUERPES]

    您可以认为、最好的实现方式 是在 TXFFST 指示 FIFO 为空时写入 TX 缓冲区(以节省 CPU 时间)。  

    此致、

    Marlyn