打印

28335用SCI实现与电脑的数据收发

[复制链接]
7113|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
longtengfeixue|  楼主 | 2014-6-10 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//通过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.
//===========================================================================
程序是我自己改的,不知道为什么数据始终接收不了,已经弄好久了,求大家帮我看看,谢谢

相关帖子

沙发
zhangmangui| | 2014-6-10 13:33 | 只看该作者
看看模块时钟有没有使能

使用特权

评论回复
板凳
jxmzzr| | 2014-6-13 19:16 | 只看该作者
找一个工程对比一下,确定下模块时钟是否使能。

使用特权

评论回复
地板
kangyin4545| | 2014-11-9 14:48 | 只看该作者
楼主你这波特率不对吧

使用特权

评论回复
5
Ivan_zstu| | 2016-3-11 12:31 | 只看该作者
波特率显然不对!
0x00F3  19200;
0x00E7  9600;
0x0028  115200;

使用特权

评论回复
6
yaoayao| | 2018-6-4 22:04 | 只看该作者
请问问题解决了嘛

使用特权

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

本版积分规则

8

主题

17

帖子

0

粉丝