controller_m30 1 14 апреля, 2015 Опубликовано 14 апреля, 2015 (изменено) · Жалоба Есть два контроллера: 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... Что я упускаю из виду??? Изменено 14 апреля, 2015 пользователем controller_m30 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба Что я упускаю из виду??? Нет кода инициализации тактирования Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
elemmire 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба Осциллографа нет под рукой? С конденсаторами 15pf, и без них - и тоже без изменений. Не надо БЕЗ :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба Нет кода инициализации тактирования Вот. Правда ассемблерный. 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"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба Есть два контроллера: MSP430F5510 и F5340. В обеих поставил на XT2 кварц 26мГц, выставил источник для MCLK от XT2CLK с делителем на 2, и предполагая, что теперь CPU тактируется 13мГц, пишу программу под такую сумасшедшую скорость... Каково-же было моё удивление, когда я попробовал подключить к сигналу XT2CLK ещё и периферию (UART, настроенный для источника тактовой 13мГц), и получил скорость в бодах в разы меньшую (расчётно, как будто от источника 1мГц). Появилось подозрение, что и CPU работает от 1мГц... . Получается, что кварц и настройки XT2 правильные (раз от него USB работает), а ошибка в настройках подключения MCLK и SMCLK к сигналу XT2... Что я упускаю из виду??? На просторах Техаса ХТ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 } Изменено 15 апреля, 2015 пользователем mcheb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба Осциллографа нет под рукой? Есть на работе, но именно сегодня я выходной. Могу завтра замерить что надо, и даже сфоткать с экрана осцилла (цифровик). Сами устройства дома - могу экспериментировать сколько угодно :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 такая-же, и в том-же порядке. Изменено 15 апреля, 2015 пользователем controller_m30 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба Вывел сигнал 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 на внешний пин, чтоб убедиться что он работает прямым наблюдением... Изменено 15 апреля, 2015 пользователем controller_m30 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба 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 Изменено 15 апреля, 2015 пользователем mcheb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба Так у Вас У Техаса (и надо) Спасибо, что Вы так внимательно просмотрели мой код :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 не работает... (всяко бывает). Только как-то подпаять кварц туда надо. Изменено 15 апреля, 2015 пользователем controller_m30 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба Вроде ясно всё написано,почти по-русски. Если нет 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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 22 апреля, 2015 Опубликовано 22 апреля, 2015 · Жалоба Правда флаги XT1OFFG и OFIFG я сбросить так и не смог - переключение FLLref на REFO тоже не помогло. И частота MCLK осталась 1 мГц. Но, задавшись целью сбросить их хоть как-то - удалось случайно запустить MCLK от XT2. Это получилось, когда в цикле опроса XT2OFFG была добавлена команда сброса глобального флага OFIFG. При таком условии, опрос флага XT2OFFG даёт искомый результат. Почему так - хз. От сбросов сами флаги XT1OFFG и OFIFG стоят в "1" как вкопанные, но постоянная запись в них "0" позволяет каким-то волшебным образом закончить инициализацию XT2. Для того, чтобы флаги ошибок неиспользуемых генераторов не устанавливались эти генераторы нужно ВЫключить (установив биты XT2OFF и/или XT1OFF в регистре UCSCTL6). Общий флаг ошибки нужно сбрасывать в любом слечае, но перед этим предварительно выключив неиспользуемые генераторы. DCO выключать не нужно, его нужно использовать. Я всегда рекомендую тактировать само ядро MPS430 именно от DCO (плюсы: DCO удобно и быстро включается/выключется, в широких пределах на/под-страивается его частота). А вот периферию можно тактировать от любого удобного для вас источника тактирования- хоть встроенного, хоть внешнего. В том и состоит прелесть системы тактирования MSP430, что она позволяет тактироваться ядру и периферии от разных (асинхронных) источников. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться