Jump to content

    
Sign in to follow this  
controller_m30

XT2 в MSP430F5

Recommended Posts

Есть два контроллера: MSP430F5510 и F5340. В обеих поставил на XT2 кварц 26мГц, выставил источник для MCLK от XT2CLK с делителем на 2, и предполагая, что теперь CPU тактируется 13мГц, пишу программу под такую сумасшедшую скорость...

Каково-же было моё удивление, когда я попробовал подключить к сигналу XT2CLK ещё и периферию (UART, настроенный для источника тактовой 13мГц), и получил скорость в бодах в разы меньшую (расчётно, как будто от источника 1мГц). Появилось подозрение, что и CPU работает от 1мГц...

 

Проверил настройки SELM и SELS в регистре UCSCTL4 - нормально, источник "5", т.е. XT2CLK.

Проверил осциллографом на ножках кварца - есть синусоида 26 мГц, с размахом 0,5В.

Настройки самого XT2: XT2DRIVE=3, XT2BYPASS=0, XT2OFF=0

Настройка Vcore в регистре PMMCTL0=3, для максимального диапазона частот CPU.

Флаг XT2OFFG=0, т.е. XT2 работает без ошибок.

Менял кварцы: 16, 12, 8 мГц - тоже никакого эффекта. С конденсаторами 15pf, и без них - и тоже без изменений.

 

В даташите на 5ю серию пишут, что если XT2 не работает, то автоматически выбирается источник "4", т.е. DCOCLKDIV, по дефолту равный 1мГц.

Проверил эту возможность - и действительно: частота процессора и периферии меняется пропорционально установкам генератора FLL в модуле DCO, и получается, что на самом деле всё работает от DCO... А вот почему?

 

Прикол ещё в том, что в одном из контроллеров от этого кварца тактируется модуль USB (в другом USB нету), и работает он прекрасно! При установке других кварцев, USB модуль также хорошо работает (само-собой, после изменения настроек под новый кварц). Получается, что кварц и настройки XT2 правильные (раз от него USB работает), а ошибка в настройках подключения MCLK и SMCLK к сигналу XT2...

 

Что я упускаю из виду??? :help:

Edited by controller_m30

Share this post


Link to post
Share on other sites
Нет кода инициализации тактирования

Вот. Правда ассемблерный.

        mov     #0A503H,PMMCTL0       ; Vcore=3
        call    #zaderjka             ; Пауза 1 сек

        mov     #0c0cdH,UCSCTL6       ; XT2DRIVE=3, XT2BYPASS=0, XT2OFF=0 (XT1-не используется)
x31:    mov     #0,UCSCTL7            ; Сброс FAULT флагов
        bit     #08h,UCSCTL7          ; контроль флага XT2OFFG
        jnz     x31                   ; повтор если XT2OFFG=1
        call    #zaderjka             ; Пауза 1 сек (на всякий случай)

        mov     #0011H,UCSCTL5        ; Делители MCLK и SMCLK = /2
        mov     #0055h,UCSCTL4        ; MCLK и SMCLK=5 (источник XT2CLK)

meandr: xor.b   #1,P4OUT              ; вывод меандра для измерения частоты
        jmp     meandr                ; бесконечный цикл

После этого предполагается, что процессор и периферия (по линии тактирования SMCLK) работают на частоте 13мГц.

 

Выполнение одного цикла программки "meandr" занимает 6 тактов (XOR=4 такта, и JMP=2 такта), а период такого меандра будет равен 12 тактов (6 тактов на "1", и 6 тактов на "0"). При частоте CPU 13мГц меандр будет что-то около 1мГц. А вместо этого формируется меандр около 40 кГц.

 

Почему меандр 40 кГц? DCOCLKDIV по дефолту = 1мГц, делитель MCLK уменьшает тактовую ещё в два раза, и на получившейся частоте 500 кГц CPU как раз и формирует меандр: 500 000 / 12 = 41,6 кГц. Хотя в регистре UCSCTL4 по прежнему указан источник "5"...

Share this post


Link to post
Share on other sites
Есть два контроллера: MSP430F5510 и F5340. В обеих поставил на XT2 кварц 26мГц, выставил источник для MCLK от XT2CLK с делителем на 2, и предполагая, что теперь CPU тактируется 13мГц, пишу программу под такую сумасшедшую скорость...

Каково-же было моё удивление, когда я попробовал подключить к сигналу XT2CLK ещё и периферию (UART, настроенный для источника тактовой 13мГц), и получил скорость в бодах в разы меньшую (расчётно, как будто от источника 1мГц). Появилось подозрение, что и CPU работает от 1мГц...

 

