- 初始化GPIO。
- 初始化SCIB。
- 中断相关操作(开启中断)
- 接收中断函数入口
下面是程序,不好的地方还请指教,有问题的也可以互相进步。
/* * main.c */ //#include "DSP2833x_Device.h" //#include "DSP2833x_Examples.h" #include "DSP2833x_Project.h" void Init_Fifo_Scib(void); void scib_xmit(int a); void scib_msg(char * msg); interrupt void Scib_RxInter(void); int main(void) { char *msg; InitSysCtrl(); InitScibGpio(); DINT; InitPieCtrl(); IFR = 0x0000; IER = 0x0000; InitPieVectTable(); MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); InitFlash(); Init_Fifo_Scib(); EALLOW; PieVectTable.SCIRXINTB = &Scib_RxInter; EDIS; IER |= M_INT9; PieCtrlRegs.PIEIER9.bit.INTx3 = 1; EINT; ERTM; msg = "\r\nHello DSP!\0"; scib_msg(msg); msg = "\r\nsend everything a character,and the DSP will echo it back! \n\0"; scib_msg(msg); while(1); return 0; } void Init_Fifo_Scib(void) { ScibRegs.SCICCR.all = 0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol ScibRegs.SCICTL1.all = 0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE ScibRegs.SCICTL2.bit.RXBKINTENA = 1; //Enable RX interrupt #if (CPU_FRQ_150MHZ) ScibRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz. ScibRegs.SCILBAUD =0x00E7; #endif /* #if (CPU_FRQ_100MHZ) ScibRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 20MHz. ScibRegs.SCILBAUD =0x0044; #endif */ /* ScibRegs.SCIFFTX.bit.SCIFFENA = 1; //SCI FIFO功能使能 ScibRegs.SCIFFTX.bit.SCIRST = 1; //SCI FIFO能继续发送或接收 ScibRegs.SCIFFTX.bit.TXFFIENA = 0; //屏蔽TX FIFO中断 ScibRegs.SCIFFTX.bit.TXFFIL = 0x0C; //发送FIFO深度为12级 ScibRegs.SCIFFTX.bit.TXFFINTCLR = 1; //清除TXFFINT标志位 ScibRegs.SCIFFTX.bit.TXFIFOXRESET = 0; //复位FIFO指针指向0并保持复位状态 ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1; //清除RXFFOVF标志位 ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; //清除RXFFINT标志位 ScibRegs.SCIFFRX.bit.RXFIFORESET = 0; //接收FIFO复位 ScibRegs.SCIFFRX.bit.RXFFIENA = 1; //使能RX FIFO中断 ScibRegs.SCIFFRX.bit.RXFFIL = 0x0C; //接收FIFO深度为12级 */ // ScibRegs.SCIFFCT.all = 0x0000; ScibRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset /* ScibRegs.SCIFFTX.bit.TXFIFOXRESET = 1; //重新使能发送FIFO ScibRegs.SCIFFRX.bit.RXFIFORESET = 1; //重新使能接收FIFO */ } void scib_xmit(int a) { while(ScibRegs.SCICTL2.bit.TXRDY == 0); ScibRegs.SCITXBUF = a; } void scib_msg(char * msg) { int i = 0; while(msg[i] != '\0') scib_xmit(msg[i ++]); } interrupt void Scib_RxInter(void) //接收中断是一位位传送 { Uint16 data; data = ScibRegs.SCIRXBUF.all; scib_xmit(data); /* ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1; ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1;*/ PieCtrlRegs.PIEACK.bit.ACK9 = 1; }