Visual walkthrough — CAN bus — frame format, arbitration, error handling — critical in aerospace
5.5.6 · D2· Coding › Embedded Systems & Real-Time Software › CAN bus — frame format, arbitration, error handling — critic
Neeche jo bhi hai woh wire ke baare mein ek physical fact pe tika hua hai. Hum wahan se shuru karte hain, yeh maanke ke tumhe CAN ke baare mein kuch nahi pata.
Step 1 — Ek wire, ek rule: the wired-AND
KYA. CAN bus pe har node ek hi pair of wires se connected hota hai. Jab koi node bit bhejna chahta hai, toh woh ya toh wire ko neeche pull karta hai (0 bhejta hai) ya usse float hone deta hai (1 bhejta hai). Wire khud ek rule follow karta hai: woh high (1) tab hi hota hai jab har node usse float karne de; jaise hi koi bhi node neeche pull kare, poori wire 0 read karne lagti hai.
YEH rule kyun, koi aur kyun nahi. Yeh bilkul wahi behaviour hai jo ek logical AND gate ka hota hai: output 1 tabhi hota hai jab saare inputs 1 hon. Dekho Open-collector buses aur Wired-AND logic — electronics literally outputs ko wire karke jodhti hai taaki pull-down jeet sake. Hum 0 ko dominant bit kehte hain (yeh dominate karta hai) aur 1 ko recessive bit (yeh yield karta hai).
PICTURE. Neeche, teen nodes ek wire ko feed kar rahe hain. Upar waali row mein saare 1 bhejte hain → bus 1 pe float karta hai. Neeche waali row mein ek node 0 pull karta hai → poora bus 0 pe collapse ho jaata hai. Woh akela amber node bina kisi se pooche wire "jeet" leta hai.

Step 2 — Har node khud ko sunता hai
KYA. Ek CAN node sirf bit bhejta nahi — usi bit-time mein woh bus ko wapas bhi read karta hai aur compare karta hai. Do outcomes possible hain:
- Maine
0(dominant) bheja. Bus0hai. ✅ Match — kuch surprising nahi. - Maine
1(recessive) bheja lekin bus0read ho raha hai. ❗ Mismatch — kissi aur ne isko neeche pull kiya hai.
YEH kyun matter karta hai. Woh mismatch hi ek node ke liye kaafi signal hai. Iska matlab hai: "koi doosra node, mere saath saath transmit karte hue, yahan pe ek dominant bit bheja." Yeh batane ke liye koi message exchange nahi hua — usne yeh physics se deduce kiya.
PICTURE. Node ka transceiver ek fork ki tarah draw hai: ek prong bhejta hai, ek prong sense karta hai. Jab "sent" aur "sensed" agree nahi karte, amber alarm fire ho jaata hai.

Step 3 — Pehle ID bhejo, most-significant bit pehle
KYA. Start-of-Frame bit ke baad, har competing node apna Identifier (ID) transmit karta hai, bit by bit, most significant bit (MSB) se shuru karke. ID ek 11-bit number hota hai (standard CAN).
MSB-first kyun. Numbers upar se neeche compare hote hain: 176 vs 184 pehle ek high digit mein differ karte hain, low mein nahi. MSB-first bhejna matlab hai ki jis pehle bit pe do IDs differ karte hain woh sabse significant jagah bhi hai jahan woh differ karte hain — isliye numerically chhota ID apna advantage jitna jaldi ho sake reveal kar deta hai.
PICTURE. Do IDs bit rows ki tarah laid out hain, MSB baayein, ek arrow transmission time ko left→right dikhata hua.

Step 4 — Khel khelte hain: do nodes race karte hain, bit by bit
KYA. Maano Node A ID 0b000 1011 0000 (= 176) bhejta hai aur Node B ID 0b000 1011 1000 (= 184) bhejta hai. Dono saath shuru karte hain. Har bit-time pe bus AND dikhata hai, aur har node Step 2 ki apni back-off condition check karta hai.
| bit | A bhejta hai | B bhejta hai | bus | kaun naakhush hai? |
|---|---|---|---|---|
| 10…4 | identical | identical | same | koi nahi — perfect tie |
| 3 | 0 | 1 | 0 | B ne 1 bheja, 0 read kiya → B backs off |
| 2…0 | A akela | (silent) | A ke bits | A saaf finish karta hai |
YEH kyun poora game hai. Bit 3 tak dono IDs agree karte hain, isliye bus wahi dikhata hai jo dono ne bheja — kisi ko ladaai ka pata nahi chalta. Bit 3 pe pehli baar difference aata hai: A dominant 0 drive karta hai, B recessive 1 drive karta hai. Wired-AND → 0. A ko 0 dikhta hai = jo usne bheja ✅. B ko 0 dikhta hai ≠ uska 1 ❗ → B khamoshi se withdraw kar leta hai aur baad mein poora frame retry karega. Kyunki A ne kabhi koi mismatch read nahi kiya, A ka frame kabhi disturb nahi hua — woh bas chalata rehta hai.
PICTURE. Dono bit-streams ek doosre ke upar, neeche bus row, aur bit 3 pe ek bada amber marker jahan B drop out karta hai.

