打印

SCI如何接收一组数据

[复制链接]
8593|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
z_jzhao|  楼主 | 2012-11-16 14:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
pi, gp, IO, rc, CRC
#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
unsigned int Sci_VarRx,temp_RX;
unsigned int Sci_VarTx;
volatile Uint16 *  ptr;
int Send_Flag;
int SciaTx_Ready(void);
int SciaRx_Ready(void);
int Rx_flag,ix,ii,n;
int Tx_flag;
void Scia_init(void);
int str_TX[]={0x01,0x03,0x21,0x00,0x00,0x01};//010321000001  
unsigned int Crc_16();
unsigned int crc16,crc1,crc2;
unsigned int str_RX[100];
int Rx_Int16=0x1234;

void main(void)
{   

    crc16=Crc_16();
    crc1=crc16%256;
    crc2=crc16/256;
   
   
    Rx_flag=0;
    Tx_flag=0;
    Sci_VarRx = 0;
    Sci_VarTx = 0;   
    Send_Flag = 0;
    InitSysCtrl();//LSPCLK=SYSCLKOUT/2=60MHZ/2=30MHZ
    InitSciaGpio();
EALLOW;
      GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;     //配置485-RTS使能上拉
      GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0;    //配置485-RTS的GPIO25为IO功能
      GpioCtrlRegs.GPADIR.bit.GPIO25 = 1;     //配置485-RTS为输出
      GpioDataRegs.GPADAT.bit.GPIO25 = 0;     //设置485-RTS默认输出为低电平
   EDIS;

    DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
    Scia_init();
    EnableInterrupts();
      
     PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   
     EINT;   
     ERTM;   
      
for(;;)
    {
        SciaRx_Ready();
        if(Rx_flag == 1)
            {   
                  ix=0;
                  while(SciaRegs.SCIRXST.bit.RXRDY == 1)
                          {
                              str_RX[ix]=0;
                              str_RX[ix]= SciaRegs.SCIRXBUF.all;
                              DELAY_US(1000);
                              ix++;
                          }
                  SciaTx_Ready();
                  if(Tx_flag==1)
                       {   
                            n=sizeof(str_RX)/sizeof(int);
                            for(ii=0;ii<n;ii++)
                                  {
                                      SciaRegs.SCITXBUF =str_RX[ii];
                                       DELAY_US(1000);
                                   }

                               }
                         }
                }
}

void Scia_init()
{
     SciaRegs.SCICCR.all =0x0007;   // 设置通信控制寄存器                           
     SciaRegs.SCICTL1.all =0x0003;  // 设置SCI控制寄存器1
     SciaRegs.SCICTL2.all =0x0003;//设置控制寄存器2
     SciaRegs.SCICTL2.bit.TXINTENA =1; //使能TXRDY中断
     SciaRegs.SCICTL2.bit.RXBKINTENA =1; //使能RXRDY/BRKDT中断
     SciaRegs.SCIHBAUD    =0x0000;  //
     SciaRegs.SCILBAUD    =0x00C2
     SciaRegs.SCICTL1.all =0x0023;     // 0x0023 = 0010 0011
                                //SW RESET = 1(系统复位后,向此位写入1将重新使能SCI)

}
int SciaRx_Ready()
{   
     GpioDataRegs.GPADAT.bit.GPIO25 = 0; //低电平,收数据
     DELAY_US(10000);
    if(SciaRegs.SCIRXST.bit.RXRDY == 1)
         {
            Rx_flag = 1;  
        }
    else
       {
          Rx_flag=0;
       }
   return(Rx_flag);
}

int SciaTx_Ready(void)
  {   
    GpioDataRegs.GPADAT.bit.GPIO25 = 1; //高电平,发数据
    DELAY_US(10000);
    if(SciaRegs.SCICTL2.bit.TXRDY == 1)
     {
            Tx_flag=1;
      }
     else
     {
           Tx_flag=0;
      }
    return(Tx_flag);
}

上述程序要实现的功能是:DSP通过485与PC机的“串口调试软件”通讯,“串口调试软件”首先按十六制发送一个串03 03 20 00 00 01,DSP接收到后,把接收的值 01 03 20 00 00 01发送给PC,即把接收到的值,发送给PC。
现在的问题是:串口调试软件只能接收到01,其它的接收不到;如果用串口调试软件发送02、03或04给DSP时,接收值都是正确的(即02、03、04),PC就是在发送多个值时,DSP只能接收到最后一个值。我查看了DSP接收数组的内容 ,只有str_RX[0]有接收值,即上述的01;如果DSP单独发送str_TX数据的值时,PC接收是正确的;可能是DSP程序的接收部分的语句有点问题,请各位指点一下!

相关帖子

