Hallo,
ich hab da ein Problem mit dem TXEMPTY Interrupt des UC3A1512 (AVR32).
Ich möchte auf einer Leitung senden und empfangen, dafür schalte ich den
Transmitter zum Senden an und für den Empfang ab (Master Slave
Kommunikation). Um einen Datenblock zu senden verwende ich den TXRDY
Interrupt (was wunderbar funktioniert) zum Abschalten des Transmitters
hätte ich gerne den TXEMPTY Interrupt verwendet um den Sender
abzuschalten und auf Empfang zu schalten. In der Theorie sollte das
gehen (bereits in einem AVR realisiert) doch nun zur Praxis:
TXEMPTY Interrupt ist aktiviert und in der ISR behandelt. Das Problem
ist: die Stelle in der ISR , die dafür vorgesehen ist (siehe Pfeil in
der ISR), wird nicht angesprungen. Warum?
hier ein paar Codeteile:
Initialisierung:
1 | init_usart1()
|
2 | {
|
3 | static const gpio_map_t USART1_GPIO_MAP =
|
4 | {
|
5 | {USART1_RX_PIN, USART1_RX_FUNCTION},
|
6 | {USART1_TX_PIN, USART1_TX_FUNCTION}
|
7 | };
|
8 |
|
9 | // Options for debug USART.
|
10 | usart_options_t USART1_options =
|
11 | {
|
12 | .baudrate = USART1_BAUDRATE,
|
13 | .charlength = 8,
|
14 | .paritytype = USART_NO_PARITY,
|
15 | .stopbits = USART_1_STOPBIT,
|
16 | .channelmode = USART_NORMAL_CHMODE
|
17 | };
|
18 |
|
19 | // Setup GPIO
|
20 | gpio_enable_module(USART1_GPIO_MAP, sizeof(USART1_GPIO_MAP) / sizeof(USART1_GPIO_MAP[0]));
|
21 |
|
22 |
|
23 | // Initialize it in RS232 mode.
|
24 | usart_init_rs232(USART1, &USART1_options, FPBA);
|
25 | USART1->cr = AVR32_USART_CR_RXEN_MASK|AVR32_USART_CR_TXDIS_MASK;
|
26 |
|
27 | // Init interrupt and timeout
|
28 | INTC_register_interrupt(&USART1_isr, AVR32_USART2_IRQ, AVR32_INTC_INT1);
|
29 | USART1->ier = AVR32_USART_IER_RXRDY_MASK|AVR32_USART_IER_TXRDY_MASK|AVR32_USART_IER_TIMEOUT_MASK|AVR32_USART_IER_TXEMPTY_MASK;
|
30 | USART1->rtor = 50;
|
31 | USART1->ttgr = 1;
|
ISR:
1 | __attribute__((__interrupt__)) void USART1_isr( void )
|
2 | {
|
3 |
|
4 | unsigned char cs = 0;
|
5 | int rx_char = 0, i;
|
6 |
|
7 | if (USART1->csr & AVR32_USART_CSR_TIMEOUT_MASK)
|
8 | {
|
9 | USART1->cr |= AVR32_USART_CR_STTTO_MASK;
|
10 |
|
11 | //TODO empfang
|
12 |
|
13 | // disable receiver
|
14 | USART1->idr = AVR32_USART_IDR_RXRDY_MASK;
|
15 | }
|
16 | else if (USART1->csr & AVR32_USART_CSR_TXRDY_MASK)
|
17 | {
|
18 | if (tx_ptr < length)
|
19 | {
|
20 | USART1->thr = (tx_buffer[tx_ptr++] << AVR32_USART_THR_TXCHR_OFFSET) & AVR32_USART_THR_TXCHR_MASK;
|
21 | }
|
22 | }
|
23 | else if (USART1->csr & AVR32_USART_CSR_TXEMPTY_MASK)
|
24 | {
|
25 | // disable transmitter
|
26 | --> USART1->cr = AVR32_USART_CR_TXDIS_MASK;
|
27 | }
|
28 | else if (USART1->csr & AVR32_USART_CSR_RXRDY_MASK)
|
29 | {
|
30 | if ( usart_read_char(USART1, &rx_char) == USART_SUCCESS)
|
31 | {
|
32 | rx_buffer[rx_ptr++] = (char) rx_char;
|
33 | }
|
34 | }
|
35 | }
|
Hat jemand eine Idee oder Hinweis woran es scheitert?
Gruß Willi