Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2378 и PLL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Abo
Второй день бьюсь с настройкой PLL для сабж.
Запрограммировал тестовый пример, который выводит на ногу поделенную на 4 таймером 0 частоту ядра.
Код
void lpc23xx_pin63_to_forth_cclk ( void  )
{
    PINSEL3 |= 3 << 24;     // Port P1.28 Pin 64 as MAT0.0
    PCLKSEL0 &= ~PCLKSEL0_PCLK_TIMER0_MASK;
    PCLKSEL0 |= 1 << PCLKSEL0_PCLK_TIMER0_BIT;
    PCONP   |= PCONP_PCTIM0;
    T0TCR   = 2;              // Остановим и сбросим таймер
    T0CTCR  = 0;              // Работа в режиме таймера
    T0PR    = 0;              // Нет предделителя
    T0MR0   = 1;
    T0MCR   = 2;              // Сброс по совпадению
    T0EMR   = 3 << 4;         // Инвертировать выход блока по совпадению
    T0TCR   = 0;              // Остановим Таймер
    T0TC    = 0;
    T0TCR   = 1;              // Пустим таймер
}

Кварц на 12МГц. Выход таймера наблюдаю на осциллографе с частотомером.
Испытывал различные значения N и M при CCLKCFG = 5 с целью добиться максимальной тактовой частоты.
При этом получилось, что при значениях N=1 и M = 15, вижу на выходе таймера 9600кГц, что соответствует 38,4 МГц тактовой ядра и 192 МГц частоте CCO. Частота стоит мертво - значения на частотомере не прыгают.
Если увеличить М до 16, что должно соответствовать Fcco = 204МГц, Fcclk = 40,8МГц и выход таймера 10.2 МГц, то наблюдаю на осциллографе дрожание импульсов и частота их прыгает в районе 9,98МГц.
Если же применить те установки PLL которые в примере от Кейловской борды N=0, M=11, Fcco=288, FCclk = 57,6 то на выходе таймера вообще белиберда - импульсы далеко не меандр а с переменной скважностью, и частота прыгает около 3,41 МГц.

То ли я не правильно считаю, то ли мне попался дохлый кристалл, то ли ошибка в еррате и Fcco не может быть больше 200МГц.
Кто нибудь сможет поставить подобный эксперимент на MCB2300 и развеять мои сомнения,
или поделиться своим кодом инициализации PLL чтобы я попробовал у себя.
Кстати на моем чипе написано S60771.2W09 ZSG0637-Y
Abo
И в догонку еще одно наблюдение:
Есть следующая программа:
Код
int main(void)
{
  MAMCR = 0;
  MAMTIM = 6;
  MAMCR = 2;

  lpc23xx_pin63_to_forth_cclk(); // Выход таймера 0 - 1/4 Fcclk подает на 63 ногу

  // Будем дергать ногой P3.24 (40 pin)
  SCS |= SCS_GPIO0M;
  FIO3DIR |= 1 << 24;
  int i = 200000;
  lpc23xx_switch_to_pll(  otQUARTZ,       // (12 / 2) * 14 * 2 = 168 / 3 = 56
                                    12000000,       // Fosc
                                    13,             // Mvalue
                                     1,              // Nvalue
                                     2,              // CCLKCFG
                                     0               // USB_CLK_CFG
                                 );
  while(1){
    FIO3SET = 1<<24;
    FIO3CLR = 1<<24;
  }
}

Смотрю за выходом таймера0 на 63 ноге и дискретным сигналом P3.24 на 40 ноге.
Если установить MAMTIM = 6 то наблюдается на 60 ноге 14МГц, на 40 - 3.294МГц. Обе частоты стоят мертво.
Если во 2 строке MAMTIM сделать равным 5 то на 60 ноге частота дергается около 13.85МГц на 40 - около 7.23МГц. Начинаются редкие выпадения прораммы в undef_handler.
Если же в MAMTIM записать 4, что тоже не противоречит дадашиту (написано что если Fcclk > 40MHz надо писать 3) то на 60 ноге частота дергается около 13.77 и на 40 - около 7.51. Начинаются частые выпадения программы в undef_handler и pabort_handler.