Step 5 — "Lowest ID = highest priority" free mein kyun mil jaata hai
KYA. Humne koi priority rule nahi likha. Priority wired-AND aur MSB-first sending ka ek consequence hai.
KYU. Jab bhi do IDs pehli baar differ karte hain, jiske paas 0 (dominant) hai woh survive karta hai aur jiske paas 1 (recessive) hai woh back off karta hai. High bit position mein 0 exactly wahi hai jo binary number ko chhota banata hai (Step 3). Isliye:
Har link padho: chhota number apni high positions mein dominant 0s rakhta hai; dominant bits wired-AND jeette hain; wired-AND jeetna matlab hai kabhi mismatch read na karna; kabhi mismatch read na karna matlab hai bus apne paas rakhna. Isliye apne engine-fire alarm ko ID 0x001 assign karo, 0x7FF kabhi nahi.
PICTURE. IDs ka ek ruler 0x000 (upar, highest priority) se 0x7FF (neeche, lowest priority) tak, fire alarm upar ke paas aur cabin-light status neeche ke paas.

Step 6 — Edge case: identical IDs (degenerate race)
KYA. Agar do nodes ek hi waqt same ID transmit karein? Toh arbitration ke dauran koi bhi bit kabhi mismatch nahi karta — dono poore ID ke through race mein bane rehte hain.
YEH kyun break nahi hota. CAN ka rule hai ki ek ID network-wide sirf ek hi node transmit kare (har message ID ka ek hi producer hota hai). Agar do nodes sach mein identical ID aur identical data bhejein, toh bus AND dono ke liye identical hoga — woh harmlessly coexist karte hain aur dono "jeet" jaate hain, same bits bhejte hue. Agar woh same ID lekin alag data bhejein, toh arbitration ke through tie rehta hai, lekin pehle differing data bit pe ek node mismatch read karta hai — aur ab woh arbitration ke baad hai, isliye yeh ek real bit error count hota hai (Step 7), graceful back-off nahi. Seekh: unique IDs per sender ek design requirement hai (dekho ARINC 825 ki aerospace unhe kaise allocate karta hai).
PICTURE. Do identical bit-rows ek bus row produce karte hain jo dono ke identical hai — ID region mein kahin koi amber marker nahi — aur jahan data shuru hota hai wahan ek warning tag.

Step 7 — Edge case: haarne wale ko punish nahi karna chahiye
KYA. Arbitration ke dauran back off karna normal hai, koi error nahi. Isliye bit-mismatch check (Step 2) arbitration field aur ACK slot ke dauran disabled rehti hai. Wahan recessive-sent / dominant-read ka matlab hai "mein haara / kisine ACK kiya," kabhi "fault" nahi.
KYU. Agar arbitration haarna kisi node ka error counter increment karta, toh busy bus pe low-priority node "errors" ikattha karta sirf polite hone ke liye, aur end mein khud ko silence kar leta. Yeh catastrophic hota. Isliye CRC cyclic redundancy check aur fault-confinement counters (TEC/REC) sirf un bits ko judge karte hain jo arbitration aur ACK ke baahir hain. Jo node genuine bit errors karta hai usse +8 milta hai; jo node sirf errors witness karta hai usse +1 milta hai; success −1 se heal karta hai — yahi asymmetry hai jo ek tuta hua transmitter khud ko bench karvaa deta hai is se pehle ki woh kisi certified system ko jam kar sake.
PICTURE. Ek frame ki timeline jisme do shaded "no-fault zones" hain (arbitration + ACK) jahan mismatches expected hain, aur CRC-guarded zone jahan unhe punish kiya jaata hai.

Ek-picture summary
KYA. Ek diagram poori chain compress karta hai: wired-AND → self-listening → MSB-first ID race → sabse chhota ID survive karta hai → non-destructive win.

Recall Feynman: apne simple words mein bolo
Ek wire imagine karo ek ajeeb rule ke saath: agar koi bhi apna button dabaye, wire 0 kehti hai; sirf jab koi nahi dabata tabhi woh 1 kehti hai. Har node baat karte hue wire ko bhi dekhta hai. Ab sab ek saath apna secret number chillate hain, sabse bada digit pehle. Jab tak sabka digit match karta hai, kisi ko ladaai ka pata nahi chalta. Pehli baar jab tumhara digit 1 ho lekin wire 0 dikhaye, tum jaante ho ki koi chhote number wala yahan hai — isliye tum chup ho jaate ho aur baad mein try karte ho, tumhara message bilkul sahi baka rehta hai. Kyunki aage 0 hona exactly wahi hai jo number ko chhota banata hai, sabse chhota number hamesha jeetta hai aur apna poora sentence saaf finish karta hai. Is shouting match ke dauran hum kissi ke back-off ko galati nahi maante — chhod dena polite hai, galat nahi. Sirf numbers decide hone ke baad hum real errors check karna shuru karte hain. Yahi hai CAN arbitration: koi boss nahi, koi collision nahi, koi lost words nahi — sirf ek wire, ek AND gate, aur bahut saari good manners.