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.

F28335的SCI 发送FIFO的问题,百思不得解

F28335上SCIA采用发送和接收FIFO时,发现不管发送中断级别设为多少,只要往SciaRegs.SCITXBUF中写入数据,数据会立即发送出去。在此弄不明白的是发送中断级别设置有什么用?为什么设置发送中断级别没有效(没有打开FIFO发送中断)。为什么不是向SciaRegs.SCITXBUF中写入达到发送中断级别设置个数的数据后,再一次发送出去?但是接收中断级别有效,只有接收到设置的fifodepth才会进入接收fifo中断。

以下是我的初始化代码:

unsigned int InitScia_Fifo(unsigned int parity, unsigned int stop,  unsigned int baud,  unsigned int fifodepth)
{
    unsigned int status;
    unsigned int baud_RL,baud_RH;
    switch(parity)
    {
    case 0: //无校验
    SciaRegs.SCICCR.bit.PARITYENA=0;
    status=0;
    break;
    case 1: //.奇校验
    SciaRegs.SCICCR.bit.PARITYENA=1;
    SciaRegs.SCICCR.bit.PARITY=0;
    status=0;
    break;
    case 2: //偶校验
    SciaRegs.SCICCR.bit.PARITYENA=1;
    SciaRegs.SCICCR.bit.PARITY=1;
    status=0;
    break;
    default:
    status=1;
    break;
    }

switch(stop)
{
case 0:
SciaRegs.SCICCR.bit.STOPBITS=0;
status=0;
break;
case 1:
SciaRegs.SCICCR.bit.STOPBITS=1;
status=0;
break;
default:
status=1;
break;
}

SciaRegs.SCICCR.bit.LOOPBKENA = 0; 
SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0;
SciaRegs.SCICCR.bit.SCICHAR = 7; //SCICCR register set over

switch(baud)
{
case 0:
baud_RH=0x01;
baud_RL=0xe7;
status=0;
break;
case 1:
baud_RH=0x00;
baud_RL=0xf3;
status=0;
break;
case 2:
baud_RH=0x00;
baud_RL=0x00;
status=0;
break;
case 3:
baud_RH=0x00;
baud_RL=0x50;
status=0;
break;
case 4:
baud_RH=0x00;
baud_RL=0x28;
status=0;
break;
default:
status=1;
break;
}
SciaRegs.SCIHBAUD =baud_RH;
SciaRegs.SCILBAUD =baud_RL;

//发送FIFO的设置
SciaRegs.SCICTL1.bit.TXENA = 1;
SciaRegs.SCIFFTX.bit.SCIRST = 1;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
SciaRegs.SCIFFTX.bit.SCIFFENA = 1;
SciaRegs.SCIFFTX.bit.TXFFIENA = 0; //不使能FIFO发送中断
SciaRegs.SCIFFTX.bit.TXFFIL = 8; //设置发送FIFO长度
SciaRegs.SCICTL2.bit.TXINTENA = 0;
SciaRegs.SCIFFCT.bit.FFTXDLY = 3; //设置FIFO发送延迟为3个串口波特率周期

//接收FIFO的设置
SciaRegs.SCICTL1.bit.RXENA = 1; //使能SCI接收
SciaRegs.SCICTL2.bit.RXBKINTENA = 0; //禁能RXRDY/BRKDT产生的中断
SciaRegs.SCICTL1.bit.RXERRINTENA = 1; //使能接收错误中断 //FIFO中断使能,FIFO 8个时产生中断
SciaRegs.SCIFFRX.bit.RXFFIENA = 1; //使能接收FIFO功能
SciaRegs.SCIFFRX.bit.RXFFIL = fifodepth; //设置接收FIFO中断级别


SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 0;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;

SciaRegs.SCIFFRX.bit.RXFIFORESET =0;
SciaRegs.SCIFFRX.bit.RXFIFORESET =1;

SciaRegs.SCICTL1.bit.SWRESET = 1;

return status;
}

发送的函数为:

void scia_xmit(unsigned int a)
{
    SciaRegs.SCITXBUF = a;
}

  • YJJ,

    我认为当向发送FIFO写数据的时候,我认为数据是马上就随着所设的波特率发送的。

    你可以用这样的语句来写发送的数据, 这在FIFO不使能的情况下是不可以这么做的。

    for(i=0;i<8;i++)

    SciaRegs.SCITXBUF = a;

    而即使你使能FIFO发送中断,当你在中断服务函数里面写8个数据,当写的那个时候,数据也立即发送了,并不会等8个数据都写到FIFO的时候才发送。只会等到FIFO的数据小于或等于FIFO level的时候,才会又一次进入中断。

    Eric

  • Thank you      Eric!

        我的测试证实了你说的可以直接这样做:

    for(i=0;i<8;i++)

    SciaRegs.SCITXBUF = a;

    但是使能FIFO发送中断的时候,如果发送FIFO中啥也没有,“FIFO的数据小于或等于FIFO level的时候,才会又一次进入中断”,那么程序会一遍又一遍进入fifo发送中断?我的测试结果是会重复进入中断。那么这个中断有什么用?我现在的程序中没有打开发送fifo中断。

  • YJJ,

    当FIFO数据小于或等于发送FIFO level时,就会进入中断,如果中断使能的话。在这个中断里面,你就可以把要发送的数据又加载在FIFO里面,让它继续发送。如果数据发送完了,你在中断里面直接关掉FIFO就可以了。

    Eric

  • 请问 是关掉FIFO发送中断吗?

  • 这样单纯的发送是不可靠的;最好能加入是否可以写入SCITXBUF寄存器的判断,否则会丢失数据;尤其是在波特率比较大的时候;

    另外使用内置晶振的时候,波特率会有误差,这个判断会有更直接且明显的影响。