Доброго времени суток. Пишу прогу для AT91SAM7A3 в Keil + RealView. Проверяю пока всё с помощью встроенного дебаггера.
Разобрался с работой USART с использованием PDC:
1) настраиваю и включаю USART (режим local loopback)
2) включаю transfers AT91C_PDC_TXTEN / AT91C_PDC_RXTEN
3) включаю трансмиттер и ресивер AT91C_US_TXEN / AT91C_US_RXEN
4) с помощью указателей US_TPR / US_TCR и US_RPR / US_RCR посылаю и принимаю пачки данных. отличная автоматизация. всё нормально работает.
Теперь хочу разобраться с работой USART без использования PDC:
1) настраиваю и включаю USART (режим local loopback)
2) с помощью US_IER включаю прерывания US_RXRDY / US_TXRDY
3) настраиваю AIC: AIC_ConfigureIT(AT91C_ID_US0, 0, FavUS0_IRQ_Handler);
4) включаю AIC: AIC_EnableIT(AT91C_ID_US0);
5) включаю трансмиттер и ресивер AT91C_US_TXEN / AT91C_US_RXEN
6) после п.5 попадаю сразу в FavUS0_IRQ_Handler, потому что при включении трансмиттера TXRDY выставляется в 1
7) FavUS0_IRQ_Handler:
CODE
AT91PS_USART pUS = AT91C_BASE_US0;
unsigned int status,mask;
mask = pUS->US_IMR;
status = pUS->US_CSR & mask;
...
if (status&AT91C_US_TXRDY) {
pUS->US_IDR = AT91C_US_TXRDY; // выключаем прырывание, чтобы не зациклиться из-за пустого tx-выхода
flag_sent = 1;
}
всё. прерывание обработали. возвращаюсь в основную программу
8) пытаюсь отправить последовательно несколько байт (внутри функции main()):
CODE
01: str = malloc(BUFFER_SIZE);
02: strcpy(str,"12345");
03:
04: while (!flag_sent);
05: flag_sent = 0;
06: USART0->US_THR = str[0];
07: USART0->US_IER = AT91C_US_TXRDY;
08: while (!flag_sent);
09: flag_sent = 0;
10: USART0->US_THR = str[1];
11: USART0->US_IER = AT91C_US_TXRDY;
12: while (!flag_sent);
...
цифры 01: ... 12: условно показал. дак вот,
первый байт отправляется, на строке 08 US_CSR->US_TXRDY переходит из 0 в 1, но при этом программа не входит в обработчик прерывания FavUS0_IRQ_Handler.
Пробовал ещё настраивать local loopback, TX через PDC отправлять (TXTEN=1), а RX через RXRDY ловить. аналогичная ситуация:
один раз заходит в FavUS0_IRQ_Handler, забирает пришедший байт US_RHR, и всё. после этого трансивер отправляет остальные байты, но повторно в обработчик программа не заходит при этом (хотя US_CSR->US_RXRDY = 1).
Подскажите, в какую сторону копать?