wozai2513 发表于 2011-3-19 12:01:42

请教关于MSP430 F5438串口的问题

小弟最近做了一个基于F5438的板子,
经过测试,四个串口使用ACLK,输出正常,
但是想使用高频时钟,出现点问题,
高频晶振16M,使用20pf电容,
将MCLK,SMCLK映射到P11.1,P11.2口,使用示波器,测得15.99M左右。
但是串口程序老是不对,希望大家指点一下?
程序如下:
#include "msp430x54x.h"

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;               // Stop watchdog timer
//P11DIR = BIT1+BIT2;                     // P11.1-2 to output direction
//P11SEL |= BIT1+BIT2;                      // P11.1-2 to output SMCLK,MCLK
P5SEL |= 0x0C;                            // Port select XT2
P4DIR |=BIT7;
P4OUT |=BIT7;
UCSCTL6 &= ~XT2OFF;                     // Enable XT2
UCSCTL3 |= SELREF_2;                      // FLLref = REFO
                                          // Since LFXT1 is not used,
                                          // sourcing FLL with LFXT1 can cause
                                          // XT1OFFG flag to set
UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO
// Loop until XT1,XT2 & DCO stabilizes
do
{
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
                                          // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
}while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

UCSCTL6 &= ~XT2DRIVE0;                  // Decrease XT2 Drive according to
                                          // expected frequency
UCSCTL4 |= SELS_5 + SELM_5;               // SMCLK=MCLK=XT2
P3SEL = 0x30;                           // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_2;                     // CLK =MCLK
UCA0BR0 = 0x82;                           // 16MHz波特率9600
UCA0BR1 = 0x06;                           //
UCA0MCTL = UCBRS_6+UCBRF_0;               // Modulation UCBRSx=6, UCBRFx=0
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
_EINT();
while(1);
}


#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break;                           // Vector 0 - no interrupt
case 2:                                 // Vector 2 - RXIFG
    while (!(UCA0IFG&UCTXIFG));             // USCI_A0 TX buffer ready?
    UCA0TXBUF = UCA0RXBUF;                  // TX -> RXed character
    break;
case 4:break;                           // Vector 4 - TXIFG
default: break;
}
}

如果:在串口中断中,将:UCA0TXBUF = UCA0RXBUF;                  // TX -> RXed character
改为:    UCA0TXBUF ='A';
使用串口助手能接受到A;

但是 UCA0TXBUF = UCA0RXBUF;       // TX -> RXed character
发送的和接收的为啥不一样呢?

wanpujame 发表于 2011-3-19 12:42:09

回复【楼主位】wozai2513
-----------------------------------------------------------------------

你的程序我验证过了,是没有问题的,高频晶体振荡也是正常的。你看看你的连线、共地、串口电路等部分有没有问题吧

wozai2513 发表于 2011-3-19 13:04:37

回复【1楼】wanpujame
-----------------------------------------------------------------------

谢谢你啊,我再检查一下电路。不过使用低速晶振ACLK,是没有问题的啊?

wozai2513 发表于 2011-3-19 13:33:12

回复【1楼】wanpujame
-----------------------------------------------------------------------

非常感谢,终于将问题解决了,我在串口的输出加了2个0.1uF电容,去掉以后就可以了。
页: [1]
查看完整版本: 请教关于MSP430 F5438串口的问题