реклама на сайте
подробности

 
 
> SAM7S + USART PDC + INTS, Зависает AIC??? после сброса по WDT
defunct
сообщение Jun 28 2010, 06:06
Сообщение #1


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Столкнулся с интересной ситуацией, сообщили что девайс иногда перестает работать, с виду вроде все ОК, светодиоды мигают, а коммуникаций с Host'ом - нет, интерфейс связи UART. Начал копать, и вот что накопал:

Чип на 55Mhz, UART0 - 115200, работа с UART'ом TX через DMA, RX - посимвольно в режиме 485-го.
Заметил что иногда после сброса по WDT - USART подвисает. Подвисает так:

После старта первая посылка по DMA уходит без проблем (в терминале вижу правильные данные), но прерывание TXRDY не происходит, поэтому больше девайс ничего не шлет... Хотя флаг TXRDY в статус регистре UART'а есть! Прерываний нет от USART'а вообще никаких, ни RX ни TX, ничего.....
Другая периферия после сброса по WDT работает нормально, вчастности таймер (EDGE_TRIGGERED) тикает, I2C (LEVEL_SENSITIVE) прерывания живут, на SPI висит SD карточка обмен через DMA с прерываниями (EDGE_TRIGGERED) работает.

Подумал UART глючит, пробовал вывести из ступора повторной инициализацией - не помогло. И не удивительно, UART то по всем признакам живой...

Повторный сброс по WDT (иногда второй, иногда третий...) приводит USART в чуства... и USART после этого живет долго и счастливо.

До конца не разобрался в чем было дело, но похоже что со сбросом AIC'a через WDT что-то не чисто, на что натолкнуло значение AIC_IMR = 0xFFFFEEE3 после сброса. Следующий код, решает мою проблему с UART'ом:

Код
static __inline void hal_ClearAIC(void)
{
    AT91PS_AIC pAIC = AT91C_BASE_AIC;            
    int i;
    pAIC->AIC_IDCR = 0xFFFFFFFF;
    pAIC->AIC_EOICR = 0; // mark last int as handled
    for (i = 0; i < 32; i++)
        pAIC->AIC_SVR[ i ] = 0xDEADBEEF;
}

вызвать первым при входе в main().

Кто-нибудь сталкивался с чем-то подобным?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Jun 28 2010, 06:14
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Между прочим, в чьём-то стартапе (благополучно слямзенном мною) был такой код:

Код
    // Perform 8 IT acknoledge (write any value in EOICR)
    for (i = 0; i < 8; i++) {
        AT91C_BASE_AIC->AIC_EOICR = 0;
    }

О, это стартап из Атмеловских примеров...

Сообщение отредактировал Genadi Zawidowski - Jun 28 2010, 06:20
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 28 2010, 06:31
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Genadi Zawidowski @ Jun 28 2010, 09:14) *
// Perform 8 IT acknoledge (write any value in EOICR)
..
О, это стартап из Атмеловских примеров...

хм.. а почему именно 8?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 28 2010, 06:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Jun 28 2010, 10:31) *
хм.. а почему именно 8?

По числу приоритетов.

А вот скажите, зачем используется куча edge triggered прерываний - какой-нибудь смысл в этом есть?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 20:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016