原创
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;
}
用户377235 2015-8-13 19:45