Форум РадиоКот 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) |
И тут я прочел листинги в вашем предыдущем сообщении... С работы писал, был слегка запарен. |
Автор: | L_VL [ Вс окт 08, 2017 00:09:30 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Всем привет! Продолжая ковыряться с гаджетом, толком ни к чему не пришел. Однако, выяснил, что генерации на кварце точно нет, хотя он выбран основным источником сигнала и запущен битом MOSCEN по мануалу. Пробовал менять кварц, результат тот же. Может кто подскажет, где ковырять? |
Автор: | YS [ Вс окт 08, 2017 10:08:32 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Покажите, пожалуйста, топологию (в области кварца) по слоям, и, если можно, фото платы с двух сторон. |
Автор: | L_VL [ Ср окт 11, 2017 18:47:16 ] | |||
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) | |||
Всем добрый вечер! Я прошу прощения за задержку с ответом... Топологии особой нету Запускаемся "на коленке", вернее на макетке Прикладываю фото гаджета (до кварца 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. Устанавливается, но результат так же никакой. Вот какая-то такая у меня пляска вокруг резонатора
|
Автор: | YS [ Чт окт 12, 2017 10:47:54 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Похоже, мои телепатические силы иссякли. ХЗ. Я никогда не работал с ARM от Atmel, так что не знаю в достаточной мере их особенностей, а потенциал моих догадок истощился. |
Автор: | L_VL [ Чт окт 12, 2017 21:01:25 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Всем привет! Итак, взлетели! Условия взлета чуток странные В даташите написано, что для работы с внешним генератором БЕЗ 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 одновременно! Резонный вопрос! Что за *мяу* в доке и всех источниках?! Ну вот как-то так... А теперь я пошел ковырять запуск с PLL на частотах over 18.432 YS, еще раз величайшее за все мысли и оказанную помощь |
Автор: | YS [ Чт окт 12, 2017 21:10:39 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Цитата: YS, еще раз величайшее за все мысли и оказанную помощь Не за что. Я просто перечислял все, что приходило в голову. |
Автор: | 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; генерация пропадает... Что это блин за документация такая, по которой ничерта не работает?! |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |