Например TDA7294

Форум РадиоКот :: Просмотр темы - Вспомним старое доброе (ARM7)
Форум РадиоКот
https://radiokot.ru/forum/

Вспомним старое доброе (ARM7)
https://radiokot.ru/forum/viewtopic.php?f=22&t=148463
Страница 2 из 2

Автор:  L_VL [ Чт окт 05, 2017 18:44:00 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

YS, с Вами, как обычно, невозможно не согласиться!

Немного дополнил инициализацию, прогнал в симуляторе по регистрам.

Код:
  AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN & (48 << 16)) | AT91C_MC_FWS_1FWS);
  AT91C_BASE_MC->MC1_FMR = ((AT91C_MC_FMCN & (48 << 16)) | AT91C_MC_FWS_1FWS);
  AT91C_BASE_WDTC -> WDTC_WDMR = AT91C_WDTC_WDDIS;
 
  pPMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(pPMC -> PMC_SR & AT91C_PMC_MOSCS));
 
  pPMC -> PMC_PLLR = ((AT91C_CKGR_DIV & (0x05 << 0)) | (AT91C_CKGR_PLLCOUNT & (28 << 8)) | (AT91C_CKGR_MUL & (25 <<16)));
  while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  pPMC->PMC_MCKR =  AT91C_PMC_PRES_CLK_2;
  while(!(pPMC -> PMC_SR & AT91C_PMC_MCKRDY));
  pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
  while(!(pPMC -> PMC_SR & AT91C_PMC_MCKRDY));


По регистрам все заносится как ему указано, результат тот же.

В инициализации флэша ему сказано "2 цикла чтение - 3 цикла запись". Для поля FMCN (количество циклов генератора в 1мкс) значение 48 (что соответствует 48 МГц).

Автор:  YS [ Чт окт 05, 2017 21:22:38 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

И тут я прочел листинги в вашем предыдущем сообщении... :))) С работы писал, был слегка запарен. :oops:

Автор:  L_VL [ Вс окт 08, 2017 00:09:30 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

Всем привет!
Продолжая ковыряться с гаджетом, толком ни к чему не пришел.

Однако, выяснил, что генерации на кварце точно нет, хотя он выбран основным источником сигнала и запущен битом MOSCEN по мануалу.

Пробовал менять кварц, результат тот же.

Может кто подскажет, где ковырять?

Автор:  YS [ Вс окт 08, 2017 10:08:32 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

Покажите, пожалуйста, топологию (в области кварца) по слоям, и, если можно, фото платы с двух сторон. :idea:

Автор:  L_VL [ Ср окт 11, 2017 18:47:16 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

Всем добрый вечер!

Я прошу прощения за задержку с ответом...

Топологии особой нету :))) Запускаемся "на коленке", вернее на макетке 8)

Прикладываю фото гаджета (до кварца 3 мм и 9 мм соответственно), емкости 10пФ на лапах кварца и тут же PLL.

На второй пикче осциллограмма того, что на кварце. Не понимаю, откуда берется такая ступенька. Рядом мерил собранный так же на коленке ATmega32 с кварцем 16 МГц - синус идеальный.

Кварц работает только когда бутлоадер в дефолте (SAM-BA, тогда и снята осцилограмма). Как только заливаю любую прошивку - на кварце только помехи.

На данный момент кварц запускать пытаюсь так:

Код:
#include <Atmel\sam7s\AT91SAM7S512.h>

int main(void)
{
  // Настройка флэш - банк 1
  AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN & (19 << 16)) | AT91C_MC_FWS_1FWS);
  // Настройка флэш - банк 2
  AT91C_BASE_MC->MC1_FMR = ((AT91C_MC_FMCN & (19 << 16)) | AT91C_MC_FWS_1FWS);
  // Отключение WatchDog
  AT91C_BASE_WDTC -> WDTC_WDMR |= AT91C_WDTC_WDDIS;
 
  // Счетчик запуска кварца, включение кварца
  AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
 
  // Выбираем источник тактирования - основной кварц
  AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK;
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  // Выбираем предделитель источника тактирования = 1
  AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_PRES_CLK;
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  // Конфигурируем порт, выводим меандр
  AT91PS_PMC    pPMC     = AT91C_BASE_PMC;
  AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;
 
  pPMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  m_pPio->PIO_PER  = AT91C_PIO_PA3;
  m_pPio->PIO_OER   = AT91C_PIO_PA3;
  m_pPio->PIO_CODR   = AT91C_PIO_PA3;

  while (1) {
    m_pPio->PIO_CODR = AT91C_PIO_PA3; 
    m_pPio->PIO_SODR = AT91C_PIO_PA3;   
  };
}


Меня сильно смущает в симуляторе, что бит MOSCEN регистра CKGR (запуск кварца) уже при запуске симуляции установлен (1). То есть, когда я его устанавливаю командой
Код:
AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);

Он не меняет своего состояния. Пробовал обнулять в самом начале CKGR, потом уже устанавливать MOSCEN. Устанавливается, но результат так же никакой.