. Получается, что кварц и настройки XT2 правильные (раз от него USB работает), а ошибка в настройках подключения MCLK и SMCLK к сигналу XT2...

 

Что я упускаю из виду??? :help:

На просторах Техаса ХТ2 не так инициализируют

/* --COPYRIGHT--,BSD_EX
* Copyright (c) 2012, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* *  Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
* *  Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* *  Neither the name of Texas Instruments Incorporated nor the names of
*    its contributors may be used to endorse or promote products derived
*    from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************
* 
*                       MSP430 CODE EXAMPLE DISCLAIMER
*
* MSP430 code examples are self-contained low-level programs that typically
* demonstrate a single peripheral function or device feature in a highly
* concise manner. For this the code may rely on the device's power-on default
* register values and settings such as the clock configuration and care must
* be taken when combining code from several examples to avoid potential side
* effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
* for an API functional library-approach to peripheral configuration.
*
* --/COPYRIGHT--*/
//******************************************************************************
//  CC430F613x Demo - XT2 sources MCLK & SMCLK
//
//  Description: This program demonstrates using XT2 to source MCLK. XT1 is not
//  connected in this case.
//
//  By default, LFXT1 is requested by the following modules:
//     - FLL
//     - ACLK
//  If LFXT1 is NOT used and if the user does not change the source modules,
//  it causes the XT1xxOFIFG flag to be set because it is constantly looking
//  for LFXT1. OFIFG, global oscillator fault flag, will always be set if LFXT1
//  is set. Hence, it is important to ensure LFXT1 is no longer being sourced
//  if LFXT1 is NOT used.
//  MCLK = XT2
//
//               CC430F6137
//             -----------------
//        /|\ |                 |
//         |  |                 |
//         ---|RST              |
//            |            XT2IN|-
//            |                 | HF RF XTAL (26 - 27MHz)
//            |           XT2OUT|-
//            |                 |
//            |            P2.4 |--> MCLK = XT2
//            |            P2.2 |--> SMCLK = XT2
//
//   M Morales
//   Texas Instruments Inc.
//   April 2009
//   Built with CCE Version: 3.2.2 and IAR Embedded Workbench Version: 4.11B
//******************************************************************************

#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

  PMAPPWD = 0x02D52;                        // Get write-access to port mapping regs  
  P2MAP2 = PM_SMCLK;                        // Map SMCLK output to P2.2 
  P2MAP4 = PM_MCLK;                         // Map MCLK output to P2.4
  PMAPPWD = 0;                              // Lock port mapping registers  
   
  P2DIR |= BIT2 + BIT4;                     // MCLK, SMCLK set out to pins
  P2SEL |= BIT2 + BIT4;                     // P2.2, P2.4 for debugging 

  UCSCTL6 &= ~XT2OFF;                       // Enable XT2
  UCSCTL3 |= SELREF_2;                      // FLLref = REFO
                                            // Since LFXT1 is not used,
                                            // sourcing FLL with LFXT1 can cause
                                            // XT1OFFG flag to set

  // ACLK=REFO,SMCLK=DCO,MCLK=DCO
  UCSCTL4 = SELA__REFOCLK + SELS__DCOCLKDIV + SELM__DCOCLKDIV;

  // Loop until XT1,XT2 & DCO stabilizes
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                            // Clear XT2,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag
                                            
  UCSCTL4 |= SELA__REFOCLK + SELS__XT2CLK + SELM__XT2CLK;   // SMCLK=MCLK=XT2

  while(1);                                 // Loop in place
}

Edited by mcheb

Share this post


Link to post
Share on other sites
Осциллографа нет под рукой?

Есть на работе, но именно сегодня я выходной. Могу завтра замерить что надо, и даже сфоткать с экрана осцилла (цифровик).

Сами устройства дома - могу экспериментировать сколько угодно :laughing: Дома есть логический анализатор Saleae - цифровые сигналы до 12мГц показывает.

Не надо БЕЗ :)

Было предположение, что я перепутал кондёры (SMD 0402, надписей никаких), и когда менял на новые из упаковки, то в процессе включал устройство и без кондёров вовсе. Всё равно USB-модуль обнаруживался ПК, и работал как обычно.

Но это в том устройстве что на F5510 собрано. В другом USB нет совсем, и кварц нужен главным образом для тактирования UART на стабильной частоте, которая не поплывёт при колебаниях температуры. Ну и CPU, в принципе, неплохо затактировать оттуда-же.

 

На просторах Техаса ХТ2 не так инициализируют
В Вашем примере тоже самое, как мне кажется. Только написано на Си.

 

