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

 
 
 
Reply to this topicStart new topic
> Непонятки с прерываниями на AT91SAM9R64, Прерывания по USART то есть, то нету...
Atridies
сообщение Aug 2 2011, 15:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Доброго времени суток!

Отлаживаю программу на 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;




Заранее спасибо за помощь!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2011, 15:31
Сообщение #2


Гуру
******

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



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

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

И традиционный уже вопрос: что побудило настроить прерывание на работу по фронту?
Go to the top of the page
 
+Quote Post
Atridies
сообщение Aug 2 2011, 20:03
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



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

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


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

2. Я пока не смотрел устанвливается ли сам флаг RXRDY, но прерывание по приему байта в uart - не вызывается.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2011, 20:10
Сообщение #4


Гуру
******

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



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

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

Просто сопоставьте эти два пункта. Вы завесили линию прерывания в активном уровне (проигнорировав TXRDY), а теперь чего-то ждете?
Go to the top of the page
 
+Quote Post
Atridies
сообщение Aug 3 2011, 12:24
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



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


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

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

Или Вы имели ввиду, что если TXRDY в единице, то выход прерывания USART равен TXRDY&RXRDY и поэтому в AIC - идет просто глухая единица ? А тогда как быть ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 3 2011, 12:58
Сообщение #6


Гуру
******

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



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

Именно, только не AND, а OR. Отключайте TXRDY, когда он не нужен.
Go to the top of the page
 
+Quote Post
Atridies
сообщение Aug 3 2011, 15:01
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



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

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

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

Спасибо за помощь!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 3 2011, 15:15
Сообщение #8


Гуру
******

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



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

ИМХО, никаких неудобств это не создает, у всех так.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th July 2025 - 21:35
Рейтинг@Mail.ru


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