沙发
meng219902| | 2012-11-17 17:36 | 只看该作者
对不起, 我不太懂485  但是我懂点SCI   
第一呢,我看了你的程序,很多毛病,   我挑主要的说吧,我也遇到过,我第一意识告诉我是FIFO的问题,我看到你没有初始化FIFO,这个你查看一下,是不是有问题,这个FIFO最好是关掉,因为我们接受数据的时候,是不确定数据的长度的,如果你确定了深度的话(如:15个深度),那么你要等15个字(数字、char等等),我感觉很麻烦,
第二个就是 你用的是等待的办法来接受数据的,那么在单片机里面可能是好使的(因为我也是从那学过来的),但是对于DSP2000系列,你最好是用中断,dsp接受一个数据就中断一次,直到没有数据发过来为止,我个人感觉很方便, interrupt void scibRxFifoIsr(void)
{
        Uint16 i;
        i=ScibRegs.SCIRXBUF.all;
                  scib_xmit(i);   //接受到dsp的数据,立刻就再从dsp发送给PC机
        ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;  // Clear Overflow flag
        ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;         // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x100;          // Issue PIE ack

}

使用特权

评论回复
板凳
meng219902| | 2012-11-17 17:52 | 只看该作者
现在的问题是:串口调试软件只能接收到01,其它的接收不到;如果用串口调试软件发送02、03或04给DSP时,接收值都是正确的(即02、03、04),PC就是在发送多个值时,DSP只能接收到最后一个值。我查看了DSP接收数组的内容 ,只有str_RX[0]有接收值,即上述的01;如果DSP单独发送str_TX数据的值时,PC接收是正确的;可能是DSP程序的接收部分的语句有点问题,请各位指点一下!

还有你出现的这个问题,我还像遇到过,也好像没遇到过,SciaRegs.SCICTL2.bit..RXRDY  不管PC给多少数,但是dsp只能接受到一个数(第一个数),剩下的数就丢失了,。。。。。不要听我的,也有可能是你程序的问题,如
if(Rx_flag == 1)
            {   
                  ix=0;
                  while(SciaRegs.SCIRXST.bit.RXRDY == 1)
                          {
                              str_RX[ix]=0;
                              str_RX[ix]= SciaRegs.SCIRXBUF.all;
                              DELAY_US(1000);
                              ix++;
                          }
确实当dsp接受到第一数的时候,READY==1;那么你有没有想想,当第一个数传给 str_RX[ix]的时候,ready是不是==0;了呢,会不会就在那时候跳出循环了呢?(我懂你写这个程序的意思,但是事与愿违,)
还有你说你只能看到str_RX[0]的数组有数,你没注意你写的程序就有问题吗?但Rx_flag == 1;就进入循环的时候,你的第一句话ix=0; 是造成str_RX[ix]只显示第一个数的原因吗?
  我就说这么多,希望我说的对你有帮助

使用特权

评论回复
地板
z_jzhao|  楼主 | 2012-11-19 08:54 | 只看该作者
我现在是接收和发送数据都没有问题,只是不能接收一组数据!

使用特权

评论回复
5
z_jzhao|  楼主 | 2012-11-19 08:54 | 只看该作者
该如何更改?

使用特权

评论回复
6
meng219902| | 2012-11-19 09:16 | 只看该作者
这个也可能是你的串口调试助手的问题    你试试
是  接受都没有问题,你是指的是一个数据?还是很多个呢?我理解你的意思是 一个数据,你没有用中断吗?

使用特权

评论回复
7
meng219902| | 2012-11-19 09:23 | 只看该作者
我想你应该有这个软件把? 里面有个串口调试助手
你试试

QQ截图20121119091921.png (180.33 KB )

QQ截图20121119091921.png

使用特权

评论回复
8
z_jzhao|  楼主 | 2012-11-22 10:11 | 只看该作者
我的要求很简单,就是用串口调试软件发送01 06 20 00 00 01 02 31,只要DSP能接收到就行,谁有这样的例程发一个给我也行啊。最要是28035上面可以运行的,多谢!

使用特权

评论回复
9
z_jzhao|  楼主 | 2012-11-24 09:10 | 只看该作者
这里没人吗?

使用特权

评论回复
10
huanghongxing| | 2012-11-24 22:51 | 只看该作者
把频率与串口端口设置好应该就可以通信了吧

使用特权

评论回复
11
holddreamair| | 2013-9-24 17:15 | 只看该作者
顶一个!

使用特权

评论回复
12
q1q| | 2014-4-19 15:45 | 只看该作者
这个28035例程里有,不过从讨论的内容看,接收一串的可以,但是是一个个连成的,不是字符串为单位的

使用特权

评论回复
13
Ivan_zstu| | 2015-4-24 10:57 | 只看该作者
我看了一下,你是做DSP的SCI通讯,采用485串口,modbus协议。dsp做上位机给pc或servo通讯的  发送我这里做好了,详细加我QQ:1300278092@qq.com.

使用特权

评论回复
14
ccw1986| | 2015-4-29 09:37 | 只看该作者
不是太懂,帮你顶上去
希望早日解决这个问题

使用特权

评论回复
15
cowboy2014| | 2015-4-29 20:41 | 只看该作者
这个资料很不错,代码用代码格式就容易阅读了

使用特权

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

本版积分规则

21

主题

72

帖子

0

粉丝