Louis_Bright 发表于 2011-3-11 16:00:37

CC430F1537 串口设置

我有一个项目采用的是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没有反应,求哪位大虾指点一下!

my_avr 发表于 2011-3-11 16:31:17

我也想买CC430来玩一下,LZ能不能介绍一下在哪里买的不?

Louis_Bright 发表于 2011-3-11 16:41:05

现在我们还只买了利尔达的开发板在试验,msp430的datasheet写得很糟糕,远不如AVR的写的详细并且没有什么遗漏。

Louis_Bright 发表于 2011-3-11 16:49:51

顺便看看我的其它设置:
#if0// 如果强制当成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
#elif0// 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
#elif1// 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

liuzq1981 发表于 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
}

Louis_Bright 发表于 2011-3-11 17:00:06

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

Louis_Bright 发表于 2011-4-6 19:05:03

本着对别人和自己负责的有始有终的原则,说说现在的更新或者状态:
    msp430的Uart 源有以下几种:
    00:UCAxCLK (external USCI clock) -->真的是有引脚从外部输入
    01:ACLK
    10:SMCLK
    11:SMCLK

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

alina5307 发表于 2011-4-15 10:00:33

回复【1楼】my_avr
-----------------------------------------------------------------------

同学送我的小系统板是利尔达的,仿真器很小,一套好像也挺便宜,你可以去他们网站上看看
页: [1]
查看完整版本: CC430F1537 串口设置