AT90CAN128: Endlose Sendungsversuche wenn kein ACK kommt?

Gast #426348
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren