Hallo Spezies,
mir fällt nichts mehr ein, warum meine Uart zwar sauber schreibt aber
keinen IRQ auslöst.
Testweise habe ich einen Software IRQ erzwungen und der wird auch
ausgelöst
VICSoftInt = (1<<UART2_INT);
test = U2IIR;
test = U2IIR;
Die Bits in test verändern sich exakt nach Vorschrift, beim zweiten
Lesen ist das THRE Bit wieder gelöscht. Trotzdem springt er die IRQ
nicht an. Das funktioniert bei allen anderen ISRs einwandfrei.
Wenn ich schnell nacheinander Zeichen in U2THR schreibe nimmt er 16 an
und "vergisst" die anderen, auch klar, weil der TX Fifo nur 16 Bytes
hat. Er müsste aber einen IRQ auslösen, sobald zB der TX Fifo leer wird.
Tut er aber nicht, die Bits, die das anzeigen sind aber gesetzt. Bei
anderen ISR springt der Debug Cursor sofort nach einem Software INT
direkt in die jeweilige ISR rein.
Gibt es noch irgendwo ein geheimnes Bit, was ich vergessen habe?
Es gibt die geheinmisvolle Funktion bei Rowley __ARMLIB_enableIRQ() die
dafür sorgt, dass überhaupt ISR laufen. Aber ich habe kein Bit finden
können, was einen globalen INT Stop auslöst. Die anderen ISR arbeiten ja
auch.
Idee?
Hier die Init
1 | void uart2_init (uint32_t baud)
|
2 | {
|
3 | uint32_t fdiv;
|
4 |
|
5 | // Konfiguriere die GPIO's als UART Pins
|
6 | PCONP |= (1 << PCUART2); // Uart 2 einschalten
|
7 |
|
8 | // Pinsel Bits für UART2 Funktion setzen
|
9 | PINSEL0 &= ~ ( (0x03<<PINSEL_BITPIN_TX) | (0x03<<PINSEL_BITPIN_RX) ) ;
|
10 | PINSEL0 |= (PINSEL_UART_FUNC << PINSEL_BITPIN_RX) |
|
11 | (PINSEL_UART_FUNC << PINSEL_BITPIN_TX);
|
12 |
|
13 |
|
14 | U2IER = 0x00; // Alle IRQ absschalten
|
15 | U2IIR = 0x00; // IIR ID Register löschen
|
16 |
|
17 | fdiv = (F_apb / 16) / baud;
|
18 |
|
19 | // Baudrate etc einstellen
|
20 | U2LCR = 0x83; // divisor latch einschalten
|
21 | U2DLM = fdiv / 256; // set for baud low byte
|
22 | U2DLL = fdiv % 256; // set for baud high byte
|
23 | U2FDR = 0x10; // Fractional Divider ausschalten
|
24 |
|
25 | U2LCR = 0x03; // Format N81 setzen und divisor latch abschalten
|
26 | U2FCR = 0x07; // Uart FIFO ein (RX Triggerlevel 1 Zeichen)
|
27 | U2TER = 0x80; // TX einschalten
|
28 |
|
29 | // Die ISR installieren
|
30 | install_irq (UART2_INT, (void*)Isr_UART2,LOWEST_PRIORITY);
|
31 |
|
32 | // alternativ:
|
33 | //VICVectAddr28 = (uint32_t)&Isr_UART20;
|
34 | //VICVectCntl28 = LOWEST_PRIORITY;
|
35 | //VICIntEnable = 1 << 28;
|
36 |
|
37 | // RBR,THRE,RX Line Status IRQs einschalten
|
38 | U2IER |= 0x07;
|
39 | }
|