|
AT91SAM7S64 в ресете и не выходит из него, Причём так на 6 платах, а год всё работало нормально |
|
|
|
Feb 27 2009, 20:59
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515

|
Все привет! Делал больше года назад 6 плат для стендов в университете. На платах стоит по одному AT91SAM7S64. Там же разъём USB, подключение блока питания (питание и от USB и от БП: стоит диод для USB и диод на БП, выходы диодов объединяются и идут на линейник 3.3В с кондёрами), светодиоды, кнопочки и т.д. Вообщем типичная отладочная плата + клеммники + драйверы двигателей постоянного тока (A3949). Целый год всё работало. А потом в течение трёх недель по очереди начали глючить все платы. Симптомы: при включении (через БП или USB) загораются некоторые лампочки (теже, что и при ресете). При запуске консоля jlinka последний сообщает ID арма, т.е. находит его. При попытке прошить из ИАРа выскакивает сообщение: Код Fri Feb 27 23:50:06 2009: Loaded macro file: D:\Programs\IAR Systems\Embedded Workbench 5.0 Evaluation\ARM\config\flashloader\Atmel\FlashAT91SAM7Sx.mac Fri Feb 27 23:50:06 2009: DLL version: V3.92 Fri Feb 27 23:50:06 2009: Firmware: J-Link compiled Jul 30 2008 11:24:37 ARM Rev.5 Fri Feb 27 23:50:06 2009: JTAG speed is initially set to: 32 kHz Fri Feb 27 23:50:06 2009: TotalIRLen = 4, IRPrint = 0x01 Fri Feb 27 23:50:06 2009: Halting CPU core Fri Feb 27 23:50:06 2009: Using DBGRQ to halt CPU Fri Feb 27 23:50:06 2009: Resetting TRST in order to halt CPU Fri Feb 27 23:50:06 2009: Halting CPU core Fri Feb 27 23:50:06 2009: Using DBGRQ to halt CPU Fri Feb 27 23:50:06 2009: Resetting TRST in order to halt CPU Fri Feb 27 23:50:08 2009: Fatal error: Unable to halt ARM core
Session aborted! Fri Feb 27 23:50:09 2009: Failed to load flash loader: D:\Programs\IAR Systems\Embedded Workbench 5.0 Evaluation\ARM\config\flashloader\Atmel\FlashAT91SAM7Sx.out Что может быть? Неужели процы погорели? Вся схемотехника стандартная, везде всё залито полигоном. Студенты приличные, никто никуда ничего вроде не тыкал. Скоро лабы начнутся, надо что-то делать!  Да, забыл сказать, когда горели платы их подключали только по USB, т.е. никаких БП и двигателей не погключали (драйверы A3949 питаются от БП до диода на линейник). Ещё забыл сказать: все напряжения (+3.3В, +1.8В) в полном порядке (+/- 0.1В) На ножке резета высокий уровень
|
|
|
|
|
Feb 28 2009, 13:04
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515

|
aaarrrНе могу проверить - осциллографа нет  Напряжение берётся или от USB или от БП - всё одно и тоже. Конденсаторы все той ёмкости, что атмеловцы рекомендуют. KAlexПолучилось! Видимо прошлый раз плохо проводком замкнул ножку erase на +3.3В. Теперь проц прошивается один раз, а потом таже хрень и невозможность повторно прошить без eras'а. Решил сразу прошить и запустить в отладчике по Ctrl+D. Проц успешно дошёл до функции main(), далее нормально выполнился код по инициализации кварца и PLL'а. После выполнения строчки Код // Enable User Reset and set its minimal assertion to 960 us AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5 << 24); вывалилась ошибка  Если нажать "Пропустить" то вываливается ошибка "faild to read next instruction" и так до упора пока "Отмена" не нажал. Что может быть?? Я закомментировал эту строчку инициализации reset'а и прошил ещё раз. Всё заработало, только теперь, естественно, нет реакции при нажатии на reset. Работают USB, PWM, PIO, ADC! На плате есть 4 кнопочки. Так вот одна всегда как бы нажата (0 вольт). Посмотрел, а ножка PA25, на которой кнопка висит, прозванивается с землёй  Щас посмотрю что ещё на землю упало. Что это, как вы думаете? (Может ПП с течением времени испортилась и начала коротить с полигоном?) UPD. Прозвонил все ножки на АРМе: кроме тех, что GND, на землю замыкается только PA25. Не знаю, чей это глюк (кнопки, проца или печатной платы), ибо другие платы домой не взял - не могу проверить. Во всяком случае на плате уже можно провести лабы, что уже хорошо. Хорошо бы с остальными платами так же было.... Но разобраться, что произошло, всё равно хочется. Ни у кого никаких идей нет?
|
|
|
|
|
Feb 28 2009, 13:13
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Pasha 111 @ Feb 28 2009, 16:04)  Но разобраться, что произошло, всё равно хочется. Ни у кого никаких идей нет? Я бы расставил вероятности так (в порядке убывания): 1. Убит вывод процессора 2. Сломалась кнопка 3. Глюк платы (почти невероятно)
|
|
|
|
|
Feb 28 2009, 14:31
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Pasha 111 @ Feb 28 2009, 17:18)  Хм... Посмотрел: на всех платах, где специально pull-up резистор на +3.3В не стоит, на резете 2.6-2.8В стоит и всё работает. Ошибся я малость - глюк с pull-up'ом описан в еррате. Цитата(Pasha 111 @ Feb 28 2009, 17:18)  Т.е. проблема была не с записью в регистр, а с тем, что проц сразу же после её выполнения ресетился. Но на ножку резета я специально зацепил +3.3В. Что может глючить? Надеюсь, не напрямую? Прежде чем включать сброс от пина, нужно дождаться окончания генерации сброса наружу, т.е. NRSTL в RSTC_SR должен стоять в '1'.
|
|
|
|
|
Feb 28 2009, 21:10
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515

