打印
[DSP编程]

利用SCI与电脑通信,程序不知道哪里出了问题,一直不能实现,求大家指点

[复制链接]
1945|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
longtengfeixue|  楼主 | 2014-5-30 14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//通过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.
//===========================================================================

相关帖子

沙发
wangch_sh| | 2014-5-30 15:09 | 只看该作者
对照例程看,波特率是否一样。是不能发还是不能收?

使用特权

评论回复
板凳
zhangmangui| | 2014-6-1 23:26 | 只看该作者
在上位机上有没有测试自发自收有没有问题
也就是接收中直接将buffer中的数据送出去
测试一下

使用特权

评论回复
地板
haha520525| | 2014-6-6 16:15 | 只看该作者
我的自己改的dsp向pc机发送数据是 无限发送 根本停不下来  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

17

帖子

0

粉丝