打印
[DSP编程]

2812 SCI自动波特率检测

[复制链接]
3825|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
raoxianbin|  楼主 | 2014-1-20 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,

这两天弄SCi自动波特率检测程序,SCIB做主设备    SCIA 做从设备,利用SCIA的接收中断进行数据回发,和相应的位清除操作,结果  发现ABD  一直不会置位,程序一直在重复发送“A”,但是SCIA的接收中断只能进入一次,且接收的数据是0X00ff,而不是b所发送的"A",

希望有相关经验的人提示一下,出现这种问题的是什么??帮忙分析下


还有就是我的板子吧SCI转换为了422 接口,连接我用示波器看过了,应该没有问题,B能发送出相应的数据,也能进A的相应管脚,但是A不能回发,也就是A的SciaRegs.SCIRXBUF.bit.RXDT没有接收到的数据不是“A”

感激不尽。。。

相关帖子

沙发
zhangmangui| | 2014-1-20 16:24 | 只看该作者
自动波特率检测你是在硬件仿真下做的还是烧写后   
首先建议你:如果在硬件仿真下   如果不行  就reset一下CPU  然后重新下载一次试试
如果是烧写后测试  我发现第一次不会自动识别成功  然后复位一下硬件  然后重新启动之后
就可以自动识别成功   这可能是DSP的一个小bug

使用特权

评论回复
板凳
zhangmangui| | 2014-1-20 16:28 | 只看该作者
供你参考
void AutobaudLock(void)
{   
    SciaRegs.SCICTL1.bit.SWRESET = 0; //软复位
    SciaRegs.SCICTL1.bit.SWRESET = 1; //使能SCI

    // 波特率寄存器必须设置>= 1
    SciaRegs.SCIHBAUD = 0;
    SciaRegs.SCILBAUD = 1;

    SciaRegs.SCIFFCT.bit.ABDCLR = 1; //清除ABD位
    SciaRegs.SCIFFCT.bit.CDC = 1; //使能自动波特率侦测
}

使用特权

评论回复
地板
zhangmangui| | 2014-1-20 16:29 | 只看该作者
interrupt void SCITXINTA_ISR(void)     // SCI-A
{
        unsigned char ReceivedAChar;
        DINT;//关闭总中断
       
        //自动侦测波特率处理
        if(SciaRegs.SCIFFCT.bit.ABD == 1)
           {
            SciaRegs.SCIFFCT.bit.ABDCLR = 1; //清除ABD
              SciaRegs.SCIFFCT.bit.CDC = 0; //禁止自动波特率侦测
              ReceivedAChar = SciaRegs.SCIRXBUF.all;
                SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除中断标志位
                SciaRegs.SCIFFRX.bit.RXFIFORESET=0; //将FIFO指针复位为0
                SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //退出复位状态
              if(ReceivedAChar == 'A')
                {        
                        Send_String_SCIA("right!");//        Autobaud
                        SciaRegs.SCIFFRX.bit.RXFFIENA = 1;// 使能SCIA FIFO接收中断
                        connect_right = 1;
                }       
              else
              {
                      Send_String_SCIA("wrong!");  //        Autobaud
                        connect_right = 0;
                }
           }
       
        SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除中断标志位
        PieCtrl.PIEACK.all |= M_INT9;   //响应中断
        EINT;   //开总中断
}

使用特权

评论回复
5
raoxianbin|  楼主 | 2014-1-20 17:41 | 只看该作者
zhangmangui 发表于 2014-1-20 16:24
自动波特率检测你是在硬件仿真下做的还是烧写后   
首先建议你:如果在硬件仿真下   如果不行  就reset一下 ...

恩   我是在硬件仿真模式下,我刚以为是硬件本身的问题,所以我把自检波特率给屏蔽了,就用B给A发,发现是可以的,谢谢斑竹  我在看看。。。

使用特权

评论回复
6
zhangmangui| | 2014-1-20 18:46 | 只看该作者
raoxianbin 发表于 2014-1-20 17:41
恩   我是在硬件仿真模式下,我刚以为是硬件本身的问题,所以我把自检波特率给屏蔽了,就用B给A发,发现 ...

