原创 MSP430-自适应波特率测试程序

2010-10-7 15:50 2861 10 11 分类: 通信
微控技术论坛原创主贴  作者:cbing2000 微控版主
//*****************************************************************************
//  MSP430-自适应波特率测试程序
//  May 2008
//  Built with IAR Embedded Workbench Version: 3.40A
//  程序功能:能够自适应主机的通信速度
//  使用方法:
//  1、如果主机通信速度在14400~115200之间(含)时,主机发送回车符(0X0D)
//     单片机收到后设置自身的波特率后返回0XAA给主机。
//  2、如果主机通信速度小于14400(不含)时,主机需发送两次回车符(0X0D),
//     为了保持可靠的通信时间及运算时间,两次发送之间最好延时若干毫秒,
//     单片机收到后设置自身的波特率后返回0XAA给主机。
//  3、本程序来源为TI公司SLAA215.PDF应用报告编写而成.
//  *******************************************************
//  本人遵循技术开放、广交天下朋友的原则,该程序可由任何人修改使用。
//  如有大虾修改了更为完善的该软件,请发送一份给本人。谢谢!
//*********************************************************
#include <msp430x44x.h>

#define TXD BIT4
#define RXD BIT5

typedef struct
{
  unsigned char  ubr00;
  unsigned char  ubr01;
  unsigned char  umctl0;
}BAUD_register;
//*****************************************
const BAUD_register baudPARA[] =
{
  {0x09, 0x00, 0x0A,},       // BAUD115200
  {0x12, 0x00, 0x84,},       // BAUD57600
  {0x1b, 0x00, 0x94,},       // BAUD38400
  {0x36, 0x00, 0x5b,},       // BAUD19200
  {0x48, 0x00, 0x7b,},       // BAUD14400
  {0x6d, 0x00, 0x44,},       // BAUD9600
  {0xda, 0x00, 0xaa,},       // BAUD4800
  {0xb4, 0x01, 0xdf,},       // BAUD2400
  {0x69, 0x03, 0x7b,},       // BAUD1200
};

//************************************************
unsigned char BaudCode;
unsigned char Match_flag;
//***********************************************************
void send(void);
void init_UART0(void);
void DELAY_8MS(void);
unsigned char ABR_dect(void);
void SET_BAUD(const BAUD_register*);
//******************************************************
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  init_UART0();
  SET_BAUD(baudPARA);
  _EINT();
  while(1)   //没有匹配成功就一直在匹配程序里循环
  {
    LPM0;
    Match_flag=ABR_dect();
    if( Match_flag)
    {
      send();
      break;           //匹配成功就跳出循环
    }
     
  }//while
 
  _NOP();             //用户添加程序
}//main



//***************************************************
//--------------初始化UART0------------------------
//****************************************************
  void init_UART0(void)
  {
  FLL_CTL0 |= XCAP14PF;
  UTCTL0 |= SSEL1;                 //UCLK = SMCLK;
  UCTL0 |= SWRST+CHAR;             // USART held in reset
  URCTL0 |= URXEIE;                //数据出错也允许进中断
  UCTL0 &= ~SWRST;
 
  P2DIR |= TXD;
  P2SEL |= RXD + TXD;
                          
  ME1 |= URXE0+UTXE0;                        //接收使能
  IE1 |= URXIE0;                             //接收中断都使能
  }



unsigned char ABR_dect(void)
{

  const BAUD_register *ptr;          //定义指向BAUD_register类型的指针
  switch(BaudCode)
  {//switch  1
 
      case 0x0d :
        ptr = baudPARA;                          // Perfect match!
        break;
      case 0xe6 :
        ptr = baudPARA+1;
        break;
      case 0x1c :
        ptr = baudPARA+2;
        break;
      case 0xe0 :
        ptr = baudPARA+3;
        break;
      case 0x80 :
        ptr = baudPARA+4;
        break;
      case 0x00 :
        {
        SET_BAUD(baudPARA+5);
        DELAY_8MS();
        LPM0;
        switch (BaudCode)                        // Get 2nd UART character
          { //switch   2
            case 0x0d :                             // Perfect match!
             ptr = baudPARA+5;
              break;
            case 0xe6 :
              ptr = baudPARA+6;
              break;
            case 0x78 :
              ptr = baudPARA+7;
              break;
            case 0x80 :
              ptr = baudPARA+8;
              break;
            default :
              return 0;                                // Failure
           }//switch   2
          break;
        }//case 0x00:
        
      default :
        return 0;                                // Failure
  }//switch  1
  SET_BAUD(ptr);
  DELAY_8MS();
  return 1;
}






//********************************
void SET_BAUD(const BAUD_register *pp)
{
  UCTL0 = SWRST+CHAR;               // USART held in reset
  IE1 &= ~URXIE0;  
  UBR00 = pp->ubr00;                
  UBR10 = pp->ubr01;                
  UMCTL0 = pp->umctl0;
  UCTL0 &= ~SWRST;                   // Release USART
  IE1 |= URXIE0;  
}
//*********************************
void send(void)
{
//unsigned char tt;
while( !(IFG1 & UTXIFG0));
_NOP();
TXBUF0 = 0xAA;
_NOP();

}

//*********************************
#pragma vector = UART0RX_VECTOR
__interrupt void RX(void)
{
BaudCode = RXBUF0;
LPM0_EXIT;
}


//*********************************
void DELAY_8MS(void)
{
TACTL = TASSEL0 + MC0+TACLR;
CCR0  = 272;
while( !(TACTL & TAIFG) );
TACTL = 0;
}
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2015-8-13 19:45

多的话不说,一句感谢!
相关推荐阅读
用户1370220 2011-06-20 22:18
各种字符编码方式详解及由来
PS:这家伙肯定是圣经看多了,呵呵,不过还是不错的,至少我了解了很多。我感觉文章是好的,于是转摘了。各种字符编码方式详解及由来(ANSI,UNICODE,UTF-8,GB2312,GBK) - 日志 ...
用户1370220 2011-06-20 22:14
一网友关于MOS管的使用 (网摘)
MOS管大家都使用,但不一定用得对,在开发过程中,我也犯过一些错误,自己也做了下总结,写出来跟大家一同分享。欢迎多交流,QQ号:540446363,Email:lgh_0302@163.com. 1 ...
用户1370220 2011-05-24 23:03
SMA SMB SMC封装的二极管详细区分(转载)
SMA、SMB、SMC封装的二极管详细区分 ...
用户1370220 2011-04-26 17:34
有关GPS模块输出数据的解释(整理,转载)
GPS 接收OEM 板的型号甚多、性能各异,但它们的GPS定位信息串行输出格式大多采用美国国家海洋电子协会制定的NMEA-0183 通信标准格式。其输出数据采用的是ASCII码,内容包含了纬度、经度、...
用户1370220 2011-04-13 21:58
两种实用的电池供电电路分析(转载)
两种实用的电池供电电路分析 随着信息时代的来临,手持电子产品层出不穷(如PDA、数码相机、手机等)。这些产品主要采用电池供电,在此类产品中如何设计电源管理电路,确保产品的实用性、经济性成为产品设计的...
用户1370220 2010-12-20 21:27
DS12C887详细说明及用法 (转载)
时间:2010-5-8 21:31:49 来源:www.asp163.org 作者:大头爸爸  DS12C887时钟日历芯片,是由美国DALLAS公司生产的新型时钟日历芯片,采用CMOS技术制成。芯...
EE直播间
更多
我要评论
1
10
关闭 站长推荐上一条 /3 下一条