搜索
bottom↓
回复: 7

CC430F1537 串口设置

[复制链接]

出0入0汤圆

发表于 2011-3-11 16:00:37 | 显示全部楼层 |阅读模式
我有一个项目采用的是CC430F1537的芯片,外面XT2接了26MHz的晶振,XT1还接了32.768KHz的晶振;我设置MCLK=XT2=26MHZ,SMCLK=DCO=1MHz,ACLK=XT1=32.768KHz;其中Uart通讯使用4800bps的波特率,而波特率设置是可以选择CLK,我看有UCA0CTL1四种选择:
00:UCAxCLK (external USCI clock)
01:ACLK
10:SMCLK
11:SMCLK
我选择01/10/11的ACLK和SMCLK测试都是可以通过的,但是,由于通讯比较严格,标准的波特率要求误差在 正负2%以内,而选用ACLK大大超过了,而用SMCL内部的DCO,则标称就是正负3%,还要考虑Uart本身的误差。所以我瞄准了那个UCAxCLK,不知道这个外部clock是什么?是不是就是XT2呢?但我测试Uart没有反应,求哪位大虾指点一下!

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入42汤圆

发表于 2011-3-11 16:31:17 | 显示全部楼层
我也想买CC430来玩一下,LZ能不能介绍一下在哪里买的不?

出0入0汤圆

 楼主| 发表于 2011-3-11 16:41:05 | 显示全部楼层
现在我们还只买了利尔达的开发板在试验,msp430的datasheet写得很糟糕,远不如AVR的写的详细并且没有什么遗漏。

出0入0汤圆

 楼主| 发表于 2011-3-11 16:49:51 | 显示全部楼层
顺便看看我的其它设置:
#if  0  // 如果强制当成MCLK来测试,则Uart没有反应
  UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCA0CTL1 |= UCSSEL_0;                     // CLK = UCAxCLK
  UCA0BR0 = 0x52;                           // 26MHz 4800
  UCA0BR1 = 0x01;                           //
  UCA0MCTL = UCBRS_0 + UCBRF_8 + UCOS16;    // Modulation UCBRSx=6, UCBRFx=0
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
#elif  0  // OK
  UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCA0CTL1 |= UCSSEL_1;                     // CLK = ACLK
  UCA0BR0 = 0x06;                           // 32768/4800=6.82 (see User's Guide)
  UCA0BR1 = 0x00;                           //
  UCA0MCTL = UCBRS_7 + UCBRF_0;             // Modulation UCBRSx=6, UCBRFx=0
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
#elif  1  // OK
  UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 13;                             // 1MHz 4800 (see User's Guide)
  UCA0BR1 = 0;                              // 1MHz 4800
  UCA0MCTL = UCBRS_0 + UCBRF_0 + UCOS16;    // Modln UCBRSx=0, UCBRFx=0,
                                            // over sampling
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
#else  // OK
  UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCA0CTL1 |= UCSSEL_3;                     // SMCLK
  UCA0BR0 = 0xD0;                           // 1MHz 4800 (see User's Guide)
  UCA0BR1 = 0x00;                           // 1MHz 4800
  UCA0MCTL = UCBRS_3 + UCBRF_0;             // Modln UCBRSx=3, UCBRFx=0,
                                            // over sampling
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
#endif

出0入0汤圆

发表于 2011-3-11 16:54:33 | 显示全部楼层
看了技术手册,UCAxCLK是需要外部输入的,UCA0CLK是第1脚,UCA0CLK是第14脚.
DCO可以设置的(1M-20M),而且设置比较准的,网站上有例程可以看看.

这个程序可以参考一下

/*
设置DCO函数
in:无
out:无
*/
void Set_DCO (void)                         // Set DCO to selected frequency
{
  #define DELTA 977                       // target DCO= DELTA*(4096) = 4Mhz
//#define DELTA 900                           // target DCO = DELTA*(4096) = 3686400
//#define DELTA 256                           // target DCO = DELTA*(4096) = 1048576
//#define DELTA 70                            // target DCO = DELTA*(4096) = 286720
  unsigned int Compare, Oldcapture = 0;

  BCSCTL1 |= DIVA_3;                        // ACLK= LFXT1CLK/8
  CCTL2 = CM_1 + CCIS_1 + CAP;              // CAP, ACLK
  TACTL = TASSEL_2 + MC_2 + TACLR;          // SMCLK, cont-mode, clear

  while (1)
  {
    while (!(CCIFG & CCTL2));               // Wait until capture occured
    CCTL2 &= ~CCIFG;                        // Capture occured, clear flag
    Compare = CCR2;                         // Get current captured SMCLK
    Compare = Compare - Oldcapture;         // SMCLK difference
    Oldcapture = CCR2;                      // Save current captured SMCLK

    if (DELTA == Compare) break;            // If equal, leave "while(1)"
    else if (DELTA < Compare)               // DCO is too fast, slow it down
    {
      DCOCTL--;
      if (DCOCTL == 0xFF)
      {
        if (!(BCSCTL1 == (XT2OFF + DIVA_3)))
        BCSCTL1--;                          // Did DCO roll under?, Sel lower RSEL
      }
    }
    else
    {
      DCOCTL++;
      if (DCOCTL == 0x00)
        {
          if (!(BCSCTL1 == (XT2OFF + DIVA_3 + 0x07)))
          BCSCTL1++;                        // Did DCO roll over? Sel higher RSEL
        }
    }
  }
  CCTL2 = 0;                                // Stop CCR2
  TACTL = 0;                                // Stop Timer_A
}

出0入0汤圆

 楼主| 发表于 2011-3-11 17:00:06 | 显示全部楼层
多谢楼上!
其实你看我其它设置,测试都是可以通过的,只是从理论来计算,32.768KHz的那个晶振由于clock本身频率比较小,误差比较大,而如果用DCO的话,理论上标称就是正负3%,而在工控中Uart的误差要在正负2%以内。
好了,看来真的是需要一个外部clock,我死心了 :(

出0入0汤圆

 楼主| 发表于 2011-4-6 19:05:03 | 显示全部楼层
本着对别人和自己负责的有始有终的原则,说说现在的更新或者状态:
    msp430的Uart 源有以下几种:
    00:UCAxCLK (external USCI clock) -->  真的是有引脚从外部输入
    01:ACLK
    10:SMCLK
    11:SMCLK

    我现在的做法是:让SMCK也跑XT2的26MHz,然后再计算,结果非常精准。

出0入0汤圆

发表于 2011-4-15 10:00:33 | 显示全部楼层
回复【1楼】my_avr
-----------------------------------------------------------------------

同学送我的小系统板是利尔达的,仿真器很小,一套好像也挺便宜,你可以去他们网站上看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-28 15:11

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

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