Что же это получается - при значениях MAMTIM меньших 6 сигнал Fcclk ( тактовая ядра ) а вместе с ним и таймер (и наверное вся остальная периферия) начинает иногда пропускать такты. Вот это синхронная система получается! Значит с помощью таймера стабильную частоту кварцевого резонатора нацело не поделишь?
Но ведь этого не должно быть! Я наверное неправильно интерпретирую результаты эксперимента. Гуру - укажите мне где я ошибаюсь (или не я?).
Коs
У 2478 в errate про PLL написано, мб и здесь?
ssergy
Я неделю так мучался. Для кварца 12MHz в Startup.s MSEL=12, NSEL=1, CCLKSEL=4, USBSEL=6. По идее cclk=72MHz, usbclk=48MHz. Программа работала в зависимости от уровня оптимизации компиляции, иногда совсем непонятные глюки вылезали. После добавления или удаления нескольких строк программы все стабильно работало или не работало. Вываливалось из RTX TCP/IP библиотеки в DAbt_Handler. Выставил как в Keil-овских примерах MSEL=8, NSEL=1, CCLKSEL=4, USBSEL=4 (cclk=usbclk=48MHz) - заработало как часы. Пока дальше не разбирался.
ssergy
---
Abo
Исходя из сегодняшних наблюдений сложилось впечатление, что на сигнал CCLK влияет настройка модуля MAM - содержимое регистров MAMTIM и MAMCR. При настройке CCLK на частоты большие 48МГц наблюдается дрожание частоты на выходе таймера-делителя частоты ядра на 4. Среднее значение этой частоты не увеличивается, а наоборот даже немного уменьшается. Предполагаю что MAM заставляет ядро пропускать такты путем блокирования импульсов CCLK на ядро. Но ведь таймер 0 тоже подключен к этому сигналу (и не только таймер а и все остальные уарты и т.п.). Подобным образом я думаю можно объяснить отмеченные в первых постах явления.
Кстати :
Fcc0 = (Fin * (MSEL+1) * 2) / (NSEL + 1)
В Вашем случае Fcco = (12 * (8 + 1) * 2) / (1 + 1) = 108,
Fclk = Fcco / (CLKSEL + 1)
В Вашем случае Fclk = Fusb = 108 / (4 + 1) = 21,6 а не 48.

Или я где ошибся в рассчетах?
ssergy
Цитата(Abo @ Apr 12 2007, 15:55) *
Кстати :
Fcc0 = (Fin * (MSEL+1) * 2) / (NSEL + 1)
В твоем случае Fcco = (12 * (8 + 1) * 2) / (1 + 1) = 108,
Fclk = Fcco / (CLKSEL + 1)
В твоем случае Fclk = Fusb = 108 / (4 + 1) = 21,6 а не 48.

Или я где ошибся в рассчетах?


В таком случае бы USB не работало. Но в моем случае USB работает без проблем. Значит Fusb=48MHz или 96Mhz.

Кстати, я как то запрограммировал MSEL=24, NSEL=1, CCLKSEL вроде 4 (как в errat'е), так проц через JTAG больше не откликался. Лениво было через boot заливаться ... закоротил пинцетом кварц и подключился JTAG'ом
Abo
Цитата(ssergy @ Apr 12 2007, 19:39) *
В таком случае бы USB не работало. Но в моем случае USB работает без проблем. Значит Fusb=48MHz или 96Mhz.

Кстати, я как то запрограммировал MSEL=24, NSEL=1, CCLKSEL вроде 4 (как в errat'е), так проц через JTAG больше не откликался. Лениво было через boot заливаться ... закоротил пинцетом кварц и подключился JTAG'ом


А если посмотреть на содержимое PLLSTAT ? Точно совпадает с записываемым?
ssergy
Цитата(Abo @ Apr 12 2007, 18:43) *
А если посмотреть на содержимое PLLSTAT ? Точно совпадает с записываемым?


Как в аптеке
Abo
Цитата(ssergy @ Apr 12 2007, 20:01) *
Как в аптеке

А если проверить Fclk методом из первого сообщения?

Кстати, у меня FlashMagic в упор не видит LPC2378. Осцилографом смотрю на RXD0 и TXD0 - и запрос и ответ вижу - а считать ID контроллера не выходит - говорит не может синхронизироваться. А как у Вас?
3.14
На одной плате стоит кварц 12М, M=11, N=0, Div=3, MAM=3
На другой стоит кварц 8М, M=17, N=0, Div=3, MAM=3
Работает, есть глюки, но не уверен что это связано именно с частотой ядра.
Цитата
...
В Вашем случае Fclk = Fusb = 108 / (4 + 1) = 21,6 а не 48.

Или я где ошибся в рассчетах?
Человек видимо кейловским визардом в startup.s PLL конфигурит, а там еденички вычитаются.
Цитата
Кстати, у меня FlashMagic в упор не видит LPC2378.
Возьмите LPC200 утилиту или поставте H-JTAG.
ssergy
Цитата(Abo @ Apr 12 2007, 22:10) *
Кстати, у меня FlashMagic в упор не видит LPC2378. Осцилографом смотрю на RXD0 и TXD0 - и запрос и ответ вижу - а считать ID контроллера не выходит - говорит не может синхронизироваться. А как у Вас?


Я пользуюсь исключительно JTAG'ом. Под загрузчик не распаяны на плате элементы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.