Forum: Mikrocontroller und Digitale Elektronik AT90CAN128: Endlose Sendungsversuche wenn kein ACK kommt?


von Frank (Gast)


Lesenswert?

Hallo!

Nachfolgender Code funktioniert, solange ein weiteres CAN-Device 
angeschlossen ist. Fehlt dieses, bleibt CanTX(..) an der Whileschleife 
"while (!(CANSTMOB & (1<<TXOK)));   //wait until complete" hängen.

-Ist das Standardverhalten von CAN, wenn kein Ack kommt, endlos weiter 
zu senden?
-Kann man beim AT90CANxx das (ohne eigene Timeout-Überwachung) 
unterbinden oder sonstwie weitere Sendeversuche abbrechen?

Vorab schonmal Danke!
Frank

void canInit(void){
   //250kb/s @12MHz
   CANBT1 = 0x04;
   CANBT2 = 0x0C;
   CANBT3 = 0x37;

   //MB0..MB14: CANSTMOB=0, CANCDMOB=0,
   //           CANIDTn=0, CANIDMn=0, CANMSG(*8)=0
   canClearAllMob();

   CANGCON = (1<<ENASTB);   //start CAN interface

   while (!(CANGSTA & (1<<ENFG)));   //wait until module ready
}

void canTx (MOB_T msg){

   //enable MOb0, auto increment index, start with index = 0
   CANPAGE = (0<<4);
   canClearMob();

   canSetExtId(msg.id);      //CANIDTn setzen, CANCDMOB|=(1<<IDE)
   for (U8 i=0; i<8; i++)    //put data in mailbox
      CANMSG = msg.data[i];
   CANCDMOB |= (8<<DLC0);    //8 Bytes senden

   CANCDMOB |= (1<<CONMOB0);          //enable transmission
   while (!(CANSTMOB & (1<<TXOK)));   //wait until complete
   CANSTMOB &= ~(1<<TXOK);        //reset flag
}

von A.K. (Gast)


Lesenswert?

Kein Device => kein ACK => Busfehler.

von A.K. (Gast)


Lesenswert?

Ach ja, weiter geht's dann:
   Fehlerlevel 127 => Node wird passiv
   Fehlerlevel 255 => Node schaltet ab
so jedenfalls bei anderen CAN Controllern.

von Dirk D. (dirkd)


Lesenswert?

Ein ausbleibendes Ack kann laut Datenblatt einen Interrupt auslösen.

Außerdem wird Bit0 im Register CANSTMOB gesetzt.

Du könntest auch das Transmit-Error Register auslesen und abbrechen wenn 
zu viele Fehler auftreten.

von Frank (Gast)


Lesenswert?

Danke schonmal.
Eine Frage noch: Quittiert jedes CAN-Device, unabhängig davon, ob es für 
die soeben empfangene ID (Empfangsfilter) konfiguriert wurde oder nicht?

von crazy horse (Gast)


Lesenswert?

ja, zumindest wenn der frame formal fehlerfrei ist.

von A.K. (Gast)


Lesenswert?

Versuch's mal mit loopback-mode, vielleicht reicht das schon aus. Nennt 
sich vielleicht auch "self receiption" oder sowas in der Art.

von Frank (Gast)


Lesenswert?

Danke allen, hat mir weitergeholfen! :-)

von Uwe Bonnes (Gast)


Lesenswert?

Was hast Du jetzt zur Abhilfe gemacht?

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.