Вот как у меня реализуется XT2:

1. Ножки XT2IN, XT2OUT портов переключаем для альтернативных функций (P5SEL.x=1)

2. Биты XT2DRIVE(1,0) в регистре UCSCTL6 выставляем в зависимости от частоты кварца.

3. Сбрасываем бит XT2OFF в ноль (тот-же регистр UCSCTL6). Генератор запускается.

4. Постоянно опрашиваем флаг XT2OFFG в регистре UCSCTL7 пока он не станет равным "0", что означает что XT2 заработал стабильно.

С этого момента XT2, как я понимаю, готов для использования.

5. Подключаем к XT2CLK внутреннюю периферию, какую надо: SMCLK, ACLK, USB если есть, CPU, и т.д.

 

В примере от TI дополнительно сигнал MCLK выведен на внешний пин. А у меня об этом сигнале можно судить только косвенно, по частоте программного меандра. Но инициализация XT2 такая-же, и в том-же порядке.

Edited by controller_m30

Share this post


Link to post
Share on other sites

Вывел сигнал MCLK на внешний пин контроллера, в соответствии с примером от ТI. Картина в общем та-же.

Делитель DIVM в конце-концов выставил в "0", чтоб точнее мерить частоту на внешнем пине.

 

Сигнал MCLK = 1,05 мГц (т.е. берётся от DCOCLKDIV), при этом в регистре UCSCTL4 выставлено SELM=5 (XT2), а XT2OFFG=0 (XT2 работает). Если выставить SELM=4 (честно указать что DCOCLKDIV) то тоже будет 1,05 мГц.

Если оставить SELM=5, но менять в DCO частоту, то и MCLK на внешнем пине меняет частоту.

 

К сожалению, среди функций PORTMAP нет вывода XT2CLK на внешний пин, чтоб убедиться что он работает прямым наблюдением...

Edited by controller_m30

Share this post


Link to post
Share on other sites
bit #08h,UCSCTL7 ; контроль флага XT2OFFG

Так у Вас

У Техаса (и надо)

// Loop until XT1,XT2 & DCO stabilizes

do

{

UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,DCO fault flags

SFRIFG1 &= ~OFIFG; // Clear fault flags

}while (SFRIFG1&OFIFG); // Test oscillator fault flag

Раз уж любите ассемблер

// Loop until XT1,XT2 & DCO stabilizes - In this case loop until XT1 and DCo settle
    do
    {
        UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);    // Clear XT2,XT1,DCO fault flags
    846e:    1f 42 6e 01     mov    &0x016e,r15    
    8472:    3f f0 f4 ff     and    #-12,    r15;#0xfff4
    8476:    82 4f 6e 01     mov    r15,    &0x016e    
        SFRIFG1 &= ~OFIFG;                      // Clear fault flags
    847a:    1f 42 02 01     mov    &0x0102,r15    
    847e:    3f f0 fd ff     and    #-3,    r15;#0xfffd
    8482:    82 4f 02 01     mov    r15,    &0x0102    
    }
    while (SFRIFG1&OFIFG);                    // Test oscillator fault flag
    8486:    1f 42 02 01     mov    &0x0102,r15    
    848a:    2f f3           and    #2,    r15;r3 As==10
    848c:    f0 23           jnz    $-30     ;abs 0x846e

Edited by mcheb

Share this post


Link to post
Share on other sites
Так у Вас

У Техаса (и надо)

Спасибо, что Вы так внимательно просмотрели мой код :rolleyes: Но я не согласен что надо именно так.

В примере от TI обнуляются все флаги ошибок в регистре UCSCTL7, но контролируется что они обнулились не в том-же самом регистре, а аж через флаг глобальной ошибки осцилляторов OFIFG в регистре SFRIFG1. Такой способ проверки будет работать лишь в том случае, если в системе задействованы все три генератора: DCO, XT1 и XT2. А в примере от TI это как раз и подразумевается.

 

Если же, какой-то генератор выключен (любой: XT1, XT2, DCO) то флаг ошибки этого генератора будет установлен всегда, а соответственно и флаг глобальной ошибки тоже будет установлен непрерывно, и фиг его выключишь. У меня XT1 не используется, и флаг его ошибки =1. Поэтому я тестирую только флаг XT2OFFG, а не все флаги сразу.

Мне кажется так можно, потому что нет требования запускать все генераторы, предусмотренные производителем. Мне например кварц на XT1 не нужен, т.к. на одной плате есть часы на отдельной микросхеме, а другое устройство вообще не требует таких частот, которые может выдать XT1.

 

