🧬Der CAN-Frame – Bit für Bit
Ein Daten-Frame besteht aus festen Feldern: Start, Identifier, Steuerbits, 0–8 Datenbytes, CRC-15, Bestätigung und Ende. Gib eine ID und Daten ein – die App berechnet den echten Bitstrom mit CRC und Stuff-Bits. Mit ← → gehst du Feld für Feld durch.
🛠️Frame-Editor
✏️ Frame-Editor
- CRC-15
- 0x5649
- Bits ohne Stuffing
- 108
- Stuff-Bits
- 12
- Bits auf der Leitung
- 120
- Dauer @ 500 kbit/s
- 246 µs
- Dauer @ 125 kbit/s
- 984 µs
Dauer inkl. 3 Bit Intermission. CRC über SOF bis Datenfeld (ungestopft), Polynom 0x4599.
Start of Frame
0Ein dominantes Bit – alle Knoten synchronisieren sich auf diese Flanke (rezessiv → dominant).
📟 Oszilloskop: CAN_H / CAN_L
📏Aufbau im Überblick
Standard-Frame (11-Bit-ID, CAN 2.0A) ┌───┬─────────────┬───┬───┬──┬──────┬──────────────┬───────────────┬─┬─┬─┬───────┐ │SOF│ Identifier │RTR│IDE│r0│ DLC │ Daten 0…8 B │ CRC-15 │D│A│D│ EOF │ │ 1 │ 11 │ 1 │ 1 │1 │ 4 │ 0…64 Bit │ 15 │1│1│1│ 7 │ └───┴─────────────┴───┴───┴──┴──────┴──────────────┴───────────────┴─┴─┴─┴───────┘ ◄──────────────────── Bit-Stuffing ────────────────────────────────► feste Form ◄──── Arbitrierung ────► Extended-Frame (29-Bit-ID, CAN 2.0B) SOF │ ID-A 11 │ SRR │ IDE=1 │ ID-B 18 │ RTR │ r1 │ r0 │ DLC │ Daten │ CRC … Ohne Stuffing: 44 Bit Rahmen + 8·n Datenbits → 8 Byte = 108 Bit (+ 3 Bit Pause)
🧷Bit-Stuffing ausprobieren
Warum? Der Bus hat keine eigene Taktleitung. Jede Flanke dient den Empfängern zur Nachsynchronisation – spätestens nach fünf gleichen Bits muss eine kommen. Sechs gleiche Bits in Folge sind deshalb immer ein Fehler (Stuff-Fehler) – genau das nutzen Error Flags (6 dominante Bits) absichtlich aus.
🔐CRC-15 – warum und wie
Die Prüfsumme ist der Rest einer Polynomdivision über GF(2): Die Bits von SOF bis zum letzten Datenbit (ohne Stuff-Bits) werden als Polynom aufgefasst, mit x¹⁵ multipliziert und durch das Generatorpolynom geteilt:
x¹⁵ + x¹⁴ + x¹⁰ + x⁸ + x⁷ + x⁴ + x³ + 1 → 0x4599
Hamming-Distanz 6: Bis zu 5 zufällig verteilte Bitfehler pro Frame werden sicher erkannt, dazu alle Fehlerbündel bis 15 Bit. Der Empfänger rechnet dieselbe CRC und vergleicht – bei Abweichung sendet er ein Error Frame statt eines ACK.
// Schieberegister wie in ISO 11898-1
crc = 0
for bit in bits: // SOF … Datenfeld
next = bit XOR crc[14]
crc = (crc << 1) & 0x7FFF
if next: crc ^= 0x4599
// Prüfwert: CRC-15/CAN("123456789") = 0x059E
// (im Test gegen eine BigInt-Polynomdivision geprüft)