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.