|
|
  |
Непонятки с прерываниями на AT91SAM9R64, Прерывания по USART то есть, то нету... |
|
|
|
Aug 2 2011, 15:21
|
Местный
  
Группа: Свой
Сообщений: 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; Заранее спасибо за помощь!
|
|
|
|
|
Aug 2 2011, 20:03
|
Местный
  
Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468

|
Цитата(aaarrr @ Aug 2 2011, 19:31)  Ну а поподробнее, что происходит-то - не генерируется прерывание RXRDY?
И традиционный уже вопрос: что побудило настроить прерывание на работу по фронту? 1. При настройки прерывания на работу по уровню - проц начинает "жить" в прерывании (иде постоянный вызов прерывания), т.к. TXRDY - все время в единице, когда нет передачи (и это правильно - так по документации). 2. Я пока не смотрел устанвливается ли сам флаг RXRDY, но прерывание по приему байта в uart - не вызывается.
|
|
|
|
|
Aug 3 2011, 12:24
|
Местный
  
Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468

|
Цитата(aaarrr @ Aug 3 2011, 00:10)  Просто сопоставьте эти два пункта. Вы завесили линию прерывания в активном уровне (проигнорировав TXRDY), а теперь чего-то ждете? Либо чего-то я не понял, либо Вы. Смотрите, сигнал TXRDY - указывает на пустоту регистра US_THR (того, в который пишем, когда хотим отправить байт). Если мы ничего не пишем в него - он пуст, TXRDY - в единице (сбросить его я не могу). Чтобы прерывание не генерировалось постоянно - я делаю его чувствительным к фронту сигнала. Т.е. когда TXRDY переходит в единицу - AIC генерирует прерывание. Или Вы имели ввиду, что если TXRDY в единице, то выход прерывания USART равен TXRDY&RXRDY и поэтому в AIC - идет просто глухая единица ? А тогда как быть ?
|
|
|
|
|
Aug 3 2011, 15:01
|
Местный
  
Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468

|
Цитата(aaarrr @ Aug 3 2011, 16:58)  Именно, только не AND, а OR. Отключайте TXRDY, когда он не нужен. Ну да, конечно же OR. Вот блин, не очень удобно - двунаправленная передача не очень хорошо получается. Спасибо за помощь!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|