//通过SCI模块与电脑进行通信
//============================================================================
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
//===========================================================================
//系统初始化函数
//===========================================================================
void InitsysCtrl(void)
{
EALLOW;
SysCtrlRegs.WDCR=0x0068; //禁止看门狗模块
SysCtrlRegs.HISPCP.all=0x0001;
SysCtrlRegs.LOSPCP.all=0x0002;
EDIS;
}
//==========================================================================
//初始化SCI模块
//==========================================================================
void Init_Sci(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=0x0000;
SciaRegs.SCILBAUD=0x00F3; //波特率为9600
SciaRegs.SCICTL1.bit.SWRESET=1; //重启SCI
}
//===========================================================================
//查询SCICTL2寄存器的TXRDY标志位,来确认发送准备是否就绪
//===========================================================================
int SciaTx_Ready(void)
{
unsigned int i;
if(SciaRegs.SCICTL2.bit.TXRDY==1)
{
i=1; //i=1,TXRDY发送准备就绪
}
else
{
i=0; ////i=0,TXRDY发送尚未就绪
}
return(i);
}
//===========================================================================
//查询SCIRXST寄存器的RXRDY标志位,来确认接收准备是否就绪
//===========================================================================
int SciaRx_Ready(void)
{
unsigned int i;
if(SciaRegs.SCIRXST.bit.RXRDY==1)
{
i=1; //i=1,接受准备已经就绪
}
else
{
i=0;
}
return(i);
}
//===========================================================================
//GPIO初始化函数
//===========================================================================
void InitGpio(void)
{
EALLOW;
//配置管脚为SCI功能管脚
GpioCtrlRegs.GPAMUX2.bit.GPIO29=01; //设置SCIA的发送引脚
GpioCtrlRegs.GPAMUX2.bit.GPIO28=01; //设置SCIA的接收引脚
EDIS;
}
//====================================================================
//主函数
//====================================================================
unsigned int Sci_VarRx[100]; //用于存放接收到的数据
unsigned int i;
unsigned int Send_Flag; //发送标志位,1:有数据需要发送,0:无数据需要发送
unsigned int n;
unsigned int j;
void main(void)
{
InitSysCtrl(); //初始化系统函数
DINT;
InitPieCtrl(); //初始化PIE控制寄存器
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitPieVectTable(); //初始化PIE中断向量表
Init_Sci(); //初始化SCIA
InitSciGpio();
InitGpio(); //初始化GPIO口
for(i=0;i<100;i++)
{
Sci_VarRx[i]=0;
}
i=0;
Send_Flag=0; //在SCIA还没有接收到数据时,没有数据需要发送
for(;;)
{
//查询方式实现发送功能
if((SciaTx_Ready()==1)&&(Send_Flag==1)) //发送准备已经就绪而且有数据需要发送
{
n=sizeof(Sci_VarRx)/sizeof(int);
for(i=0;i<n;i++)
{
SciaRegs.SCITXBUF=Sci_VarRx[i]; //发送数据
DELAY_US(1000);
Send_Flag=0; //清除标示位
}
}
//查询方式实现接收功能
if(SciaRx_Ready()==1)
{
while(SciaRx_Ready()==1) //接收数据准备已经就绪
{
i=0;
Sci_VarRx[i]=SciaRegs.SCIRXBUF.all; //接收数据
DELAY_US(1000);
i++;
}
Send_Flag=1; //标志位置位,有数据等待发送
}
}
}
//====================================================================
//===========================================================================
// No more.
//===========================================================================
程序是我自己改的,不知道为什么数据始终接收不了,已经弄好久了,求大家帮我看看,谢谢 |