请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 会因配置更改而异):
- 当"SCI_FIFO_CHAR_NUM <= 4"时,数据可以顺利发送。 否则、所发送数据中的某些字符将丢失。
- 当我将 TCFFIL 设置为16并将 SCI_FIFO_CHAR_NUM 设置为16时、所发送数据中的更多字符将丢失。
- 当我进入 TXFFINT 中断时、如果我连续地将(16减去 TXFFST)字节写入 SCITXBUF、那么所发送数据中的大量字符也会丢失。
我的查询是:
由于启用 TXFFIENA 后触发 TXFFINT 的条件是"TXFFST <= TXFFIL"、因此当 TXFFINT 进入中断状态时、在这种情况下、我能否继续在 FIFO 中写入(16减去 TXFFST)字节?
使用 FIFO 的最初目的是减少中断次数、从而减少 CPU 负载、但无法获得所需的效果。
此致、
凯瑟琳