|
Изменил код так: Код while(!(AT91C_BASE_RSTC->RSTC_RSR & AT91C_RSTC_NRSTL)) {}; AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5 << 24); Программа при выполнении зависает в цикле и не выходит. Т.е. тогда процессор не был в ресете, а просто ресетился с огромной скоростью, т.к. программа всегда доходила до записи в mode register и происходил сброс. Так, собственно, почему процессор стал себя так вести и почему весь год было всё нормально? Как исправить? Привожу кусок кода. Сначала выполняется стандартный код от атмела (асм и сишник с lowlevelinit). Потом Код int main() { Init();
............ }
void Init() { SetClock(1, 6); // <--- для кварца 16.000 MHz //SetClock(5, 26); // <--- для кварца 18.432 MHz
uint32 RSR = 0; while(!(RSR & AT91C_RSTC_NRSTL)) { RSR = AT91C_BASE_RSTC->RSTC_RSR; } AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5 << 24);
............... }
void SetClock(uint8 div, uint8 mul) { AT91PS_PMC pPMC = AT91C_BASE_PMC; // Set MCK at 48 000 000 pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & div) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & ((mul - 1)<<16)));
// Wait the startup time while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // Selection of Master Clock and Processor Clock pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // Select the PLL clock divided by 2 pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ; while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); } Всё зависает на while(!(RSR & AT91C_RSTC_NRSTL)) Пробовал комментировать вызов SetClock(), чтобы только атмеловская lowlevelinit выставила частоту (пусть и не 48 МГц, т.к. у меня кварц 16 МГц) - не помогло.
|
|
|
|
|
Mar 1 2009, 12:30
|

Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 6-01-05
Пользователь №: 1 830

|
Цитата(Pasha 111 @ Feb 28 2009, 15:28)  Я тоже так подумал, правда не ясно, как мог убиться вывод, который кнопкой на GND просто замыкался и был настроен в вход... Кстати, на ножке резета 2.6В. На совсем другой (но работающей) плате, где тоже SAM7S64 стоит, на резете тоже 2.6В, видимо, это нормально. Сгорел контроллер сброса в проце? о_О Вообще то выходы проца, соединенные с кнопкой, убиваются статикой на ура. Особенно в зимнее время при низких температурах и малой влажности. Чтобы этого не происходило даже специальные тактовые кнопки изобрели: с металлической оправкой пластмассового штифта кнопки и 5 закороченным на землю выводом. Если у вас тактовая кнопка с 4 выводами и вы живете в Сибири, то в январе-феврале такое событие как умирание входа проца у вас почти со 100-процентной вероятностью должно было произойти. Решение очевидное: использовать кнопки с 5 заземляющим электродом + специальная защита входа от статики: последовательный резистор на кнопку, с другой стороны стабилитрон или BAV99 c одним выводом на землю, а вторым на +питания.
|
|
|
|
|
Mar 5 2009, 23:41
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515

|
DirНу в прошлом году платы успешно пережели январь, февраль, март и т.д. не понятно, почему именно сейчас возникли глюки. А вот диоды, да, я поставить не догадался  На входах АЦП, мышинально уже, поставил BAT54S (сдвоенный диод в SOT23), а вот на кнопки почему-то нет. KAlexПростите, торможу, что такое J-Flash? Принёс домой остальные платы и купил новый проц. Завтра посмотрю, одинакого ли себя ведут остальные платы, а на одной из них ещё АРМ перепаяю, посмотрю на разницу в работе с новым процом и старыми.
|
|
|
|
|
Mar 6 2009, 19:30
|

Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 6-01-05
Пользователь №: 1 830

|
Цитата(Pasha 111 @ Mar 6 2009, 01:41)  DirНу в прошлом году платы успешно пережели январь, февраль, март и т.д. не понятно, почему именно сейчас возникли глюки. А вот диоды, да, я поставить не догадался  На входах АЦП, мышинально уже, поставил BAT54S (сдвоенный диод в SOT23), а вот на кнопки почему-то нет. Абисняю  В прошлом году кнопочки были новенькие, а в этом - уже замусоленные пальцами, заслюнявленные чихами и кашлями. Статический заряд через новенькие кнопочки не хочет сбегать на вход проца по поверхности кнопки, а через замусоленные делает это с удовольствием и чем ниже температура, тем меньше влажность и заряда на студентах накапливается больше. А поскольку кнопки 4-х выводные и через защитный ободок и 5 ножку заряд не стекает на землю, то он делает свое черное дело с входом проца. Тем более, как оказалось, вы его даже резистором и диодами не защитили.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|