Вот какая-то такая у меня пляска вокруг резонатора :evil:

Вложения:
20000103_000321.png [24.28 KiB]
Скачиваний: 327
quartz.JPG [205.54 KiB]
Скачиваний: 176

Автор:  YS [ Чт окт 12, 2017 10:47:54 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

Похоже, мои телепатические силы иссякли. ХЗ. Я никогда не работал с ARM от Atmel, так что не знаю в достаточной мере их особенностей, а потенциал моих догадок истощился. :dont_know:

Автор:  L_VL [ Чт окт 12, 2017 21:01:25 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

Всем привет!

Итак, взлетели!

Условия взлета чуток странные 8)

В даташите написано, что для работы с внешним генератором БЕЗ PLL необходимо:
- записать счетчик запуска OSCOUNT и бит MOSCEN;
- дождаться запуска;
- записать значение селектора источника сигнала CSS;
- дождаться стабилизации частоты;
- записать значение делителя тактовой частоты PRES;
- дождаться стабилизации.

Говоря кодом:

Код:
  // Счетчик запуска кварца, включение кварца
  AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
 
  // Выбираем источник тактирования - основной кварц
  AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK;
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  // Выбираем предделитель источника тактирования = 1
  AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_PRES_CLK;
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));


При этом везде сказано, что нельзя записывать одновременно значения полей в регистре MCKR, обязательно это делать в два прохода!

И... Внимание, рабочий код!

Код:
  // Счетчик запуска кварца, включение кварца
  AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
 
  // Выбираем предделитель источника тактирования и источник тактирования - основной кварц
  AT91C_BASE_PMC->PMC_MCKR = (AT91C_PMC_PRES_CLK | AT91C_PMC_CSS_MAIN_CLK);
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));


Говоря иначе, работает оно только тогда, когда данные записаны в MCKR одновременно! :idea:

Резонный вопрос! Что за *мяу* в доке и всех источниках?! :evil:

Ну вот как-то так... А теперь я пошел ковырять запуск с PLL на частотах over 18.432 :solder:

YS, еще раз величайшее за все мысли и оказанную помощь :beer:

Автор:  YS [ Чт окт 12, 2017 21:10:39 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

Цитата:
YS, еще раз величайшее за все мысли и оказанную помощь


Не за что. :dont_know: :) Я просто перечислял все, что приходило в голову. :)

Автор:  L_VL [ Сб окт 14, 2017 18:21:26 ]
Заголовок сообщения:  Re: Вспомним старое доброе (ARM7)

Товарищи, снова уперся...

Дошел уже стартового гайда http://ww1.microchip.com/downloads/en/A ... oc6293.pdf, документация и Редькин не помогают...

В данный момент код приведен к состоянию, как в вышеуказанном документе:

Код:
#include <Atmel\sam7s\AT91SAM7S512.h>

int main(void)
{
  AT91PS_PMC    pPMC     = AT91C_BASE_PMC;
  AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;
 
  AT91C_BASE_MC->MC0_FMR = AT91C_MC_FWS_0FWS;
 
  pPMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
 
  pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x5) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));
  while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK;
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
 
  pPMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  m_pPio->PIO_PER  = AT91C_PIO_PA3;
  m_pPio->PIO_OER   = AT91C_PIO_PA3;
  m_pPio->PIO_CODR   = AT91C_PIO_PA3;

  while (1) {
    m_pPio->PIO_CODR = AT91C_PIO_PA3; 
    m_pPio->PIO_SODR = AT91C_PIO_PA3;
  };
}


После прошивки пропадает генерация на кварце... Опять готов биться головой об стол и стены :(

Добавлено after 11 minutes 44 seconds:
Сейчас провел еще эксперимент...

Код:
Код:
#include <Atmel\sam7s\AT91SAM7S512.h>
//#include <stdint.h>

int main(void)
{
  AT91PS_PMC    pPMC     = AT91C_BASE_PMC;
  AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;
 
  pPMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
 
  pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x5) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));
  while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
 
  pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 | AT91C_PMC_CSS_PLL_CLK;
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

  pPMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  m_pPio->PIO_PER  = AT91C_PIO_PA3;
  m_pPio->PIO_OER   = AT91C_PIO_PA3;
  m_pPio->PIO_CODR   = AT91C_PIO_PA3;

  while (1) {
    m_pPio->PIO_CODR = AT91C_PIO_PA3; 
    m_pPio->PIO_SODR = AT91C_PIO_PA3;
  };
}


Работает номально, генерация есть, переключение на пине PA3 есть.

Добавляю строчку с отключением ватчдога, как в документации:
Код:
AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;

генерация пропадает...

Добавляю строчку с настройкой флэша:
Код:
AT91C_BASE_MC->MC0_FMR = AT91C_MC_FWS_0FWS;

генерация пропадает...

Что это блин за документация такая, по которой ничерта не работает?! :evil: :evil:

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/