🧬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.

Schritt 1 / 12 · Tasten ← →
SOF

Start of Frame

0

Ein dominantes Bit – alle Knoten synchronisieren sich auf diese Flanke (rezessiv → dominant).

📟 Oszilloskop: CAN_H / CAN_L

IDDLCDatenCRCEOF1,5 V2,5 V3,5 VCAN_HCAN_LU_diff011111001111100001000001000010000010001000011000001000001000001000001000001000001000001000001001010110010010011011111111Bit0 = dominant (≈ 2 V Differenz) · 1 = rezessiv (≈ 0 V) · rot = Stuff-Bit

📏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

Nach fünf gleichen Bits fügt der Sender ein Bit mit dem Gegenwert ein; der Empfänger entfernt es wieder. Das eingefügte Bit zählt für die nächste Folge mit.
Vorher
0000011111000001
Auf der Leitung
0000011111010000011
3 Stuff-Bit(s) eingefügt
Längste gleiche Folge: vorher 5, danach 5
Empfänger entfernt sie wieder: ✅ identisch

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)