Hallo zusammen,
Ich habe eine dumme Frage für die Realisierung eines CAN-Interrupts
Ich benutze AT91sam7x mit Eclipse, yagarto, OpenOCD.
ich glaube dass die Initialisierung bei mir Stimmt, aber beim debugen
stelle ich fest das der CAN_IMR Register leer bleibt also es wird kein
Interrupt gelöst.
Code:
void can_protocol_init()
{
//enable Pins
AT91C_BASE_PIOA->PIO_ASR = AT91C_PA19_CANRX|AT91C_PA20_CANTX;
AT91C_BASE_PIOA->PIO_PDR = AT91C_PA19_CANRX|AT91C_PA20_CANTX;
//enable Clock
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_CAN;
//init AIC-CAN
AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_CAN;
//set baudrate
AT91C_BASE_CAN->CAN_BR = CAN_BR_250K;
//disable Reception Mailbox 0-7 interrupt
AT91C_BASE_CAN->CAN_IDR = AT91C_CAN_MB0 | AT91C_CAN_MB1 |
AT91C_CAN_MB2 | AT91C_CAN_MB3
| AT91C_CAN_MB4 | AT91C_CAN_MB5 | AT91C_CAN_MB6 | AT91C_CAN_MB7;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_CAN] = 0x7; //set prior
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_CAN] = (unsigned int)
can_interrupt_handler;
AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_CAN;// Clear Interrupt
AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_CAN;//Enable Interrupt
// Enable Reception Mailbox 1-5 interrupt
AT91C_BASE_CAN->CAN_IER = AT91C_CAN_MB1
//Configure MB1 for reception
AT91C_BASE_CAN_MB1->CAN_MB_MMR = AT91C_CAN_MOT_RXOVERWRITE;
AT91C_BASE_CAN_MB1->CAN_MB_MAM = MB1_RX_MSK << 18; //reset
acceptance
AT91C_BASE_CAN_MB1->CAN_MB_MID = MB1_RX_ID << 18; //reset filter
// Clears the MRDY Signal
AT91C_BASE_CAN->CAN_MB1.CAN_MB_MCR = AT91C_CAN_MTCR;
// Enable CAN in "Listen Only" mode
AT91C_BASE_CAN->CAN_MR = AT91C_CAN_ABM | AT91C_CAN_CANEN;
//Wait for Wakeup Flag (11 rezessive bits)
while((AT91C_BASE_CAN->CAN_SR & AT91C_CAN_WAKEUP) !=
AT91C_CAN_WAKEUP);
}
void can_interrupt_handler()
{
volatile unsigned int status ; //status
//CHECK for enabled interrupt
status = ((AT91C_BASE_CAN->CAN_SR) & (AT91C_BASE_CAN->CAN_IMR));
//Disable Interrupt & Clear
AT91C_BASE_AIC->AIC_IDCR = (0x1 << AT91C_ID_CAN)|(0x1 <<
AT91C_ID_SYS);
//WAKEUP interrupt
if(status & AT91C_CAN_WAKEUP)
{
AT91C_BASE_CAN->CAN_IDR = AT91C_CAN_WAKEUP;
}
//MB1 INT
if(status & AT91C_CAN_MB1)
{
can_m1_handler();
}
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.