3.25. יסודות אפיק CAN

אפיק CAN (Controller Area Network) תוכנן במקור על ידי Bosch בשנות ה-80 כדי לחבר את כל יחידות הבקרה האלקטרוניות במכונית לאפיק משותף קצר אחד. הוא עדיין שולט בצרור החיווט של המכונית, אך אותה עמידות, התנהגות בזמן אמת ותכנון מרובה-מאסטרים הופכים אותו לאפיק השדה המוגדר כברירת מחדל באוטומציה, רובוטיקה, ציוד חקלאי וציוד תעשייתי מכל סוג.

ל-CAN אין ”בקר“ יחיד וקבוצה של ”התקנים היקפיים“ כפי שיש ל-SPI ול-I2C. כל צומת על האפיק הוא עמית, וכל צומת יכול לשדר בכל פעם שהאפיק פנוי. מה שמאפשר את ההתרחבות הזו הוא תכנון השידור-עם-בוררות של האפיק.

3.25.1. שידור עם בוררות לפי עדיפות

כל הודעה על אפיק CAN נושאת מזהה – 11 ביטים עבור הפריים הסטנדרטי הקלאסי, 29 ביטים עבור הגרסה המורחבת. המזהה אינו כתובת; הוא מתייג על מה ההודעה מדברת (סל“ד של מנוע, מצב דוושת הבלם, מתח סוללה וכו«). כאשר צומת רוצה לשלוח ערך הוא משדר אותו מתויג במזהה המתאים, וכל צומת על האפיק רואה את השידור. כל מקלט מסנן את האפיק בחומרה כדי לבחור רק את המזהים שמעניינים אותו.

אם שני צמתים מנסים לשדר באותו זמן, התכנון החשמלי של האפיק מאפשר להודעה בעלת המזהה המספרי הנמוך יותר לנצח מבלי לאבד אף ביט.

הטריק הוא שני המצבים החשמליים של האפיק: דומיננטי (לוגית 0) ורצסיבי (לוגית 1). חוטי ה-CAN מוחזקים גבוה (רצסיבי) על ידי נגדי סיום כשאף צומת אינו מדבר; כל צומת יכול למשוך את החוטים מטה (דומיננטי) על ידי הזרמת זרם דרך המשדר-מקלט שלו. התוצאה היא wired-AND: אם צומת בודד כלשהו מניע את האפיק לדומיננטי, הקו נקרא כדומיננטי, והוא נקרא כרצסיבי רק כאשר כל צומת שחרר אותו. דומיננטי תמיד מנצח. (מקורות מסוימים מכנים את אותו ההסדר wired-OR, ומתייחסים ל“דומיננטי“ כאות המופעל ולא כ-AND של ביטים רצסיביים – ההתנהגות הפיזית זהה בכל מקרה.)

A single bus line held high by a termination resistor to Vcc. Three nodes (A, B, C) hang off the bus. Each node's output stage is a diode in series with a switch to ground -- the diode points from the bus down to the switch, so closing the switch pulls the bus low through the diode but no node can drive the bus high.

ה-wired-AND בצורתו הרעיונית. CAN אמיתי מריץ את אותה לוגיקה על זוג דיפרנציאלי (CAN_H / CAN_L) כאשר המשדרים-מקלטים ונגדי הסיום מחולקים בין שני החוטים, אך הכלל על האפיק זהה: כל צומת יכול למשוך לדומיננטי, ורק כאשר כל צומת שחרר הוא נקרא כרצסיבי.

הבוררות משתמשת באי-סימטריה זו ישירות. כל צומת משדר שולח את המזהה שלו ביט אחד בכל פעם, החל מה-MSB, וצופה באפיק תוך כדי שהוא משדר. צומת ששם ביט רצסיבי על החוט אך קורא בחזרה דומיננטי יודע שצומת אחר עם מזהה נמוך יותר משדר באותו רגע וזכה בעמדת הביט הזו. הוא מפסיק להניע את האפיק מיד ומאזין. הצומת המנצח, בינתיים, רואה את הביטים שלו יוצאים ללא שינוי – מנקודת מבטו לא קרה דבר חריג. המזהה בעל המספר הנמוך מנצח מכיוון שהביטים הדומיננטיים שלו דורסים את הביטים הרצסיביים שהמזהים בעלי המספר הגבוה יותר היו שולחים אחרת באותן עמדות.

המפסיד אז ממתין שהאפיק יתפנה ומנסה שוב באופן אוטומטי. אין התנגשויות, אין הודעות אבודות – רק סידור עדיפויות דטרמיניסטי.

זהו סגנון הפרסום/הרשמה (publish/subscribe) שגורם ל-CAN לעבוד בקנה מידה גדול: כל אחד יכול לדבר, כל אחד יכול להאזין, והמזהים הופכים את הניתוב למובלע.

3.25.2. האפיק הפיזי

בקר ה-CAN של המיקרו-בקר אינו מניע את האפיק ישירות. הוא חושף רק שני פיני CMOS של 3.3 V – TX (הביט שהוא רוצה לשלוח) ו-RX (הביט שהוא רואה על האפיק) – ופינים אלה מגיעים לשבב נפרד הנקרא משדר-מקלט (transceiver) או PHY של CAN. המשדר-מקלט יושב בין הבקר לבין חוטי ה-CAN בפועל; הוא זה שיודע כיצד לדבר עם האפיק.