И в примере от TI, в описании над кодом сказано, что:

// If LFXT1 is NOT used and if the user does not change the source modules,

// it causes the XT1xxOFIFG flag to be set because it is constantly looking

// for LFXT1. OFIFG, global oscillator fault flag, will always be set if LFXT1

// is set. Hence, it is important to ensure LFXT1 is no longer being sourced

// if LFXT1 is NOT used.

Т.е. что флаг глобальной ошибки будет установлен всегда, если XT1 не используется. Как переделать пример в таком случае автор ничего не предлагает, но предупреждает об этом нюансе (как я понял).

 

Может попробую и XT1 задействовать - вдруг XT2 без XT1 не работает... (всяко бывает). Только как-то подпаять кварц туда надо.

Edited by controller_m30

Share this post


Link to post
Share on other sites

UCSCTL6 &= ~XT2OFF;                       // Enable XT2
  UCSCTL3 |= SELREF_2;                      // FLLref = REFO
                                            // Since LFXT1 is not used,
                                            // sourcing FLL with LFXT1 can cause
                                            // XT1OFFG flag to set

 

Вроде ясно всё написано,почти по-русски. Если нет LFXT1(включён по умолчанию), то переключаем на FLLref = REFO

Share this post


Link to post
Share on other sites
Вроде ясно всё написано,почти по-русски. Если нет LFXT1(включён по умолчанию), то переключаем на FLLref = REFO

Заработало!!! :08: На обеих устройствах. Спасибо за идеи! :beer:

 

Правда флаги XT1OFFG и OFIFG я сбросить так и не смог - переключение FLLref на REFO тоже не помогло. И частота MCLK осталась 1 мГц.

 

Но, задавшись целью сбросить их хоть как-то - удалось случайно запустить MCLK от XT2. Это получилось, когда в цикле опроса XT2OFFG была добавлена команда сброса глобального флага OFIFG. При таком условии, опрос флага XT2OFFG даёт искомый результат.

Почему так - хз. От сбросов сами флаги XT1OFFG и OFIFG стоят в "1" как вкопанные, но постоянная запись в них "0" позволяет каким-то волшебным образом закончить инициализацию XT2.

 

Теперь код инициализации XT2 выглядит так:

        mov    #0c0cdH,UCSCTL6   ; XT2DRIVE=3, XT2BYPASS=0, XT2OFF=0 (XT1-не используется)
x31:    mov    #0,UCSCTL7        ; Сброс FAULT флагов
        and    #0fffdh,SFRIFG1   ; Обнуление глобального флага ошибки осцилляторов OFIFG
        bit    #08h,UCSCTL7      ; контроль флага XT2OFFG
        jnz    x31               ; повтор если XT2OFFG=1
Дальше переключаемся на XT2
        mov    #0011H,UCSCTL5    ; Делители MCLK и SMCLK = /2 чтоб из 26 мГц получить 13 мГц.
        mov    #0055h,UCSCTL4    ; MCLK и SMCLK=5 (источник XT2CLK)
.................................

Инициализация проходит успешно и при FLLref=2 (REFO), и при дефолтном =0 (XT1CLK).

Share this post


Link to post
Share on other sites
Правда флаги XT1OFFG и OFIFG я сбросить так и не смог - переключение FLLref на REFO тоже не помогло. И частота MCLK осталась 1 мГц.

 

Но, задавшись целью сбросить их хоть как-то - удалось случайно запустить MCLK от XT2. Это получилось, когда в цикле опроса XT2OFFG была добавлена команда сброса глобального флага OFIFG. При таком условии, опрос флага XT2OFFG даёт искомый результат.

Почему так - хз. От сбросов сами флаги XT1OFFG и OFIFG стоят в "1" как вкопанные, но постоянная запись в них "0" позволяет каким-то волшебным образом закончить инициализацию XT2.

Для того, чтобы флаги ошибок неиспользуемых генераторов не устанавливались эти генераторы нужно ВЫключить (установив биты XT2OFF и/или XT1OFF в регистре UCSCTL6). Общий флаг ошибки нужно сбрасывать в любом слечае, но перед этим предварительно выключив неиспользуемые генераторы.

DCO выключать не нужно, его нужно использовать. Я всегда рекомендую тактировать само ядро MPS430 именно от DCO (плюсы: DCO удобно и быстро включается/выключется, в широких пределах на/под-страивается его частота). А вот периферию можно тактировать от любого удобного для вас источника тактирования- хоть встроенного, хоть внешнего. В том и состоит прелесть системы тактирования MSP430, что она позволяет тактироваться ядру и периферии от разных (асинхронных) источников.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this