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 }
Ach ja, weiter geht's dann: Fehlerlevel 127 => Node wird passiv Fehlerlevel 255 => Node schaltet ab so jedenfalls bei anderen CAN Controllern.
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.
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?
ja, zumindest wenn der frame formal fehlerfrei ist.
Versuch's mal mit loopback-mode, vielleicht reicht das schon aus. Nennt sich vielleicht auch "self receiption" oder sowas in der Art.
Danke allen, hat mir weitergeholfen! :-)
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.