Hallo zusammen,
ich sitze gerade an einem Problem mit dem CAN-RX-Interrupt am LPC2129.
Und aus irgendwelchen Gründen bin ich zu dämlich, das Problem zu finden.
:(
Also ich habe ein Prog auf dem LPC2129, was Timer, UART, EINT etc via
Interrupt bedient. Das funktioniert auch einwandfrei.
Jetzt wollte ich noch einen Interrupt für den Empfang eines CAN-Frames.
CAN funktioniert prinzipiell auch (TX, RX im Polling-Betrieb, keine
Übertragungsfehler gesehen).
Den Interrupt registriere ich wie die anderen auch am VIC:
1 | VICVectAddr0 = (unsigned long) CAN1_ISR;
|
2 | VICVectCntl0 = VICVectCntlEn | VIC_CAN1RX;
|
3 | VICIntEnable |= (1<<VIC_CAN1RX);
|
meine Interrupt-Routine schaut folgendermaßen aus:
1 | #define ISR void __attribute__ ((interrupt("IRQ")))
|
2 | ISR CAN1_ISR(void)
|
3 | {
|
4 | // Interrupt-Source suchen
|
5 | unsigned long ICR = CAN1ICR;
|
6 | if(ICR & CANICR_RI) { // Receive-Interrupt
|
7 | CAN1_RI();
|
8 | }
|
9 |
|
10 | // Acknowledge IRQ
|
11 | VICVectAddr = 0;
|
12 | }
|
Wenn ich direkt in der ISR arbeite, funktioniert das Ganze (CAN1CMR =
CANCMR_RRB;). Auch lokale Variablen kann ich beackern.
Wenn ich das Puffer-Auslesen in einer Unterroutine mache, dann hängt
sich der Controller auf. Zumindest wird kein Interrupt mehr aufgerufen.
Durch Ausgaben am UART habe ich herausgefunden, daß er zumindest das
VICVectAddr=0 noch ausführt.
Solange ich die Unterfunktion als Inline deklariere, mag es noch. Aber
das hilft mir nichts, wenn ich später mal Callbacks (Funktionsvariablen)
integrieren möchte. In den anderen IRQs funktioniert das übrigens auch
zuverlässig; habe ich schon über Tage im Dauerbertieb getestet.
In der Interrupt-Tabelle (Startup-Code) springe ich direkt zur ISR, also
keine nested Interrupts. In allen übrigen ISRs funktioniert das auch
einwandfrei. Stackgröße IRQ-Mode = 0x100. Die anderen ISRs brauchen
definitiv mehr und funzen trotzdem.
Da mein OpenOCD nicht mit dem Prozessor mag, kann ich auch nicht genau
sagen, wo er hängenbleibt. Keine Ahnung, was da los ist; mit dem
AT91SAM7x
lief es auf Anhieb. Schaltungsaufbau JTAG mit Pull-down am RTCK, den
Rest schon gemäß Olimex-Vorlage ergänzt. Aber das ist eine andere
Baustelle -
es gibt es zum Glück den UART-Bootloader... ;)
Compiler ist WinARM-20080110. Glaube aber irgendwie nicht, daß es ein
Compiler-Problem ist. Sonst würde der Rest ja auch nicht gehen, oder?
Weiß jemand, woran das mit dem CAN-Interrupt scheitern könnte? Oder
zumindest wo ich zu suchen habe?
Danke!
Klausi