Forum: Mikrocontroller und Digitale Elektronik Interrupt AT91SAM7x


von _GaST (Gast)


Lesenswert?

Hallo zusammen,

ich bin auf der Suche nach einem Beispielprogramm für CAN-Interrupt 
(GNU).
ich benutze das EVAL-Board von OLIMEX-SAM7-EX256, als 
Entwicklungsumgebung benutze ich auch (Eclipse, Yagarto, Open-OCD).
Ich versuche die CAN-Schnittstelle zu betreiben. Das Senden funktioniert 
super. Beim Empfangen siehe ich Daten auf der Leitung aber die Interrupt 
wird nicht ausgelöst.

Danke im Voraus

von gerhard (Gast)


Angehängte Dateien:

Lesenswert?

hallo,
im anhang ein beispiel projekt von atmel.

gruss
gerhard

von _GaST (Gast)


Lesenswert?

Hallo gerhard,
Vielen Dank erstma;-)
Anbei mein Init_Code.
Kannst du mir bitte sagen was ich hier falsch mache.

Danke im Voraus



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;
  //  //enable WAKEUP Int
  //  AT91C_BASE_CAN->CAN_IER = AT91C_CAN_WAKEUP;

  //disable Reception Mailbox 0-7 interrupt
  //AT91C_BASE_CAN->CAN_IDR = AT91C_CAN_MB1; //| 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_CAN->CAN_IER = AT91C_CAN_WAKEUP;
  AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_CAN;      //Enable Interrupt

  //enable WAKEUP Int




  //Configure MB1 for reception
  AT91C_BASE_CAN_MB1->CAN_MB_MMR    = AT91C_CAN_MOT_RXOVERWRITE;
  AT91C_BASE_CAN_MB1->CAN_MB_MAM    = 0x000 << 18;   //reset acceptance
  AT91C_BASE_CAN_MB1->CAN_MB_MID    = 0x000 << 18;   //reset filter


AT91C_BASE_CAN->CAN_IER = AT91C_CAN_MB1 ;//| AT91C_CAN_MB2 | 
AT91C_CAN_MB3 | AT91C_CAN_MB4 | AT91C_CAN_MB5;


   // Clear and trigger Transfer
   AT91C_BASE_CAN->CAN_TCR = AT91C_CAN_MB1;// | AT91C_CAN_MB2 | 
AT91C_CAN_MB3 | AT91C_CAN_MB4 | AT91C_CAN_MB5;;
   AT91C_BASE_CAN->CAN_MB1.CAN_MB_MCR = AT91C_CAN_MTCR;

 AT91C_BASE_CAN->CAN_MR = AT91C_CAN_CANEN; //

von gerhard (Gast)


Lesenswert?

hallo gast,
ich kann dir bei deinem problem leide rnicht helfen da ich das 
can-interface noch nie benutzt habe.
Ich würde mir mal das beispiel ansehen, da sollte die initialisierung 
entsprechend codiert sein.

gruss
gerhard

von _GaST (Gast)


Lesenswert?

Hallo Gerhard,

das ist ja ein Beispiel für den internen Transfer. Ich bekomme meine 
Daten von einer Labview Oberfläsche. Die Daten kann ich mit dem 
Oszillator sehen. Ich weiß nicht warum die Interrupt sich nicht auslöst.

Gruß
Moris

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
Noch kein Account? Hier anmelden.