Jaecko
04.01.2011, 23:30
Moin.
Auf nem AT90CAN128 läuft eine Software, die immer wieder mal über den CAN-Bus Daten sendet. Nun gibts das Problem, dass sich die Send-Funktion aufhängt, wenn das Teil nicht am Bus dranhängt.
Eigentlich auch verständlich, da die Funktion in einer while-Schleife wartet, bis die Übertragung abgeschlossen wurde. Ohne Bus wird nix abgeschlossen und TXOK bleibt 0.
Die Send-Funktion:
ui8_t CAN_SendDataWait(ui8_t mob, ui8_t * data, ui8_t len)
{
ui8_t mode;
ui8_t canstmob;
ui8_t retval = ERR_GLOBAL_ERROR;
// Choose object
CAN_SelectMsgObj(mob);
// store current mode
mode = CAN_GetMode();
// Copy data
CAN_SetData(data, len);
// Start transfer
CAN_SetMode(CANMODE_TRANSMIT_DATA);
// Wait until transmission is completed
//while (!getbit(CANSTMOB, TXOK));
while ((CANSTMOB & (1 << TXOK)) == 0)
{
// TODO: Implement timeout here
// also: Set retval to ERR_OK or ERR_CAN_TX_ERROR, depending on success
}
// Read-Modify-Write (Datasheet p. 261)
canstmob = CANSTMOB;
CANSTMOB = canstmob & ~(1<<TXOK);
// No restoring of old mode!
return retval;
}
Ich möchte nun irgendwie erreichen, dass bei fehlender Verbindung zum Bus einfach die Übertragung abgebrochen und ein entsprechender Fehlercode zurückgegeben wird.
Bisherige Versuche scheiterten aber:
-CANSTMOB abfragen, ob eines der Error-Bits gesetzt wird: Negativ, Register bleibt vor und in der while auf 0x00.
- CANTEC (Tx Error Counter) abfragen; Ebenfalls kein Ergebnis; Wert bleibt vor und in der while auf 0.
Wenn ich nen einfachen Timeout-Counter einbau, bleibt diese noch nicht gesendete Nachricht ja trotzdem noch aktiv und wartet, bis sie rausgeht.
Es müsste also irgendwie abgebrochen werden, die Funktion sollte melden, dass die Übertragung nicht möglich ist und es sollten dann auch weitere Übertragungen (z.B. über ein eigenes Bus-Off-Bit) unterbunden werden.
Kennt jemand ne Möglichkeit, dieses Problem zu lösen?
mfG
Auf nem AT90CAN128 läuft eine Software, die immer wieder mal über den CAN-Bus Daten sendet. Nun gibts das Problem, dass sich die Send-Funktion aufhängt, wenn das Teil nicht am Bus dranhängt.
Eigentlich auch verständlich, da die Funktion in einer while-Schleife wartet, bis die Übertragung abgeschlossen wurde. Ohne Bus wird nix abgeschlossen und TXOK bleibt 0.
Die Send-Funktion:
ui8_t CAN_SendDataWait(ui8_t mob, ui8_t * data, ui8_t len)
{
ui8_t mode;
ui8_t canstmob;
ui8_t retval = ERR_GLOBAL_ERROR;
// Choose object
CAN_SelectMsgObj(mob);
// store current mode
mode = CAN_GetMode();
// Copy data
CAN_SetData(data, len);
// Start transfer
CAN_SetMode(CANMODE_TRANSMIT_DATA);
// Wait until transmission is completed
//while (!getbit(CANSTMOB, TXOK));
while ((CANSTMOB & (1 << TXOK)) == 0)
{
// TODO: Implement timeout here
// also: Set retval to ERR_OK or ERR_CAN_TX_ERROR, depending on success
}
// Read-Modify-Write (Datasheet p. 261)
canstmob = CANSTMOB;
CANSTMOB = canstmob & ~(1<<TXOK);
// No restoring of old mode!
return retval;
}
Ich möchte nun irgendwie erreichen, dass bei fehlender Verbindung zum Bus einfach die Übertragung abgebrochen und ein entsprechender Fehlercode zurückgegeben wird.
Bisherige Versuche scheiterten aber:
-CANSTMOB abfragen, ob eines der Error-Bits gesetzt wird: Negativ, Register bleibt vor und in der while auf 0x00.
- CANTEC (Tx Error Counter) abfragen; Ebenfalls kein Ergebnis; Wert bleibt vor und in der while auf 0.
Wenn ich nen einfachen Timeout-Counter einbau, bleibt diese noch nicht gesendete Nachricht ja trotzdem noch aktiv und wartet, bis sie rausgeht.
Es müsste also irgendwie abgebrochen werden, die Funktion sollte melden, dass die Übertragung nicht möglich ist und es sollten dann auch weitere Übertragungen (z.B. über ein eigenes Bus-Off-Bit) unterbunden werden.
Kennt jemand ne Möglichkeit, dieses Problem zu lösen?
mfG