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上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;
}
这样单纯的发送是不可靠的;最好能加入是否可以写入SCITXBUF寄存器的判断,否则会丢失数据;尤其是在波特率比较大的时候;
另外使用内置晶振的时候,波特率会有误差,这个判断会有更直接且明显的影响。