搜索
bottom↓
回复: 3

请教关于MSP430 F5438串口的问题

[复制链接]

出0入0汤圆

发表于 2011-3-19 12:01:42 | 显示全部楼层 |阅读模式
小弟最近做了一个基于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
发送的和接收的为啥不一样呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-3-19 12:42:09 | 显示全部楼层
回复【楼主位】wozai2513
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2011-3-19 13:04:37 | 显示全部楼层
回复【1楼】wanpujame
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2011-3-19 13:33:12 | 显示全部楼层
回复【1楼】wanpujame
-----------------------------------------------------------------------

非常感谢,终于将问题解决了,我在串口的输出加了2个0.1uF电容,去掉以后就可以了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 06:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表