//通过SCI模块与电脑进行通信
//============================================================================
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "DSP2833x_GlobalPrototypes.h"
//===========================================================================
//系统初始化函数
//===========================================================================
//==========================================================================
//初始化SCI模块
//==========================================================================
void init_SCI_GPIO(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; //Enable pull-up for GPIO28
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; //Configure GPIO28 as SCIRXDA
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; //Enable pull-up for GPIO29
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; //Configure GPIO29 as SCITXDA
//GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0; //Enable pull-up for GPIO23
//GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 3; //Configure GPIO23 as SCIRXDB
//GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0; //Enable pull-up for GPIO22
//GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 3; //Configure GPIO22 as SCITXDB
/*GpioCtrlRegs.GPBPUD.bit.GPIO62 = 0; //Enable pull-up for GPIO62
GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1; //Configure GPIO62 as SCIRXDA
GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0; //Enable pull-up for GPIO63
GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 1; //Configure GPIO63 as SCITXDA*/
EDIS;
}
void InitSci(void)
{
SciaRegs.SCICCR.all=0x07; //1位停止位,禁止内部回路功能,空闲线模式,无奇偶校验,数据长度为8
//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.all=0x03; //SCIA模块的发送使能,接收使能
SciaRegs.SCIHBAUD=0x0001;
SciaRegs.SCILBAUD=0x00E7; //波特率为9600
SciaRegs.SCICTL2.bit.RXBKINTENA=1; //SCIA模块接收中断使能
SciaRegs.SCICTL2.bit.TXINTENA=1; //SCIA模块发送中断使能
SciaRegs.SCICTL1.bit.SWRESET=1; //重启SCI
}
//===========================================================================
//GPIO初始化函数
//===========================================================================
//====================================================================
//主函数
//====================================================================
unsigned int Sci_VarRx[8]; //用于存放接收到的数据
unsigned int i;
unsigned int j;
unsigned int Send_Flag; //发送标志位,1:有数据需要发送,0:无数据需要发送
interrupt void sciaRx_isr(void);
interrupt void sciaTx_isr(void);
void main(void)
{
InitSysCtrl(); //初始化系统函数
DINT;
InitPieCtrl(); //初始化PIE控制寄存器
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitPieVectTable(); //初始化PIE中断向量表
//初始化GPIO口
init_SCI_GPIO();
InitSci();
EALLOW;
PieVectTable.SCITXINTA= &sciaTx_isr;
PieVectTable.SCIRXINTA= &sciaRx_isr;
EDIS;
PieCtrlRegs.PIECTRL.bit.ENPIE=1;
for(i=0;i<8;i++)
{
Sci_VarRx[i]=0;
}
i=0;
j=1;
Send_Flag=0; //在SCIA还没有接收到数据时,没有数据需要发送
PieCtrlRegs.PIEIER9.bit.INTx1=1; //使能PIE模块中的SCI接收中断
PieCtrlRegs.PIEIER9.bit.INTx2=1; //使能PIE模块中的SCI发送中断
IER|=M_INT9; //开CPU中断
EINT; //开全局中断
ERTM; //开全局实时中断
for(;;)
{
//等待中断
}
}
//===========================================================================
//中断服务子程序
//====================================================================
interrupt void sciaTx_isr(void) //SCIA接收中断函数
{
Sci_VarRx[i]=SciaRegs.SCIRXBUF.all; //接收数据
i++;
if(i==8)
{
SciaRegs.SCITXBUF=Sci_VarRx[0]; //启动第一次发送,然后才能使用发送中断
Send_Flag=1; //有数据需要发送,置位标志
i=0;
}
PieCtrlRegs.PIEACK.all=M_INT9; //使得同组其他中断能够得到响应
EINT; //开全局中断vcc
}
//==========================================================================
interrupt void sciaRx_isr(void) //SCIA发送中断
{
if(Send_Flag==1)
{
SciaRegs.SCITXBUF=Sci_VarRx[j]; //发送数据
j++;
if(j==8)
{
j=1; //由于第一个数据已经在接收中断里发送,这里从第二个数据开始发送
Send_Flag=0; //数据发送完成,清标志位
}
}
PieCtrlRegs.PIEACK.all=M_INT9; //使得同组其他中断能够得到响应
EINT; //开全局中断
}
//===========================================================================
// No more.
//===========================================================================
|