Hallo zusammen,
ich wog mich bereits am Ziel meiner Ambitionen, bis zu den ersten, realen Tests...
Per Y-Stecker möchte ich einen KFZ CAN-Bus belauschen, ohne aber aktiv daran teilzunehmen. Ziel ist es später zu bestimmen, weshalb manche Diagnoseadapter mit bestimmten Fahrzeugen nicht kommunizieren. Und woran das evtl. liegt.
Ein ESP32 ist an einen MCP2515 angeschlossen und wird wie folgt initialisiert:
#include <mcp_can.h>
MCP_CAN CAN0(5);
bool CAN_Active = false;
uint8_t CanSpeed = 13; //500KBPS
void InitCan() {
CAN_Active = CAN0.begin(MCP_ANY, CanSpeed, MCP_16MHZ) == CAN_OK;
CAN0.setMode(MCP_LISTENONLY);
}
Es sind absichtlich (erstmal) keine Filter gesetzt und um nicht selbst aktiv am Bus teilzunehmen, nur lesend.
Das ganze funktioniert auch augenscheinlich ganz gut. Ändere ich den CanSpeed auf <250kbps erhalte ich keine Werte mehr. Bei 250 erhalte ich quasi nur einen "Ping" wenn die beiden Hauptgeräte sich initialisieren.
Mit 500kbps erhalte ich laufend Daten.
void ReadCan() {
if (!CAN_Active)
return;
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
char msgString[128]; // Array to store serial string
if (CAN0.readMsgBuf(&rxId, &len, rxBuf) == CAN_NOMSG) // Read data: len = data length, buf = data byte(s)
return;
if(rxId == 0 && len == 0)
return;
// Determine if ID is standard (11 bits) or extended (29 bits)
bool extended = (rxId & 0x80000000) == 0x80000000;
if (extended)
sprintf(msgString, "Extended ID: 0x%.8lX DLC: %1d Data:", (rxId & 0x1FFFFFFF), len);
else
sprintf(msgString, "Standard ID: 0x%.3lX DLC: %1d Data:", rxId, len);
}
Quasi mehr oder weniger Standard-Beispielcode.
Nun schreibe ich alle Daten auf eine SD-Karte und sehe lediglich 4-5 identische Nachrichten, die sich immer wiederholen.
Das Diagnosegerät stellt aber verschiedene, sich ändernde Livedaten dar, liest den Fehlerspeicher aus oder löscht diesen.
| ID | Length | Data | Remote? | Std/Ext | Timestamp |
|---|---|---|---|---|---|
| 548 | 0 | Standard ID | 8099 | ||
| DE4DA494 | 12 | BB 5F 0C A8 3C CD CF 83 08 6D FD 3F | REMOTE REQUEST FRAME | Extended ID | 8115 |
| 9DBFFFFF | 0 | Extended ID | 8131 | ||
| 0000051A | 0 | Standard ID | 8181 | ||
| 4000034D | 13 | 6C 67 60 20 09 9A 5F 00 4C 57 FD 3F 3F | REMOTE REQUEST FRAME | Standard ID | 8205 |
| 0000001D | 0 | Standard ID | 8305 | ||
| 40000524 | 15 | 67 60 20 09 9A 5F 00 FF E8 6D FD 3F 3F 00 3E | REMOTE REQUEST FRAME | Standard ID | 8339 |
| 0000051A | 0 | Standard ID | 8393 | ||
| 4000034D | 13 | 6C 67 60 20 09 9A 5F 00 C4 6F FD 3F 3F | REMOTE REQUEST FRAME | Standard ID | 8417 |
| 0000001D | 0 | Standard ID | 8529 | ||
| 40000524 | 15 | 67 60 20 09 9A 5F 00 FF C4 6F FD 3F 3F 00 3E | REMOTE REQUEST FRAME | Standard ID | 8567 |
| 0000051A | 0 | Standard ID | 8623 | ||
| 4000034D | 13 | 6C 67 60 20 09 9A 5F 00 C4 6F FD 3F 3F | REMOTE REQUEST FRAME | Standard ID | 8651 |
| 0000001D | 0 | Standard ID | 8753 | ||
| 40000524 | 15 | 67 60 20 09 9A 5F 00 FF C4 6F FD 3F 3F 00 3E | REMOTE REQUEST FRAME | Standard ID | 8791 |
Die letzten 4 Nachrichten wiederholen sich nun rund 4.000 mal, ohne dass sich irgendwas am Payload verändert.
Beim nächsten Versuch ein ähnliches, aber nicht gleiches Bild:
| ID | Length | Data | Remote? | Std/Ext | Timestamp |
|---|---|---|---|---|---|
| 484 | 0 | Standard ID | 8201 | ||
| 40000548 | 9 | 44 4A E5 6F 49 2F 60 A7 BC | REMOTE REQUEST FRAME | Standard ID | 8225 |
| 40000494 | 9 | 91 65 F3 37 3C 43 8E 55 C8 | REMOTE REQUEST FRAME | Standard ID | 8249 |
| DE424926 | 12 | 24 27 92 4A E5 43 8E 55 C8 6B FD 3F | REMOTE REQUEST FRAME | Extended ID | 8273 |
| 9DBFFFFF | 0 | Extended ID | 8297 | ||
| 0000051A | 0 | Standard ID | 8355 | ||
| 8349265C | 3 | 6C 67 60 | Extended ID | 8387 | |
| 9FFDFFFF | 0 | Extended ID | 8411 | ||
| 0000001D | 0 | Standard ID | 8514 | ||
| 40000249 | 14 | 67 60 08 00 00 09 00 FF 2C 6D FD 3F 3F 00 | REMOTE REQUEST FRAME | Standard ID | 8569 |
| 0000001D | 0 | Standard ID | 8678 | ||
| 40000249 | 14 | 67 60 08 00 00 09 00 FF 2C 6D FD 3F 3F 00 | REMOTE REQUEST FRAME | Standard ID | 8724 |
| 0000001D | 0 | Standard ID | 8833 | ||
| 40000249 | 14 | 67 60 08 00 00 09 00 FF 2C 6D FD 3F 3F 00 | REMOTE REQUEST FRAME | Standard ID | 8879 |
| 0000001D | 0 | Standard ID | 8988 | ||
| 40000249 | 14 | 67 60 08 00 00 09 00 FF E4 69 FD 3F 3F 00 | REMOTE REQUEST FRAME | Standard ID | 9034 |
Spannend, dass sich bis auf die ID 0x051A & 0x1D, keine Nachrichten ID´s in beiden Tests überschneiden.
Und nichts auf sich ändernde Werte, wie Drehzahl, Gasstellung, etc. hinweist.
Nun zu meinen eigentlichen Fragen:
Hat der MSP2515 standardmäßig Filter gesetzt?
Schreibe ich nur die Daten des Senders (Diagnosegerät) mit und nicht die Antwort vom Empfänger (Fahrzeug)?
Was kann ich tun, damit ich "alles" auf der Leitung mitbekomme?
Bin ich überhaupt auf dem richtigen Wege? ![]()
Über jede Idee bin ich dankbar!