פרוטוקול I2C
תוכן עניינים
מדריך למידה הסבר מפורט על הפרוטוקול I2C העובד במיקרו-בקר ארדואינו אונו, במדריך שלפניכם ניתן למצוא פירוט בשפה פשוטה:
1. מהו?
2. עיקרון פעולה.
3. שימושים שניתן לעשות איתו בלוח ארדואינו.
4. באיזה רגלים עובד הפרוטוקול וכו'
הפוסט מומלץ לכל תלמיד, סטודנט, מורה או מרצה בתחום ה- Arduino ובתחום הנחיית הפרויקטים.
הקדמה
פרוטוקול I2C הוא שיטת תקשורת סריאלית נפוצה בין התקני אלקטרוניקה וחיישנים. הוא מאפשר העברת נתונים בין מספר התקנים, כאשר יתרונו הגדול הוא שהוא דורש רק שני חוטים לתקשורת – החוט לאותות השעון והחוט לאות הנתונים.
בפוסט זה נסביר מהי בדיוק תקשורת I2C וכיצד היא עובדת – נסקור את מבנה הפרוטוקול, את הגורמים המשפיעים על ביצועי התקשורת, נבין איך פועלים הכתובות בפרוטוקול ואיך אפשר לשדר ולקבל נתונים הדדית בין התקנים.
בסיום תבין את עקרונות הפעולה של אחד הפרוטוקולים החשובים והנפוצים באלקטרוניקה המודרנית, הכל בשפה פשוטה וברורה.
מהו הפרוטוקול I2C
פרוטוקול I2C (אי-שתיים-סי) הוא שיטה סריאלית להעברת נתונים בין התקנים, שפותחה על ידי חברת פיליפס בשנות ה-80.
בניגוד לתקשורת UART שדורשת שני חוטי תקשורת לכל כיוון, ב-I2C יש רק שני חוטים משותפים לשני הכיוונים – SDA לנתונים ו-SCL לאות שעון. שני חוטים אלו מחוברים לכל ההתקנים בטופולוגיית "אוטובוס".
כל התקן ברשת I2C מזוהה בכתובת ייחודית. כאשר מתקן אחד רוצה לתקשר, הוא שולח הודעה עם הכתובת של המתקן היעד. רק המתקן עם אותה כתובת "ירים את השפופרת".
העברת הנתונים עצמם נעשית לפי עקרון מאסטר/עבד המתקן המאסטר (לרוב מעבד) מפעיל את אות השעון ושולט מתי לשדר ומתי לקבל נתונים, ואילו המתקנים המשניים הם עבדים פסיביים.
ב-I2C כל ביט נשלח ברצף אחרי הביט הקודם, והוא תקף כל עוד אות השעון SCL גבוה. רדת SCL מהווה איתות לביט חדש.
יתרונותיו הגדולים של פרוטוקול I2C הן הפשטות וחיסכון בכמות החיווט – רק שני חוטים לתקשורת, ניתן לחבר עשרות מתקני קצה, וקל יחסית ליישם במיקרו-בקרים.
לכן זהו פרוטוקול נפוץ לתקשורת עם אלקטרוניקה כמו חיישנים, מסכי LCD גרפיים, זיכרונות וכד'.
מאפיינים פרוטוקול I2C
☸ תקשורת סידרתית (סריאלית) – המידע מועבר בטור, ביט אחר ביט, על גבי קו הנתונים SDA
☸ סינכרונית – אות השעון SCL מסנכרן בין כל המכשירים
☸ תקשורת דו כיוונית בין מאסטר למספר סלייבים
☸ שני קווי תקשורת משותפים לכל המכשירים – SDA ו-SCL
☸ קצב תקשורת גבוה יחסית – עד 5 מגה ואף יותר
☸ כתובות מוגדרות מראש לכל מתקן (7/10 ביט כתובת)
☸ ממשק חומרה פשוט וסטנדרטי
☸ מתאים במיוחד לתקשורת בין מעבד להתקני קצה כגון חיישנים, מסכים, זיכרונות
☸ מצמצם מאוד בכמות החיווט לעומת UART
מבנה חבילת (מסגרת) נתונים בתקשורת טורית
כאשר מתקן מאסטר (כמו מיקרו-בקר) מעוניין לשדר נתונים למתקן סלייב, הוא בונה את החבילה במבנה מוגדר הכולל מספר שדות:
התחלת העברה (START) – ירידה באות SDA מ-'1' לוגי ל-'0' לוגי בעוד SCL נשמר גבוה, מה שמהווה "איתות התחלה".
כתובת סלייב – 7 או 10 ביטים עם הכתובת הייחודית של מתקן הסלייב היעד. רק אותו מתקן "ירים את השפופרת".
נתונים – המידע עצמו כסדרת ביטים הנשלחים על ידי המאסטר או התקבלים ממתקן הסלייב.
אישור (ACK) – 9 פעימות שעון שבהן הסלייב מאשר קבלה תקינה ע"י העברת 0 בקו SDA.
סיום העברה (STOP) – עלייה באות SDA מ-'0' ל-'1' לוגי בעוד SCL נשמר גבוה, מה שמהווה "איתות סיום".
לדוגמה
שליחת הבייט 0x2F (מספר 47 עשרוני) למתקן בכתובת 0x38 תיראה כך:
START → 0111000 (0x38 כתובת) → **00101111 **→ ACK → STOP
START – מצביע על תחילת העברה חדשה. נוצר ע"י ירידה של קו הנתונים SDA מ-1 ל-0 בעוד קו השעון SCL נשאר גבוה.
0111000 – 7 הביטים הבאים מייצגים את כתובת הסלייב (במקרה זה 0x38 או 56 עשרוני). הם נשלחים מהביט הנמוך (LSB) לביט הגבוה יותר (MSB).
00101111 – 8 הביטים הבאים מייצגים את הנתונים שאנחנו שולחים לסלייב (במקרה זה 47 עשרוני או 0x2F). שוב מ-LSB ל-MSB.
ACK – לאחר הנתונים, הסלייב חייב לשלוח ביט "אישור" אחד חזרה למאסטר כדי לאשר שקלט את הנתונים כראוי.
STOP – סיום תנועת ה-I2C נעשה ע"י העלאת SDA חזרה ל-1 בעוד SCL גבוה.
בחבילת נתונים של פרוטוקול I2C ישנה אפשרות לשלוח מסגרת נתונים אחת או מספר מסגרות נתונים ברצף באותה חבילה. מסגרת נתונים אחת מכילה את כמות המידע שאנחנו רוצים לשלוח באותו רגע. הפרוטוקול מאפשר לנו לשלב מספר מסגרות נתונים ברצף בתוך אותה חבילה, ללא צורך לשלוח חבילה חדשה עבור כל מסגרת. זאת על ידי שליחת אישור (ACK) מהמתקן המקבל בין מסגרת למסגרת. כך ניתן לשלוח ביעילות נתונים ארוכים יותר באותה חבילה I2C.
יתרונות מרכזיים של פרוטוקול התקשורת I2C
☸ חסכוני בכמות החיווט – משתמש רק בשני קווי תקשורת משותפים לכל ההתקנים – קו SDA לנתונים וקו SCL לאות השעון.
☸ תקשורת דו-כיוונית – מאפשר הן למאסטר לשלוח נתונים והן לסלייבים להחזיר נתונים.
☸ פשוט לחיבור התקני קצה רבים – ניתן לחבר עשרות התקנים שונים על אותה רשת I2C.
☸ ממשק תקשורת פשוט וסטנדרטי – קל למימוש חומרה ותוכנה מצד המפתחים.
☸ מהירות תקשורת גבוהה – עד 5MHz, מתאים להעברת נתוני חיישנים, שליטה ועוד.
☸ אמינות גבוהה – שימוש בACK ומנגנוני זיהוי שגיאות.
☸ כתובות מוגדרות מראש – מאפשר תקשורת מכוונת בין התקני הרשת.
כמות רכיבים שניתן לחבר לפרוטוקול
בפרוטוקול I2C ניתן לחבר מספר רב של רכיבים, אך יש מגבלה על הכמות המקסימלית – עד 128 רכיבי קצה (סלייבים) ניתן לחבר לכל רשת I2C. הסיבה למגבלה זו היא שיש 7 ביטים זמינים לכתובת הרכיב בפרוטוקול, מה שמאפשר טווח כתובות מ-0 עד 127. כמות זו של 128 רכיבים נחשבת גבוהה יחסית ומספיקה לרוב המערכות והיישומים הנפוצים.
ניתן גם להשתמש בכתובות עם 10 ביטים, מה שמרחיב את הטווח ל-1024 כתובות ורכיבים. אך המימוש מורכב יותר ולא נפוץ.
מלבד מגבלת הכתובות, ישנו גם קצב הנתונים המקסימלי שהפרוטוקול יכול להעביר. אך בפועל, עד 128 רכיבים נחשב לכמות גדולה ומספיקה ברוב המקרים של מערכות מבוססות I2C.
הסבר כיצד הפרוטוקול I2C עובד
☸ רגל SDA – האחראית על שליחת וקבלת המידע מהחיישנים
☸ רגל SCL – האחראית על אות השעון – על מנת שתהיה תקשורת סינכרונית מתי כל חיישן מדבר ולאורך כמה זמן.
הארדואינו הוא "המסטאר" – המנהל וכל שאר החיישנים שמחוברים לפרוטוקול הם "עבדים" הארדואינו מחליט באמצעות הפרוטוקול מתי לאפשר לכל אחד מהחיישנים אפשרות לדבר, כל חיישן מקבל כתובת ייחודית משלו, לדוגמא
☸ תצוגת LCD I2C 2X16 עובדת בכתובת 0x27
☸ חיישן טמפרטורה LM75 עובד בכתובת 0x07
וכך המסטאר יודע להבדיל בין כל רכיב ורכיב ונותן לו את הזמן שלו להעביר ולקבל מידע מהארדואינו. כפי שכתבנו בפוסט, באמצעות הפרוטוקול ניתן לחבר עד 0xff חיישנים המשמעות היא עד 128 חיישנים שונים ל2 הרגלים A4, A5