ich habe das Problem das mein CAN-Shield den "Betrieb" einstellt wenn schon während des Inits (nach Reset) CAN-Botschaften empfangen werden. Der CAN-Bus sendet unabhängig vom UNO permanent Daten.
Wenn der Fehler vorhanden ist liefert der Befehl CAN.checkError() eine 5 (und wenn alles normal ist 0)
Frage, wie kann ich das ErrorRegister (EFLG) löschen damit der MCP2515 wieder normal arbeitet?
Hardware: UNO, CAN-Shield mit MCP2515
Bibliothek: CAN_BUS_Shield von Seeed-Studio mit mcp_can.h
In mcp_can.h siehst Du Methoden wie void mcp2515_reset(void); unter private: und byte begin(...); unter public:. Nur die öffentlichen Methoden kannst Du von Deinem Programm aus ansprechen, die privaten werden nur innerhalb der Bibliothek verwendet.
Die Bibliothek ist lokal auf Deiner Platte gespeichert und kann von Dir verändert werden. Du kannst eigene öffentliche Methoden entwerfen und damit private Methoden nutzen.
Jackson0:
Wenn der Fehler vorhanden ist liefert der Befehl CAN.checkError() eine 5 (und wenn alles normal ist 0)
Das bedeutet, EWARN und TXWAR sind 1. Die kann man aber nur lesen.
EWARN: Resets when both REC and TEC are less than 96
TXWAR: Resets when TEC is less than 96
Ein direktes Zurücksetzen ist nicht möglich.
Nach CAN.begin(...) wird mcp2515_init(...) und mcp2515_reset() aufgerufen. Ich hätte erwartet, daß dieses Zurücksetzen genügt. Aber möglicherweise gibt es dazu andere Erfahrungen.
Also ich habe jetzt einiges Probiert und getestet, es ist in der Tat so das der MCP2515 bzw. die Library Probleme damit hat wenn schon beim CAN_Init (viele) Daten auf dem Bus vorhanden sind.
Dann ist immer nach dem Init sofort bei CAN.checkError() eine 5 vorhanden.
Wenn ich das Programm so abändere das in der Hauptroutine Loop() ein
if (CAN.checkError()) Init_MCP();
Init_MCP:
void Init_MCP() {
cli();//stop interrupts
Serial.println("CAN init!");
while (CAN_OK != CAN.begin(CAN_500KBPS, MCP_16MHz)) // init can bus : baudrate = 500k
{
Serial.println("CAN BUS Shield init fail");
Serial.println(" Init CAN BUS Shield again");
delay(100);
}
Serial.println("CAN BUS Shield init ok!");
/*
set mask, set filter
*/
CAN.init_Mask(0, 0, 0x7FF); // there are 2 mask in mcp2515, you need to set both of them
CAN.init_Mask(1, 0, 0x7FF);
CAN.init_Filt(0, 0, 0x242); // there are 6 filter in mcp2515
// CAN.init_Filt(1, 0, 0x668); // there are 6 filter in mcp2515
sei();//allow interrupts
}
steht sie das Ergebnis dann aus wie in der Logdatei im Anhang).
Bei Timestamp 22:58:49:1456 (Logdatei im Anhang) wird der Reset Knopf gedrückt, während des Hauptinits ist der Bus beschädigt
"Tx 1 0x84C001 x 0 " ist im Log schlecht dargestellt, das Message Window vom Busmaster zeigt in ROT Busfehler!
Danach sieht man wie der Arduino durch den CanError 5 in der Loop() immer wieder neu das Init vom MCP macht und dabei dann ständig kurz den Bus unterbricht.
KA ob man vielleicht den CAN-Transreceiver vor dem Init in den Sleep setzten kann damit der Bus nicht beschädigt wird. Normal ist das eigentlich nicht das beim Init der Bus beschädigt wird, ich habe das Problem jedenfalls mit anderen MC's noch nie gehabt.
Das wir uns richtig verstehen, wenn ich den CAN-Bus erst kurz nach dem Arduino Reset starte läuft alles sauber, keine Bus Störungen kein CAN-Error mehr!
Kleines Update, ich konnte das Problem umgehen indem ich den RS-Pin( 8 ) vom Transciever auf das UNO Board geroutet habe. Jetzt setzte ich den Transceiver vor dem Init auf LOW und erst wenn alle Filter gesetzt sind wieder auf HIGH.
Dann läuft nach dem Reset alles Sauber wie es soll!