האפיק עצמו הוא זוג דיפרנציאלי של 5 V:

  • CAN_H – החוט ה“גבוה“ של הזוג.

  • CAN_L – החוט ה“נמוך“.

במצב הרצסיבי שני החוטים יושבים בערך על 2.5 V (נקודת האמצע של אספקת 5 V של האפיק). במצב הדומיננטי המשדר-מקלט מושך את CAN_H למעלה לכ-3.5 V ואת CAN_L למטה לכ-1.5 V, ומייצר הפרש דיפרנציאלי של כ-2 V על פני הזוג. מקלטים דוגמים את ההפרש בין שני החוטים, מה שהופך את האות לחסין מפני רעש מצב משותף שנקלט לאורך כבלים ארוכים.

התפקיד הדו-כיווני של המשדר-מקלט:

  • בצד ה-TX, הוא קורא את פין ה-TX החד-קצהי של הבקר ב-3.3 V ומניע את CAN_H ו-CAN_L זה מזה לדומיננטי או משחרר את שניהם לרצסיבי.

  • בצד ה-RX, הוא קורא את הזוג הדיפרנציאלי CAN_H / CAN_L ומדווח רמה חד-קצהית של 3.3 V על פין ה-RX שלו בחזרה לבקר.

שני נגדי סיום של 120 אוהם, אחד בכל קצה פיזי של הכבל, מחזיקים את האפיק בנקודת האמצע הרצסיבית כשאף צומת אינו מניע ומדכאים החזרות שאחרת היו משבשות את האות הדיפרנציאלי לאורך כבלים ארוכים.

3.25.3. פריים הנתונים

פריים נתונים סטנדרטי של CAN נראה כך על החוט:

Eight fields drawn in sequence: SOF (1 bit), ID (11 bits), RTR (1 bit), control (6 bits), data (0 -- 8 bytes), CRC (16 bits), ACK (2 bits), and EOF (7 bits).

פריים נתונים סטנדרטי של CAN: השדות SOF, ID, RTR, בקרה, נתונים, CRC, ACK ו-EOF.

לכל שדה תפקיד ספציפי:

  • SOF (תחילת פריים). ביט דומיננטי אחד שאומר שפריים חדש מתחיל ומסנכרן את שעון הביט של כל צומת.

  • ID (מזהה). המזהה בן 11 הביטים שהאפיק מבצע עליו בוררות. מספר נמוך יותר = עדיפות גבוהה יותר.

  • RTR (בקשת שידור מרחוק). מוגדר בבקשה לנתונים ולא במסירה של נתונים; מקלטים עם מזהה תואם מגיבים על ידי שליחת הנתונים בעצמם.

  • בקרה. שדה בן 6 ביטים המקודד את אורך הנתונים (DLC) וכמה ביטי תחזוקה.

  • נתונים. 0 עד 8 בייטים של מטען (CAN Classic; CAN FD מרחיב זאת ל-64 בייטים).

  • CRC. 16 ביטים בסך הכול: CRC בן 15 ביטים על השדות הקודמים בתוספת מפריד CRC בן ביט אחד.

  • ACK. 2 ביטים בסך הכול. בביט הראשון – חריץ ה-ACK – המשדר משחרר את הקו וכל צומת שקיבל את הפריים כראוי מושך אותו נמוך; הביט השני הוא מפריד רצסיבי. היעדר ACK אומר למשדר שאף צומת לא שמע את הפריים ושעליו לנסות שוב.

  • EOF (סוף פריים). שבעה ביטים רצסיביים הסוגרים את הפריים.

כל זה נוצר ומפוענח על ידי בקר ה-CAN בחומרה; התוכנה רואה רק את המזהה, הנתונים וכמה דגלים.

3.25.4. היכן ממוקם CAN

בחירות התכנון של CAN קובעות את הנישה שלו:

  • עמיד. איתות דיפרנציאלי על זוג מפותל, זיהוי שגיאות מובנה, בוררות עדיפות דטרמיניסטית וניסיונות חוזרים אוטומטיים גורמים ל-CAN לשרוד בסביבות רועשות חשמלית שבהן UART ו-SPI היו משבשים נתונים.

  • מרובה-מאסטרים. כל צומת יכול לדבר בכל עת. אין צורך בבקר מרכזי ואף צומת אינו נקודת כשל יחידה.

  • מוגבל ברוחב פס. CAN קלאסי מגיע לתקרה של בערך 1 Mbit/s; CAN FD מרחיב זאת. CAN הוא התשובה הנכונה כאשר הקישור הוא בין לוחות או מודולים, לעתים קרובות לאורך מטרים של כבל, כשהאמינות היא בעדיפות.

  • פרוטוקולים בשכבה גבוהה יותר. אפיק ה-CAN החשוף אינו אומר מה משמעות מזהה או כיצד לפצל הודעה ארוכה לחלקים. פרוטוקולים בשכבת היישום – CANopen, J1939, ISO-TP/UDS, NMEA 2000 – מוסיפים את הכללים הללו מעל. פריט נפרד ששווה להכיר הוא קובץ ה-DBC: פורמט טקסט ייחודי-ליצרן המתעד אילו מזהים נושאים אילו אותות ברמת הביט במרכב או במערכת מסוימים. קובצי DBC הם פורמט מטא-נתונים המתאר את מבנה ההודעות של אפיק אחד, לא פרוטוקול בפני עצמו.

הדרייבר ב-אפיק CAN בקוד מטפל בפריים ה-CAN ברמת החוט; מיפוי מזהים למשמעויות הוא תפקידו של היישום.