Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятки с прерываниями на AT91SAM9R64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Atridies
Доброго времени суток!

Отлаживаю программу на MCU AT91SAM9R64 (без операционки, использую только пример атмеловский usb mass storage): настроил usart. Отдельно на прием и отдельно на передачу - работает. Но стОит разрешить прерывание по RXRDY и TXRDY: TX - нормально обрабатывается, а RX - ни в какую.

Как такое может быть - ума не приложу !

Errata на проц - не нашел.


Код
void ConfigureUsart0(void)
{
    unsigned int mode = AT91C_US_USMODE_NORMAL
                        | AT91C_US_CLKS_CLOCK
                        | AT91C_US_CHMODE_NORMAL
                        | AT91C_US_CHRL_8_BITS
                        | AT91C_US_PAR_NONE
                        | AT91C_US_NBSTOP_1_BIT;

    // Enable the peripheral clock in the PMC
    PMC_EnablePeripheral(AT91C_ID_US0);

    // Configure the USART in the desired mode @115200 bauds
    CurrentBaudRate = 115200;
    USART_Configure(AT91C_BASE_US0, mode, CurrentBaudRate, BOARD_MCK);

    // Configure the RXBUFF interrupt

    AIC_ConfigureIT(AT91C_ID_US0, 0x20, ISR_Usart0);    // Прерывание по фронту
    AIC_EnableIT(AT91C_ID_US0);

    // Enable receiver & transmitter
    USART_SetTransmitterEnabled(AT91C_BASE_US0, 1);
    USART_SetReceiverEnabled(AT91C_BASE_US0, 1);
}

void UsartPioConfig(void)
{ PIO_Configure(pPinsUT, PIO_LISTSIZE(pPinsUT)); }


//--------

UsartPioConfig();     // Конфигурирование пинов для usart

ConfigureUsart0();    // Параметры связи: 115200, 8n1.

AT91C_BASE_US0->US_CR = AT91C_US_RSTSTA;
AT91C_BASE_US0->US_IER = AT91C_US_RXRDY | AT91C_US_TXRDY;




Заранее спасибо за помощь!
aaarrr
Цитата(Atridies @ Aug 2 2011, 19:21) *
Но стОит разрешить прерывание по RXRDY и TXRDY: TX - нормально обрабатывается, а RX - ни в какую.

Ну а поподробнее, что происходит-то - не генерируется прерывание RXRDY?

И традиционный уже вопрос: что побудило настроить прерывание на работу по фронту?
Atridies
Цитата(aaarrr @ Aug 2 2011, 19:31) *
Ну а поподробнее, что происходит-то - не генерируется прерывание RXRDY?

И традиционный уже вопрос: что побудило настроить прерывание на работу по фронту?


1. При настройки прерывания на работу по уровню - проц начинает "жить" в прерывании (иде постоянный вызов прерывания), т.к. TXRDY - все время в единице, когда нет передачи (и это правильно - так по документации).

2. Я пока не смотрел устанвливается ли сам флаг RXRDY, но прерывание по приему байта в uart - не вызывается.
aaarrr
Цитата(Atridies @ Aug 3 2011, 00:03) *
1. При настройки прерывания на работу по уровню - проц начинает "жить" в прерывании (иде постоянный вызов прерывания), т.к. TXRDY - все время в единице, когда нет передачи (и это правильно - так по документации).

2. Я пока не смотрел устанвливается ли сам флаг RXRDY, но прерывание по приему байта в uart - не вызывается.

Просто сопоставьте эти два пункта. Вы завесили линию прерывания в активном уровне (проигнорировав TXRDY), а теперь чего-то ждете?
Atridies
Цитата(aaarrr @ Aug 3 2011, 00:10) *
Просто сопоставьте эти два пункта. Вы завесили линию прерывания в активном уровне (проигнорировав TXRDY), а теперь чего-то ждете?


Либо чего-то я не понял, либо Вы.

Смотрите, сигнал TXRDY - указывает на пустоту регистра US_THR (того, в который пишем, когда хотим отправить байт). Если мы ничего не пишем в него - он пуст, TXRDY - в единице (сбросить его я не могу). Чтобы прерывание не генерировалось постоянно - я делаю его чувствительным к фронту сигнала. Т.е. когда TXRDY переходит в единицу - AIC генерирует прерывание.

Или Вы имели ввиду, что если TXRDY в единице, то выход прерывания USART равен TXRDY&RXRDY и поэтому в AIC - идет просто глухая единица ? А тогда как быть ?
aaarrr
Цитата(Atridies @ Aug 3 2011, 16:24) *
Или Вы имели ввиду, что если TXRDY в единице, то выход прерывания USART равен TXRDY&RXRDY и поэтому в AIC - идет просто глухая единица ? А тогда как быть ?

Именно, только не AND, а OR. Отключайте TXRDY, когда он не нужен.
Atridies
Цитата(aaarrr @ Aug 3 2011, 16:58) *
Именно, только не AND, а OR. Отключайте TXRDY, когда он не нужен.

Ну да, конечно же OR.

Вот блин, не очень удобно - двунаправленная передача не очень хорошо получается.

Спасибо за помощь!
aaarrr
Цитата(Atridies @ Aug 3 2011, 19:01) *
Вот блин, не очень удобно - двунаправленная передача не очень хорошо получается.

ИМХО, никаких неудобств это не создает, у всех так.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.