TI中文支持网
TI专业的中文技术问题搜集分享网站

TI_SETDCO MSPAFE253几个芯片出来的频率差异很大

为了保证我一批产品UART波特率的一致性,我使用了 DCO_Library.s43 的库 函数,代码在下面,但是测试下来,3块板子,一个SMCLK 输出1.93M ,一个1.66M 一个1.87M  UART口根本没办法配置才能保证3个板子UART都出9600的波特率,请问一下,我程序哪里不对么,

  WDTCTL = WDTPW + WDTHOLD;
  Init_Clk();  
  Init_IO();   
//  BCSCTL3 = LFXT1S1;
//  P1DIR |= 0x1; // P1.1 and P1.4 outputs
//  P1SEL |= 0x01;//P1.4 SMCLK output
//  P1SEL2= 0x01;// P1.4 SMCLK output  

  Delay_ms(100);
  
  result = TI_SetDCO(TI_DCO_5MHZ);
  
  if( result == TI_DCO_SET_TO_SLOWEST ) // returned result if DCO registers hit min
  {
  while(1); // trap the CPU if hit
  }
  else if( result == TI_DCO_SET_TO_FASTEST ) // returned result if DCO registers hit max
  {
  while(1); // trap the CPU if hit
  }
  else if( result == TI_DCO_TIMEOUT_ERROR ) // result if DCO takes >10000 loops
  {
  while(1); // trap the CPU if hit
  }  
  
  Init_Uart();

//****************************************************
//Shanghai GanKun Co., Ltd.
//designed  by hank
//Main fuction
//****************************************************
void Init_Clk(void)
{
  
//  DCOCTL = DCO0 + DCO1 ;              // DCO  = 3
//  BCSCTL1 = XT2OFF + RSEL2 + RSEL3 ;          //  RSEL= 12   CLK = 5.8MHZ   XT2 OFF
  DCOCTL = DCO0 + DCO1  + DCO2 ;              // DCO  = 3
  BCSCTL1 = XT2OFF + RSEL0  + RSEL1  + RSEL2 + RSEL3 ;          //  RSEL= 12   CLK = 5.8MHZ   XT2 OFF
  
  
  BCSCTL2 = 0;                          // SMCLK = DCO   MCL = DCO
  BCSCTL3 =LFXT1S1;            //LFXT = VLOCLK  
   
}

//****************************************************
//Shanghai GanKun Co., Ltd.
//designed  by hank
//Main fuction
//****************************************************
void Init_IO(void)
{
    P1DIR =BIT0+BIT3+BIT4;
    P1REN = 0;
    P1SEL = BIT0+ BIT3+BIT4;                       // P1.3,P1.4 = USART0 TXD/RXD   
    P1SEL2 = BIT0;
   
    P2DIR = 0X01;
    P2REN = 0X00;
    P2SEL = 0X00;   
    P2SEL2 = 0X00;      
   
    P2OUT = 0x00;

    SET_RS485_READ;   
   
}

Susan Yang:

您是不是将DCO的校准数据擦除了?后面您是否有进行DCO校准?

您可以通过下面方式之一来校准

1 通过利用Timer捕捉外部的32.768K晶振或是时钟源,然后得到1M,8M或是12Mhz之类的DCO的数值,然后在直接写入segment flashA里面。
2通过第三方的工具,如Elprotronic的MSP430下载工具, 它具有校正DCO的功能选项。

Elprotronic网址:http://www.elprotronic.com/

user4888046:

回复 Susan Yang:

您好!我可能理解的不是太对,TI_SetDCO我查看过他的汇编代码,他本身不就是根据CPU内部ACLK的 低频信号来校准SMCLK么,开机就执行这一段代码,为什么还需要FLASH 呢

Susan Yang:

回复 user4888046:

您现在ACLK的时钟源是VLO还是XT1?一般来说,VLO受工作电压和温度的影响比较大,建议使用XT1

另外如用户指南24.2.1 DCO Calibration TLV Structure所说

For DCO calibration, the BCS+ registers (BCSCTL1 and DCOCTL) are used. The values stored in the flash information memory SegmentA are written to the BCS+ registers.

The calibration data for the DCO is available in all 2xx devices and is stored at the same absolute addresses.

https://www.ti.com.cn/cn/lit/ug/slau144j/slau144j.pdf 

user4888046:

回复 Susan Yang:

我ACLK的时钟是用的VLO,如果是因为VLO受工作电压和温度的影响而不准确的话,那么我们对SMCLK进行校准后,SMCLK会不会也受工作电压和温度的影响变的不太准确了呢

另外再请问一下,每个MSP430AFE253芯片是不是出厂在SegmenttA里都放置了本芯片的修正参数。我实验的几个芯片因为调试FLASH,应该被我檫除了

Susan Yang:

回复 user4888046:

1 是的

2 是的,每个MSP430AFE253芯片是不是出厂在SegmenttA里都放置了本芯片的修正参数。 被意外擦除之后可以通过我之前说的方法来找回

user4888046:

回复 Susan Yang:

1 是的

如果是这样,那么我产品想用在宽温度范围的情况下,那我必须使用外部晶振,是这样么?

2 是的,每个MSP430AFE253芯片是不是出厂在SegmenttA里都放置了本芯片的修正参数。 被意外擦除之后可以通过我之前说的方法来找回
好的,谢谢!

Susan Yang:

回复 user4888046:

1 是的,要求比较高的话,建议您还是需要使用外部晶振
2 不客气

user4888046:

回复 Susan Yang:

好的,多谢了!

Susan Yang:

回复 user4888046:

很高兴能帮到您

赞(0)
未经允许不得转载:TI中文支持网 » TI_SETDCO MSPAFE253几个芯片出来的频率差异很大
分享到: 更多 (0)