mikrocontroller.net

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


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Device => kein ACK => Busfehler.

Autor: A.K. (Gast)
Datum:

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

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, zumindest wenn der frame formal fehlerfrei ist.

Autor: A.K. (Gast)
Datum:

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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke allen, hat mir weitergeholfen! :-)

Autor: Uwe Bonnes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hast Du jetzt zur Abhilfe gemacht?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.