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