This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F149串口通讯问题



运行正常:

见附件

运行失败:

见附件

电路板参照购买的电路板设计的,两个单片机烧录的程序是同一个串口程序(文件后面有程序源码),下面是我设计的电路板设计图,我设计的电路板输出PWM波的程序是可以正常执行的,但是串口程序总是失败,我想问一下是什么原因,快哭了

电路板原理图

 

程序源码:

/******************** HY-M149 ****************************

 * 文件名  :main.c

 * 描述    :MCU不停向PC机发送数据,在屏幕上显示0~127对应

 *          的ASCII字符

 *                   

 * 实验平台:HY-M149 V2.0开发板

 * 硬件连接:

 * 测试说明:(1)打开串口调试精灵,正确设置通信格式,观察屏幕

 *           (2)打开串口调试助手,正确设置通信格式,向学习板

 *        发送一个字符,观察是否收到回发的字符,以及是否正确

 * 通信格式:N.8.1, 9600

*****************************************************************************/

#include  <msp430x14x.h>

typedef unsigned char uchar;

typedef unsigned int  uint;

uchar *tishi = " 你好!!\

               \n  西安海洋电子\

                    \n HY-M149  V2.0  开发板";

void PutString(uchar *ptr);

/***************************时钟初始化*************************/

void Clk_Init()

{

    unsigned char i;

    BCSCTL1&=~XT2OFF;//打开XT振荡器

    BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M 

    do

    {

      IFG1 &= ~OFIFG;//清除振荡错误标志

      for(i = 0; i < 0xff; i++)  _NOP();//延时等待

    }

    while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待

    IFG1&=~OFIFG;

}

/***************************关闭所有IO口*************************/

void Close_IO()

{

    /*下面六行程序关闭所有的IO口*/

    P1DIR = 0XFF;P1OUT = 0XFF;

    P2DIR = 0XFF;P2OUT = 0XFF;

    P3DIR = 0XFF;P3OUT = 0XFF;

    P4DIR = 0XFF;P4OUT = 0XFF;

    P5DIR = 0XFF;P5OUT = 0XFF;

    P6DIR = 0XFF;P6OUT = 0XFF;

}

/********************主函数********************/

void main(void)

{

    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗

    Clk_Init();                 //时钟初始化,外部8M晶振

    Close_IO();                 //关闭所有IO口,防止IO口处于不定态

    P3SEL |= 0x30;                            // 选择P3.4和P3.5做UART通信端口

    ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受

    UCTL0 |= CHAR;                            // 选择8位字符

    UTCTL0 |= SSEL0;                          // UCLK = ACLK

    UBR00 = 0x03;                             // 波特率9600

    UBR10 = 0x00;                             //

    UMCTL0 = 0x4A;                            // Modulation

    UCTL0 &= ~SWRST;                          // 初始化UART状态机

    IE1 |= URXIE0;                            // 使能USART0的接收中断

    _EINT();                                  //打开全局中断

    PutString(tishi);

    while(1)

    {                                      

        LPM1;                                  //进入LPM1模式

        while (!(IFG1 & UTXIFG0));             //等待以前的字符发送完毕

        TXBUF0 = RXBUF0;                       //将收到的字符发送出去

    }

}

/*******************************************

函数名称:PutSting

功    能:向PC机发送字符串

参    数:无

返回值  :无

********************************************/

void PutString(uchar *ptr)

{

   while(*ptr != '\0')

   {

      while (!(IFG1 & UTXIFG0));                // TX缓存空闲?

      TXBUF0 = *ptr++;                       // 发送数据

   }

   while (!(IFG1 & UTXIFG0));

   TXBUF0 = 13;while (!(IFG1 & UTXIFG0));

   TXBUF0 = 13; TXBUF0 = 10;

}

/*******************************************

函数名称:UART0_RXISR

功    能:UART0的接收中断服务函数,在这里唤醒

          CPU,使它退出低功耗模式

参    数:无

返回值  :无

********************************************/

#pragma vector = UART0RX_VECTOR

__interrupt void UART0_RXISR(void)

{

  LPM1_EXIT;                 //退出低功耗模式

}

MSP430F149串口通讯问题.docx
  • 板子能够烧入程序,说明硬件可能没有问题。我没用过149,但是用过G2553,串口程序可能差不多,以下是我配置G2553的串口程序,能够运行

    void main(void)
    {
    // WDTCTL = WDTPW +WDTHOLD;    //关看门口狗

    WDTCTL = WDT_ADLY_16; // WDT 16ms, ACLK, interval timer

    BCSCTL1 = CALDCO_1MHZ; // 

    DCOCTL = CALDCO_1MHZ; // 设置时钟为1MHZ


    P1SEL|=BIT1+BIT2;
    P1SEL|=BIT1+BIT2;     //P1.1:RX  P1.2:TX

    UCA0CTL1 |= UCSSEL_2;   //选择时钟为SMCLK
    UCA0BR0 = 104;              //波特率设置
    UCA0BR1 = 0 ;                 //1MHZ/9600=104.166666666666
    UCA0MCTL = UCBRS0;   //小数位*8
    UCA0CTL1&=~UCSWRST; //使能串口

    while(1)
    {
           while(!(IFG2&UCA0TXIFG));   //等待数据发送完
               UCA0TXBUF = 55;


    }

  • 1)用示波器看下MCU的TX RX引脚信号

    2)根据你的硬件配置,选择相应的TI标准例程试下

  • 建议先运行一下官网的例程,排除硬件问题。

    g2553和f149有些寄存器名称不太一样的,移植程序的时候要注意