CAN-Bus still mitlesen

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? :sweat_smile:

Über jede Idee bin ich dankbar!

wie genau. Modul? Schaltplan? Echtbild welcher Quartz?

Wobei ich schon Fragen muss, warum du bei einem ESP32 nicht den nativen CAN Bus verwendest und lediglich einen Transmitter anschließt...

1 Like

Weil ich den MCP2515 zur Hand hatte, den Transmitter aber nicht :man_shrugging:t2:

Oh, man! Ob es das schon war?
Auf dem Quarz steht natürlich EAS8.000 drauf! Dann macht sich die copy & paste MCP_16MHZ nicht sonderlich gut :confounded:

Der "Schaltplan" ist denkbar einfach.

GPIO18 - SCL
GPIO19 - MISO
GPIO23 - MOSI
GPIO5 - CS
GND - GND
VIN - VCC

Für ein Bild muss ich aber erstmal alles wieder auseinander nehmen. Steckt geschichtet in einem verschraubten Case...

Versuche es erstmal mit 8MHZ und schaue ob die Ergebnisse besser aussehen :+1:t2:

Ich wundere mich etwas über die Nachrichtenlängen > 8. Die gibt es eigentlich erst mit CAN FD; würde ich an einer Standard OBD-Dose nicht erwarten.

Au Backe!
Es war nun wirklich der falsch konfigurierte Quarz.

Nun machen die Werte Sinn! Alle Nachrichten 8 Bytes lang, keine Remote Frames & unterschiedliche Daten im Inhalt :+1:t2:

Und beinhaltet auf einmal OBD II Daten:

ID Lenght Data Std/Ext Timestamp
000007DF 8 02 01 11 00 00 00 00 00 Standard ID 81466
700000000 8 03 41 11 E3 00 00 00 00 Standard ID 81495
97F00010 8 20 10 00 00 00 00 00 00 Extended ID 81746
000007DF 8 02 01 1C 00 00 00 00 00 Standard ID 81788
700000000 8 03 41 1C 06 00 00 00 00 Standard ID 81816
000007DF 8 02 01 1F 00 00 00 00 00 Standard ID 81856
700000000 8 04 41 1F 00 00 00 00 00 Standard ID 81884
000007DF 8 02 01 21 00 00 00 00 00 Standard ID 81926
700000000 8 04 41 21 00 00 00 00 00 Standard ID 81954
000007DF 8 02 01 23 00 00 00 00 00 Standard ID 81996
700000000 8 04 41 23 00 2D 00 00 00 Standard ID 82024
97F00010 8 20 10 00 00 00 00 00 00 Extended ID 82246
97F00010 8 20 10 00 00 00 00 00 00 Extended ID 82746
000007DF 8 02 01 1C 00 00 00 00 00 Standard ID 82772
700000000 8 03 41 1C 06 00 00 00 00 Standard ID 82800
000007DF 8 02 01 1F 00 00 00 00 00 Standard ID 82836
700000000 8 04 41 1F 00 00 00 00 00 Standard ID 82864
000007DF 8 02 01 21 00 00 00 00 00 Standard ID 82906
700000000 8 04 41 21 00 00 00 00 00 Standard ID 82934
000007DF 8 02 01 23 00 00 00 00 00 Standard ID 82976
700000000 8 04 41 23 00 2D 00 00 00 Standard ID 83004
97F00010 8 20 10 00 00 00 00 00 00 Extended ID 83246
000007DF 8 02 01 1C 00 00 00 00 00 Standard ID 83340
700000000 8 03 41 1C 06 00 00 00 00 Standard ID 83368

Vielen Dank an noiasca für den entscheidenden Tipp!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.