#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
//#define SCI_IO 0x0030
void IO_function(void);
void Scia_init(void);
void Scia_xmit(int a);
interrupt void sciarxfifoisr(void);
Uint16 receivedchar=0;
void main(void)
{
InitSysCtrl();
IO_function();
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.RXAINT=&sciarxfifoisr;
EDIS;
PieCtrlRegs.PIECRTL.bit.ENPIE=1;
PieCtrlRegs.PIEIER9.bit.INTx1=1;
IER=0x100;
EINT;
ERTM;
Scia_init();
for(;;)
{}
}
void IO_function(void)
{
EALLOW;
GpioMuxRegs.GPFMUX.all=0x0030;
EDIS;
}
void Scia_xmit(int a)
{
SciaRegs.SCITXBUF=a;
SciaRegs.SCITXBUF=(a&0xff);
while(SciaRegs.SCICTL2.bit.TXRDY!=1){};
}
void Scia_init(void)
{
SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x2021;
SciaRegs.SCIFFCT.all=0x0;
SciaRegs.SCICCR.all =0x0007;
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCIHBAUD =0x0001;
SciaRegs.SCILBAUD =0x00E7;
SciaRegs.SCICTL1.all =0x0023;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
interrupt void sciarxfifoisr(void)
{
receivedchar=SciaRegs.SCIRXBUF.all;
receivedchar&=0xff;
Scia_xmit(receivedchar);
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
PieCtrlRegs.PIEACK.all|=0x100;
}
来自于TMS320F2812原理及其C语言程序开发:p183(串口中断接受程序)
程序描述:在for空循环语句中,当串口小助手给DSP发送数据时,DSP会响应接受中断(中断的fifo级别位是1),即当接受数据量为1时响应中断。在中断函数中加入了发送函数,即在中断中向串口小助手发送接收到的数据。
程序运行结果:运行有问题,每发下去一个数据,会在一次中断响应过程中发回两个同样的数据。
分析原因结果:
1、当把fifo级别反复设置成3或者15时,reset DSP,然后重新load program之后,串口小助手需要一直发送3或者15个数据到DSP的fifo,才能响应中断,每次中断发送两个相同的数据。这时,fifo的指针就会偏移一位,下次再接受数据,再一次响应中断。
2、在sci_xmit函数处设置断点,在最后一行设置断点,响应中断的时候,会在发送函数执行中发送一个数据,在最后一行执行完到第二次响应中断期间会再次发送一个数据。这就是两个相同数据产生的过程。
到底为什么会在中断的执行过程中产生两个相同的数据?求大神解答,感激不尽 |