/****************************************************************************
接收FIFO深度为1,即接收一个字节数据就触发FIFO中断,然后读取RXBUF中的数据即可
****************************************************************************/
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
__interrupt void sciaTxFifoIsr(void);
__interrupt void sciaRxFifoIsr(void);
void scia_fifo_init(void);
void main(void)
{
InitSysCtrl();
InitSciGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTA = &sciaRxFifoIsr;
PieVectTable.SCITXINTA = &sciaTxFifoIsr;
EDIS; // This is needed to disable write to EALLOW protected registers
scia_fifo_init(); // Init SCI-A
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2
IER = 0x100; // Enable CPU INT
EINT;
for(;;);
}
__interrupt void
sciaTxFifoIsr(void)
{
//未使能FIFO发送中断,函数不执行。
SciaRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ACK
}
__interrupt void
sciaRxFifoIsr(void)
{
Uint16 rx;
rx = SciaRegs.SCIRXBUF.all; //读取接收缓存中的一个字节数据
scia_xmit(rx); //将接收到的一个字节数据发送出去
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}
void
scia_xmit(int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0)
{}
SciaRegs.SCITXBUF=a;
}
void
scia_msg(char * msg)
{
int i;
i = 0;
while(msg[i] != '\0')
{
scia_xmit(msg[i]);
i++;
}
}
void
scia_fifo_init()
{
SciaRegs.SCICCR.all =0x0007; //8位数据格式,选择地址位协议
SciaRegs.SCICTL1.all =0x0003; //使能SCI发送和接收
SciaRegs.SCICTL2.bit.TXINTENA =1; //使能发送中断(由于下面配置失能了FIFO发送中断,所以这里使不使能都没用)
SciaRegs.SCICTL2.bit.RXBKINTENA =1;//使能接收中断
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = 0x00c2; //设置波特率9600
SciaRegs.SCICCR.bit.LOOPBKENA =0; // 关闭自测模式
SciaRegs.SCIFFTX.all=0xC001; //失能FIFO发送中断,设置发送FIFO深度为1
SciaRegs.SCIFFRX.all=0x0021; //使能FIFO接收中断,设置接收FIFO深度为1,接收一个字节数据就产生FIFO接收中断,效率不高,面对少量不定长数据发送比较合适。
SciaRegs.SCIFFCT.all=0x00; //FIFO控制寄存器
SciaRegs.SCICTL1.all =0x0023; // 禁止软复位
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; //发送FIFO复位
SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //接收FIFO复位
}
|