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.