什么时候有时间给大家开个专题   自动波特率侦测的

使用特权

评论回复
7
raoxianbin|  楼主 | 2014-1-20 18:48 | 只看该作者
zhangmangui 发表于 2014-1-20 16:29
interrupt void SCITXINTA_ISR(void)     // SCI-A
{
        unsigned char ReceivedAChar;

搞定了,多谢斑竹回答,好像是一个在中断里,最先没有关闭总中断,但是感觉这也不是什么问题

把代码贴出来吧


#include   "DSP28_Device.h"
#include    "DSP28_Globalprototypes.h"



#define BAUDSTEP 10           
void scia_init(void);
void scib_init(void);
void scia_xmit(int a);
void scib_xmit(int a);
void scia_AutobaudLock(void);
void error(int);
interrupt void rxaint_isr(void);


Uint16 LoopCount;

Uint16 ReceivedCount;
Uint16 ErrorCount;
Uint16 SendChar;
Uint16 ReceivedAChar;   
Uint16 ReceivedBChar;   
Uint16 BRRVal;
Uint16 Buff[10] = {0x55, 0xAA, 0xF0, 0x0F, 0x00, 0xFF, 0xF5, 0x5F, 0xA5, 0x5C};

void main(void)
{
   Uint16 i;

   InitSysCtrl();

   EALLOW;
   GpioMuxRegs.GPFMUX.all=0x0030;        // Select GPIOs to be Scia pins
                    GpioMuxRegs.GPGMUX.all=0x0030;        // Select GPIOs to be Scib pins
                                      EDIS;

   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

   InitPieVectTable();

   EALLOW;            // This is needed to write to EALLOW protected registers
   PieVectTable.RXAINT = &rxaint_isr;
   EDIS;      
   scia_init();       // Initalize SCIA
   scib_init();       // Initalize SCIB


   LoopCount = 0;
   ErrorCount = 0;
    ReceivedCount=0;
        SendChar=0;
       
   PieCtrl.PIEIER9.all = 0x0001; // Enable all SCIA RXINT interrupt  SCI B don't enable
   IER |= 0x0100;                                 // enable PIEIER9, and INT9  cpu  intertupt
   EINT;

       for (BRRVal = 0x00f3; BRRVal < (Uint32)0xFFFF; BRRVal+=BAUDSTEP)
{

       //SCIB has a known baud rate.  SCIA will autobaud to match
      ScibRegs.SCIHBAUD = (BRRVal >> 8);//host
          ScibRegs.SCILBAUD = (BRRVal);

                       scia_AutobaudLock();

        //        scib_xmit('A');
           while(ScibRegs.SCIRXST.bit.RXRDY != 1) { }
            ReceivedBChar = 0;
            ReceivedBChar =  ScibRegs.SCIRXBUF.bit.RXDT;
        //        ReceivedBChar =  ScibRegs.SCIRXBUF.all
          if(ReceivedBChar != 'A')
            {
                error(0);
            }

                        for(i= 0; i<=9; i++)
            {
              SendChar = Buff;
              scib_xmit(SendChar);                                         




            while(ScibRegs.SCIRXST.bit.RXRDY != 1)
              {
                  asm("   NOP");
              }
              ReceivedBChar = 0;
              ReceivedBChar =  ScibRegs.SCIRXBUF.bit.RXDT;
              if(ReceivedBChar != SendChar)
              error(1);
            }

   } // Repeat for next BRR setting

        for(;;)
    {
       asm("    NOP");
    }


}



interrupt void rxaint_isr(void)     // SCI-A
{
  // Insert ISR Code here

     DINT;//关闭总中断
   // If we were autobaud detecting, we must clear CDC
  if(SciaRegs.SCIFFCT.bit.ABD == 1)
   {
      SciaRegs.SCIFFCT.bit.ABDCLR = 1;
      SciaRegs.SCIFFCT.bit.CDC = 0;// Check received character - should be 'A'  IF not "a" the program will into the
                                                                      //scia_AutobaudLock()
                                                       
      ReceivedAChar = 0;
//        ScibRegs.SCIRXBUF.bit.RXDT='A';
          ReceivedAChar =  SciaRegs.SCIRXBUF.bit.RXDT;
     // ReceivedAChar = SciaRegs.SCIRXBUF.all;
      if(ReceivedAChar != 'A')
      {
         error(2);
      }
      else scia_xmit(ReceivedAChar);
  }

   // This was not autobaud detect
   else
   {
      // Check received character against sendchar
       ReceivedAChar = 0;
       ReceivedAChar = SciaRegs.SCIRXBUF.all;

      if(ReceivedAChar != SendChar)
      {
         error(3);
      }
      else scia_xmit(ReceivedAChar);
   }

   SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;        // clear Receive interrupt flag  ABD SRT 1 will  cause FIFO中断(TXINT)。
   //SciaRegs.SCIFFCT.bit.CDC = 0;
   SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
   SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
   ReceivedCount++;

    PieCtrl.PIEACK.all = PIEACK_GROUP9;
        EINT;
}


void error(int ErrorFlag)
{
      ErrorCount++;
      /*asm("     ESTOP0");                 // Uncomment to stop the test here 出错时,则停止运行
      for (;;);*/

}

// SCIA  8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
void scia_init()
{
    // Note: Clocks were turned on to the SCIA peripheral
    // in the InitSysCtrl() function

    // Reset FIFO's
    SciaRegs.SCIFFTX.all=0x8000;

    SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
    SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE
    //SciaRegs.SCICTL2.all =0x0003;

        // SciaRegs.SCIHBAUD = 0;
    //SciaRegs.SCILBAUD = 0xF3;
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset


}


void scib_init()
{
        ScibRegs.SCIFFTX.all=0x8000;

    // 1 stop bit, No parity, 8-bit character
    // No loopback
    ScibRegs.SCICCR.all = 0x0007;

    // Enable TX, RX, Use internal SCICLK
    ScibRegs.SCICTL1.all = 0x0003;
         // SCIB has a known baud rate.  SCIA will autobaud to match
            //ScibRegs.SCIHBAUD = 0;
            //ScibRegs.SCILBAUD = 0xf3;

    // Disable RxErr, Sleep, TX Wake,
    // Diable Rx Interrupt, Tx Interrupt
    ScibRegs.SCICTL2.all = 0x0000;

    // Relinquish SCI-A from reset
    ScibRegs.SCICTL1.all = 0x0023;//重启SCI

    //return;
}




// Transmit a character from the SCI-A'
void scia_xmit(int a)
{
    SciaRegs.SCITXBUF=a;
}

// Transmit a character from the SCI-B'
void scib_xmit(int a)
{
    ScibRegs.SCITXBUF=a;
}


void scia_AutobaudLock()
{   
    Uint32 i;
    SciaRegs.SCICTL1.bit.SWRESET = 0;
    SciaRegs.SCICTL1.bit.SWRESET = 1;

    // Must prime baud register with >= 1
    SciaRegs.SCIHBAUD = 0;
    SciaRegs.SCILBAUD = 1;

        SciaRegs.SCIFFCT.bit.ABDCLR = 1;
    SciaRegs.SCIFFCT.bit.CDC = 1;

        while(SciaRegs.SCIFFCT.bit.CDC== 1)
    {  
             for(i = 1; i<= 0x0FFFFFF; i++)
       {
             // asm("     NOP");
       }  

       if(SciaRegs.SCIFFCT.bit.CDC == 1)  
          // for(;;)
           scib_xmit('A');  // host transmits 'A'

   }

    //return;
}

//===========================================================================
// No more.
//===========================================================================




谢谢斑竹了。。








使用特权

评论回复
8
raoxianbin|  楼主 | 2014-1-20 18:49 | 只看该作者
zhangmangui 发表于 2014-1-20 18:46
什么时候有时间给大家开个专题   自动波特率侦测的

呵  静等斑竹开题。。。

使用特权

评论回复
9
zhangmangui| | 2014-1-20 18:52 | 只看该作者
raoxianbin 发表于 2014-1-20 18:48
搞定了,多谢斑竹回答,好像是一个在中断里,最先没有关闭总中断,但是感觉这也不是什么问题

把代码贴出 ...

好的   谢谢分享

使用特权

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

本版积分规则

36

主题

244

帖子

1

粉丝