Gast
#1081470
Hallo zusammen,
ich beschäftige mich seit ein paar Wochen mit dem SAM7-EX256 Board von
Olimex. Die ersten Programme konnte ich auch schon zum laufen bringen...
Ich habe nun holgendes Problem:
Ich möchte die CAN Schnittstelle mit Interrupt Inbetrieb nehmen (z.B.
soll eine Interrupt Service Routine (ISR) nach erfolgreicher Übertragung
aufgerufen werden). Zur Initialisierung verwende ich meine eigene can.h
/ can.c. Alle Funktionen sind bereits ohne Interrupt getestet und
funktionieren!
Die Einbindung des Interrupts schien anfangs auch recht schnell zu
klappen. Bei der Übermittlung einer CAN-Nachricht wird die ISR
aufgerufen und ausgeführt - ABER: der Rücksprung ins Hauptprogramm
erfolgt nicht an die richtigen Adresse und mein Board befindet sich an
einer beliebigen Stelle in einer Endlos-Schleife. Wie schaffe ich es,
dass das Hauptprogramm an der richtigen Stelle wieder fortgesetzt wird?
Meine Init:
int CAN_Init(void)
{
...
//Interrupt Init
CAN_IER = iIntMask;
AIC_ConfigureIT(AT91C_ID_CAN0,AT91C_AIC_PRIOR_HIGHEST|(1<<5),
CAN0_Handler);
AIC_EnableIT(AT91C_ID_CAN0);
// Enable CAN
CAN_MR |= 0x1; //AT91C_BASE_CAN->CAN_MR = AT91C_CAN_CANEN;
}
und meine ISR
void CAN0_Handler(void)
{
volatile unsigned int i;
i=AT91C_BASE_AIC->AIC_IVR;
... //to do
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_CAN0);
AT91C_BASE_AIC->AIC_EOICR = 0;
}
Bin trotz intensiver Suche im Forum noch nicht auf eine Lösung gestossen
und kann jede Hilfe gebrauchen! Danke schon mal im Voraus!
Gruß Henk