|
|
  |
Проблема с внешним кварцем ATSAM4SD32C, Не заводлится от внешнего кварца. |
|
|
|
Feb 18 2015, 07:49
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Всем доброго времени суток. Пытаю отладочную плату SAM4S-EK2 на базе контроллера ATSAM4SD32C. Пытаюсь заставить микросхему тактироваться от внешнего кварца 12МГц. Делаю всё как указано в даташите. Сначала перевожу процессор на тактирование от низкочастотного внутреннего генератора: PMC -> PMC_MCKR = PMC_MCKR_CSS_SLOW_CLK; Тут всё работает, процессор действительно начинает медленно работать. Далее запускаю кварцевй генератор: PMC -> CKGR_MOR = CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCRCF_12_MHz| CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCXTST_Msk | CKGR_MOR_KEY_PASSWD; При этом если разбить данную строчку на 2, т.е.: PMC -> CKGR_MOR = CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCRCF_12_MHz| CKGR_MOR_KEY_PASSWD; PMC -> CKGR_MOR = CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCXTST_Msk | CKGR_MOR_KEY_PASSWD; то выскакивает ошибка о которой скажу ниже. И так, кварцевый генератор запускается (смотрю осциллографом на резонаторе, есть генерация). Далее жду некоторое время: for(int i = 0; i < 10000; i++) {} Далее ставлю кварцевый генератор, как основной и переключаюсь с низкочастотного генератора на кварцевый: PMC -> CKGR_MOR = CKGR_MOR_MOSCSEL | CKGR_MOR_KEY_PASSWD; PMC -> PMC_MCKR = PMC_MCKR_CSS_MAIN_CLK; Компилю... Всё норм... но после прошивки ничего не происходит, а при повторной попытке прошить выскакивает ошибка, как на картинке. Единственный способ перепрошить - притянуть ногу ERASE к 0 и затем передёрнуть питание. Есть подозрения на программатор Atmel-ICE. 3 дня уже убил, всё перепробовал.
Сообщение отредактировал Грендайзер - Feb 18 2015, 07:51
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 18 2015, 08:09
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Грендайзер @ Feb 18 2015, 10:49)  Всем доброго времени суток. Пытаю отладочную плату SAM4S-EK2 на базе контроллера ATSAM4SD32C. Пытаюсь заставить микросхему тактироваться от внешнего кварца 12МГц. #define SYS_BOARD_OSCOUNT (CKGR_MOR_MOSCXTST(0x8U)) #define SYS_CKGR_MOR_KEY_VALUE CKGR_MOR_KEY(0x37) /* Key to unlock MOR register */ /* Initialize main oscillator */ if (!(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL)) { PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN; uint32_t timeout = 0xFFFF; while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && --timeout) { } } /* Switch to 3-20MHz Xtal oscillator */ PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL; uint32_t timeout = 0xFFFF; while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && --timeout) { } PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK; uint32_t timeout = 0xFFFF; while (!(PMC->PMC_SR & PMC_SR_MCKRDY) && --timeout) { } Цитата Далее жду некоторое время: for(int i = 0; i < 10000; i++) {} Так делать нежелательно. Нужно дожидаться выставления флагов в статусном регистре.
|
|
|
|
|
Feb 18 2015, 09:11
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
DmitryM, большое спасибо, вроде заработало!  3 дня блин... Не могли бы Вы ещё несколько вопросо просветить: 1) По коду: PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) |PMC_MCKR_CSS_MAIN_CLK; можно прокомментировать эту строку? 2) Из-за чего происходила ошибка? 3) И последний, как отработать прерывания в данной микросхеме? Т.е. в AVR я помню когда писал на ассемблере, задавал вектор прерываний, тем самым указывая процессору, какую подпрограмму надо выполнять если произошло именно это прерывание, когда писал на C использовал ф-ции из ToolChein'а но помню с этими ф-циями были какие то проблемы. Вот и сейчас использовать ф-ции которые Atmel предлагает - опять гадать в чём проблема. Тем более недавно пытался такой пользоваться, так выскочела та же ошибка...
|
|
|
|
|
Feb 18 2015, 11:07
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Грендайзер @ Feb 18 2015, 12:11)  Не могли бы Вы ещё несколько вопросо просветить: 1) По коду: PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) |PMC_MCKR_CSS_MAIN_CLK; Обратите внимание, что MCKR Read/Write. Т.е. очистка поля CSS и задание CSS_MAIn_CLOCK без изменения остальных полей. Цитата 2) Из-за чего происходила ошибка? Возможно, переключение на нестабилизированный генератор. Разбираться надо подробнее. Цитата 3) И последний, как отработать прерывания в данной микросхеме? Т.е. в AVR я помню когда писал на ассемблере... Примерно как в AVR. Например, прерывание от USART0. void USART0_Handler( void ) { ... } Дополнительная настройка: NVIC_SetPriority(USART0_IRQn, 6); NVIC_EnableIRQ(USART0_IRQn); USART0->US_IER = US_IER_RXRDY; Весь перечень доступных ХХХ_Handler для данного кристала описан в startup_sam4s.c
|
|
|
|
|
Feb 28 2015, 19:26
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Здравствуйте, снова появился вопрос. Заметил данную проблемку достаточно давно, но не придавал значение, а вот теперь не пойму в чём дело.. Написал вот такую программку: Код PIOA -> PIO_PER = PIO_PER_P19; // 1: Отключаю переферию PIOA -> PIO_PER = PIO_PER_P20; // 1: Отключаю переферию PIOC -> PIO_PER = PIO_PER_P20; // 1: Отключаю переферию
while(!((PIOA -> PIO_PSR & (PIO_PSR_P19 | PIO_PSR_P20)) && (PIOC -> PIO_PSR & PIO_PSR_P20))) {} PIOA -> PIO_OER = PIO_OER_P19; // 1: PIOA19 -> Input PIOA -> PIO_OER = PIO_OER_P20; // 1: PIOA20 -> Input PIOC -> PIO_OER = PIO_OER_P20; // 1: PIOC20 -> Input while(!((PIOA -> PIO_OSR & (PIO_OSR_P19 | PIO_OSR_P20)) && (PIOC -> PIO_OSR & PIO_OSR_P20))) {}
PIOA -> PIO_SODR = PIO_CODR_P19 | PIO_CODR_P20; // 1: PIOA19,20 -> '1' PIOC -> PIO_СODR = PIO_SODR_P20; // 1: PIOС20 -> '0' while (1) {} } На ноги порта А (P19, P20) выдаётся 1, а порта С (P20) - 0. К данным ножкам подключены светодиоды. К порту А через резисторы, а ножка PC20 управляет затвором ключика, который и управляет диодом. Т.о. Если на ножках PIOA19,20 единицы - светодиоды не горят, а светодиод которым управляет ключик не горит, когда на затворе 0. Всё вроде бы нормально, диоды PIOA19,20 - погашены, а вот PIOC20 - раз в 15...20 сек. загорается. Проверил импульс на затворе осциллографоом, и впрямь, переодически ножка PIOC20 генерит импульс, при том, дочтаточной длительности, что бы его можно было заметить. В чём дело?
Сообщение отредактировал Грендайзер - Feb 28 2015, 19:26
|
|
|
|
|
Mar 18 2015, 20:39
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
22MHZ - это тактовая частота. Как сказано в строчке 6, на преобразование требуется 20 импульсов тактовой частоты. Видимо, какое-то небольшое время еще нужно на выборку.
--------------------
ASB
|
|
|
|
|
Mar 19 2015, 08:05
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата Видимо, какое-то небольшое время еще нужно на выборку. Да, совершенно точно, в описании на АЦП сказано, что ему надо сколько то тактов на взятие отсчёта + 10 тактов. Цитата 22 МГц/20 = 1.1 МГц - вот максимальная частота выборок Всё, теперь понял. Я упустил из вида такой параметр, как скорость преобразования и думал что преобразование происходит по фронтам синхросигнала. Частота семплирования это - частота, с которой я реально могу оцифровать сигнал... соответственно частота оцифровываемого сигнала не должна превышать fs/2. Aleksandr Baranov, Golikov A., спасибо за раъяснения.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|