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.

MSP430F169串口通信问题

Other Parts Discussed in Thread: MSP430F169, MSP430F149, MAX3232

用MSP430F169做最简单的串口通信测试,采用轮询方式由下位机向上位机发送数据,波特率为9600,但是每次串口收到的数据都00,现将代码贴出,请各位指点!

#include <msp430f169.h>

unsigned int display_buffer[] = {1, 2, 3, 4};

void InitSys();

void SendData(unsigned int *p);

void Uart0Init();

void main(void){

         WDTCTL = WDTPW + WDTHOLD;

         InitSys();

         while(1){

                SendData(display_buffer);

         }

}

 

void InitSys(){

          BCSCTL2  |= SELM_3 + SELS;

          P5SEL |= 0x70;

          P5DIR |= 0x70;

          Uart0Init();

}

 

void Uart0Init(){

         P3SEL |= 0x30;

         P3OUT |= 0x10;

         P3DIR  |= 0x10;

         U0CTL |= SWRST;

         ME1 |= UTXE0;

         U0CTL |= CHAR;

         U0TCTL |= SSEL0;

         U0BR0 = 0x03;

         U0BR1 = 0x00;

         UMCTL0 = 0x4A;

         U0CTL &= ~SWRST;

}

void SendData(unsigned int *p){

          unsigned int n;

          for(n = 0; n < 4; n++){

                     TXBUF = p[n];

                      while((IFG1 & UTXIFG0) == 0) ;

          }

}

  • 用TI例程。你这个程序看不出你波特率设置成9600了。时钟初始化的地方就有问题,哪里可能对呢

  • 看你的代码 U0TCTL |= SSEL0;选择UCLK = ACLK  同时你系统的Mclk和Smclk都选择了LFXTCLK,确认你的时钟源正常运行。

    在发送代码中

    while (!(IFG1 & UTXIFG0));                // USART0 TX buffer ready?
    TXBUF0 = P[n];                                    // TXBUF0装入发送值

     

  • @Xutong Han2

    因为我的开发板上只有一个低频时钟,所以MCLK和SMCLK都选择了LFXT1CLK,请问这样设置的话会有什么问题吗?

    还有就是,这样设置以后,通过使用示波器观察相应的引脚,发现MCLK的时钟输出是正确的,但是SMCLK却不对……

    还有就是我将时钟初始化程序“BCSCTL2 |= SELM_3;”以后,串口就再也没有数据输出。

    请多多指教!

    谢谢!

  • @wszqq

    我用的开发板上只有一个低频晶振,所以在设置上就只能使用LFXT1CLK。那时钟初始化程序这样写呢:

    void InitSys(){

      BCSCTL1 |= XT2OFF;

      BCSCTL2 |= SELM_3 + SELS + DIVM_0;

    }

    如有不对,请详细指正!

    谢谢!

  • 你先用这个例子测试你的串口,看看能不能正常接收和发送数据,

    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
      ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
      UCTL0 |= CHAR;                            // 8-bit character
      UTCTL0 |= SSEL0;                          // UCLK = ACLK
      UBR00 = 0x03;                             // 32k/9600 - 3.41
      UBR10 = 0x00;                             //
      UMCTL0 = 0x4A;                            // Modulation
      UCTL0 &= ~SWRST;                          // Initialize USART state machine
      IE1 |= URXIE0;                            // Enable USART0 RX interrupt

    // Mainloop
      for (;;)
      {
      _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/interrupt
      while (!(IFG1 & UTXIFG0));                // USART0 TX buffer ready?
      TXBUF0 = RXBUF0;                          // RXBUF0 to TXBUF0
      }
    }

    // UART0 RX ISR will for exit from LPM3 in Mainloop
    #pragma vector=USART0RX_VECTOR
    __interrupt void usart0_rx (void)
    {
      _BIC_SR_IRQ(LPM3_bits);                   // Clear LPM3 bits from 0(SR)
    }

  • @Xutong Han2

    貌似还是不行……将进入低功耗和中断语句去掉后,对TXBUF0直接赋值,然后观察寄存器U0TXBUF,里面的值是正确的,但是串口还是没有数据。

    目前怀疑可能是硬件有问题。

  • Sheldon Song,

    请问你用示波器观察过对应管脚吗?实际上有没有数据输出?另外,因为用到了外部低频晶体,请将LFXT1作为ACLK的时钟源,然后将ACLK从管脚输出,看看究竟晶振有没有正常起振。如果正常起振了,直接用TI的例程对应管脚还是没有输出的话,极有可能就是芯片损坏了。

    还有一点,MCLK和SMCLK都选择了LFXT1CLK,这一点非常不推荐,CPU的主频还是推荐使用内部DCO, 跑的远比ACLK高一些,保证CPU有足够的性能来协调和配合外设工作。

    希望对你有帮助!O(∩_∩)O~

  • 楼主,给你个例子你测试测试。

    //******************************************************************************
    // MSP-FET430P140 Demo - USART0, UART 9600 Echo ISR, HF XTAL ACLK
    //
    // Description: Echo a received character, RX ISR used. Normal mode is LPM0,
    // USART0 RX interrupt triggers TX Echo. Though not required, MCLK = LFXT1
    // ACLK = MCLK = UCLK0 = LFXT1 = 3.58MHz
    // Baud rate divider with 3.58Mhz XTAL @9600 = 3.58MHz/9600 = 372 (0174h)
    // //* An external 3.58Mhz XTAL on XIN XOUT is required for ACLK *//
    //
    // MSP430F149
    // -----------------
    // /|\| XIN|-
    // | | | 3.58MHz
    // --|RST XOUT|-
    // | |
    // | P3.4|------------>
    // | | 9600 - 8N1
    // | P3.5|<------------
    //
    //
    // M. Buccini
    // Texas Instruments Inc.
    // Feb 2005
    // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
    //******************************************************************************

    #include <msp430.h>

    int main(void)
    {
    volatile unsigned int i;
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
    BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL

    do
    {
    IFG1 &= ~OFIFG; // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--); // Time for flag to set
    }
    while ((IFG1 & OFIFG)); // OSCFault flag still set?

    BCSCTL2 |= SELM_3; // MCLK = LFXT1 (safe)
    ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
    UCTL0 |= CHAR; // 8-bit character
    UTCTL0 |= SSEL0; // UCLK = ACLK
    UBR00 = 0x74; // 3.58Mhz/9600 - 372
    UBR10 = 0x01; //
    UMCTL0 = 0x00; // no modulation
    UCTL0 &= ~SWRST; // Initialize USART state machine
    IE1 |= URXIE0; // Enable USART0 RX interrupt

    _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
    }

    #pragma vector=USART0RX_VECTOR
    __interrupt void usart0_rx (void)
    {
    while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
    TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0
    }

  • Lina Lian

    我用示波器观察过169的UTXD管脚,是有输出信号的。点相应的ACLK管脚也是有输出信号的,而且是32.7k。昨天检查了一下硬件,发现232的输入管脚有信号,但是输出管脚没有,也许问题是出在这里,目前还在 进一步的检查中。

    不过这里还有一个问题:如果我使用DCOCLK、BCSCTL1和BCSCTL2的默认值,那么串口是没有数据发出的,不过,我只是配置BCSCTL2,即“BCSCTL2 |= SELM_x + SELS”,也就是只要加上SELS,串口就会有数据显示,但数据全部都是乱的。请问这是什么原因呢?

  • 楼主,可能你买到假的MAX3232了,仔细检查以下电荷泵的电压是否正常。

    可以尝试换一个MAX3232芯片试试。

    谢谢。

  • Sheldon Song,

    默认情况下,MCLK=SMCLK=DCOCLK, ACLK=LFXT1. 而你加上SELS后,是SMCLK=LFXTT1=32k. 你在不同设置下,分 别输出MCLK, SMCLK和ACLK,先检验一下对不对。

    串口有数据显示但是是乱码,说明波特率或者数据格式设置有误。你试着更改一下上位机的设置试试。

  • Leon Yan

    利用周末检查了一下硬件,因为没有原理图,只能用万用表点,结果发现原来232是和169的串口1接在一起的……

    发现问题以后及时修改程序,起初也是没有输出的,不过过了一段时间以后就好了。

    感谢您近期以来的解答!

    十分感谢!

  • LIna Lian

    利用周末检查了一下硬件,因为没有原理图,只能用万用表点,结果发现原来232是和169的串口1接在一起的……

    发现问题以后及时修改程序,起初也是没有输出的,不过过了一段时间以后就好了。

    感谢您近期以来的解答!

    十分感谢!