我用hellodsp进行试验,发现有几个问题没搞懂?我用的是hellodsp的例程,程序的目的是用串口调试助手发送"hellodsp给dsp,然后在由dsp发回给串口调试助手"如下:
interrupt void SCIRXINTA_ISR(void) // SCI-A接收中断函数
{
int i;
for(i=0;i<8;i++)
{
buffer = SciaRegs.SCIRXBUF.all; //接收数据
}
if(strcmp(buffer,"hellodsp")==0)
{
SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除发送中断标志位,使其响应新的中断
}
SciaRegs.SCIFFRX.bit.RXFIFORESET=0;//接收FIFO的指针复位为0
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;//通过将RXFIFORESET置位来重新启动FIFO队列的接收操作
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除接收中断标志位(FIFO需要手动清除)
PieCtrl.PIEACK.all=0x0100; //使得同组其他中断能够得到响应
EINT; //开全局中断vcc
}
/****************************************************************************
*
*名 称:SCITXINTA_ISR()
*
*功 能:发送中断函数
*
*入口参数:无
*
*出口参数:无
*
****************************************************************************/
interrupt void SCITXINTA_ISR(void) // SCI-A发送中断函数
{
int i;
for(i=0;i<8;i++)
{
SciaRegs.SCITXBUF=buffer; //发送数据
}
// SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除发送中断标志位,使其响应新的中断
PieCtrl.PIEACK.all=0x0100; //使得同组其他中断能够得到响应
EINT; //开全局中断
}
SCI初始化为void InitSci(void)
{
SciaRegs.SCICCR.bit.STOPBITS=0; //1位停止位
SciaRegs.SCICCR.bit.PARITYENA=0; //禁止极性功能
SciaRegs.SCICCR.bit.LOOPBKENA=0; //禁止回送测试模式功能
SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0; //空闲线模式
SciaRegs.SCICCR.bit.SCICHAR=7; //8位数据位
SciaRegs.SCICTL1.bit.TXENA=1; //SCIA模块的发送使能
SciaRegs.SCICTL1.bit.RXENA=1; //SCIA模块的接收使能
SciaRegs.SCIHBAUD=0;
SciaRegs.SCILBAUD=0xF3; //波特率为19200
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; //重新使能发送FIFO的操作
SciaRegs.SCIFFTX.bit.SCIFFENA=1; //使能SCI FIFO的功能
SciaRegs.SCIFFTX.bit.TXFFST=0; //发送FIFO队列为空
SciaRegs.SCIFFTX.bit.TXFFINT=0; //没有产生发送FIFO中断
SciaRegs.SCIFFTX.bit.TXINTCLR=0; //没有清除TXFFINT的标志位
SciaRegs.SCIFFTX.bit.TXFFIENA=1; //使能发送FIFO中断
SciaRegs.SCIFFTX.bit.TXFFILIL=0; //发送中断级别为0,也就是当发送FIFO为空时发生中断
SciaRegs.SCIFFRX.bit.RXFFOVF=0; //接收FIFO没有溢出
SciaRegs.SCIFFRX.bit.RXOVF_CLR=1; //对RXFFOVF标志位没有影响
SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //重新使能接收FIFO的操作
SciaRegs.SCIFFRX.bit.RXFIFST=0; //接收FIFO队列为空
SciaRegs.SCIFFRX.bit.RXFFINT=0; //没有产生接收中断
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; //清除接收中断标志位
SciaRegs.SCIFFRX.bit.RXFFIENA=1; //使能FIFO接收中断
SciaRegs.SCIFFRX.bit.RXFFIL=8; //FIFO接收中断级别为8.也就是说当接收FIFO中有8个字符时发生中断
SciaRegs.SCICTL1.bit.SWRESET=1; //重启SCI
}
有以下疑问:(1)
为什么在接收中断中清除发送中断位, if(strcmp(buffer,"hellodsp")==0)
{
SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除发送中断标志位,使其响应新的中断
}
难道是清除发送中断位就可以相应发送中断吗?为什么不把这句话SciaRegs.SCIFFTX.bit.TXINTCLR=1; 放在发送中断函数中呢?每次进入接收中断应该是清除中断标志位的啊,这里在发送中断中却没有将FIFO发送中断标志位TXINTCLR清零。那岂不是程序会一直不断的进入发送中断函数?但事实上,如果我将SciaRegs.SCIFFTX.bit.TXINTCLR=1; 放在发送中断函数中,我只运行数据,并没有用串口给DSP发数据,会发现串口调试助手不断的接到00(因为buffer初始化为0),请问这是怎么回事?
(2)进入发送中断的条件是什么?是FIFO中剩余的 字符数和预设的发送中断级位TXFFIL相等时,导致标志位TXFFINT被置位,从而进入发送中断?那如果再发送中断中没有将发送中断标志位TXINTCLR清零,会是什么情况呢? |