3.23. יסודות I2C¶
I2C (Inter-Integrated Circuit, מבוטא ”I-squared-C“ או ”I-two-C“) הוא אפיק טורי דו-חוטי המיועד לקישורים לטווח קצר בין שבבים על אותו לוח. הוא ממוקם בין SPI ל-UART מבחינת עדיפויות: איטי יותר מ-SPI אך חסכוני יותר בפינים, וממוען (מספר התקנים על אותם שני חוטים) במקום ש-SPI זקוק לקו CS ייעודי לכל התקן.
I2C הוא האפיק המועדף עבור חיישנים בקצב נמוך – מד תאוצה, חיישני טמפרטורה, חיישני לחות, מגנטומטרים, שעוני זמן אמת, EEPROM-ים – כאשר חיסכון בפינים ובמורכבות האפיק חשוב יותר מתפוקה גולמית.
3.23.1. שני חוטים, שניהם open-drain¶
לאפיק I2C יש רק שני אותות:
SCL (שעון טורי). מונהג על ידי הבקר (רוב הזמן).
SDA (נתונים טוריים). מונהג על ידי כל התקן שמדבר כרגע – הבקר במהלך המען והנתונים היוצאים, ההתקן ההיקפי במהלך קריאות וביטי ACK.
שני הקווים הם open-drain: כל התקן על האפיק יכול למשוך את הקו אל ההארקה אך לעולם אינו מנהיג אותו למצב גבוה. שני נגדי pull-up על האפיק (בדרך כלל 2.2 kΩ עד 10 kΩ אל פס המתח) מושכים את הקווים למצב גבוה כשאיש אינו מושך אותם למצב נמוך. התנהגות ה-wired-OR נובעת מכך – כל התקן שמושך את הקו למצב נמוך מנצח, והמצב הגבוה הוא פשוט ”אף אחד אינו מדבר“.
נגדי ה-pull-up הפנימיים של ה-MCU על פיני ה-SCL וה-SDA שלו אינם בדרך כלל חזקים מספיק כדי לשמש כנגדי ה-pull-up של האפיק בעצמם; בדרך כלל נדרשים נגדים חיצוניים על האפיק. לוחות פריצה רבים של חיישנים כוללים אותם כבר; בדקו את גיליון הנתונים לפני שמוסיפים עוד.
3.23.2. הטרנזקציה¶
כל טרנזקציית I2C עוקבת אחר אותה צורה:
טרנזקציית I2C: START, מען בן 7 ביטים + R/W, ACK, register, ACK, נתונים, NACK, STOP.¶
ההחלפה נפרשת ביט אחר ביט:
START. הבקר מושך את SDA למצב נמוך בעוד SCL עדיין גבוה. קצה לא שגרתי זה מודיע לכל התקן על האפיק שטרנזקציה עומדת להתחיל.
מען + R/W. הבקר מתזמן החוצה מען היקפי בן 7 ביטים ואחריו ביט קריאה/כתיבה אחד (
0לכתיבה,1לקריאה).ACK / NACK. לאחר כל בית, המקלט מנהיג את SDA למשך שעון אחד כדי לבצע ACK (נמוך) או NACK (גבוה). בבית המען ההתקן ההיקפי מאשר (ACK) אם הוא מזהה את המען שלו; אם אף התקן אינו מאשר, הבקר רואה NACK ויודע שהמען אינו על האפיק.
בתי נתונים. אחרי כל אחד מהם מגיע ACK מהמקלט. בכתיבה, ההתקן ההיקפי מאשר כל בית; בקריאה, הבקר מאשר כל בית שהוא רוצה עוד ממנו ומבצע NACK על הבית האחרון כדי לומר להתקן ההיקפי לעצור.
STOP. הבקר משחרר את SDA למצב גבוה בעוד SCL גבוה, ומסיים את הטרנזקציה.
repeated start הוא START שני שמונפק ללא STOP ביניהם – הבקר מחליף כיוון (מען כתיבה, ואז מען קריאה) על אותו התקן היקפי מבלי לוותר על האפיק.
3.23.3. מיעון¶
מרחב המען בן 7 הביטים מכסה 0x08 – 0x77; הערכים בקצוות שמורים למטרות מיוחדות. המען של כל התקן נקבע על ידי מתכנן השבב; חלקים רבים מאפשרים לשנות כמה מהביטים הנמוכים ברמת הלוח (על ידי קשירת פין למצב גבוה או נמוך) כך ששני חיישנים זהים יכולים לשבת על אותו אפיק.
אם שני התקנים חולקים מען, אין דרך לדבר עם אחד מהם מבלי שהאחר יפריע, אז בדקו את גיליון הנתונים לפני זיווג חלקים. i2c.scan() (מתואר ב-I2C בקוד) עובר על מרחב המען ומדווח אילו מענים מגיבים, וזו הדרך הסטנדרטית לגלות מה נמצא על האפיק.
3.23.4. חוזקות וחולשות¶
החוזקות והחולשות של האפיק קובעות את הנישה שלו:
שני פינים עבור התקנים רבים. זוג SCL/SDA יחיד יכול לשאת תריסר חיישנים. SPI היה זקוק לפין CS נוסף לכל התקן.
מהירויות סטנדרטיות.
100 kHz(”standard mode“) ו-400 kHz(”fast mode“) מכסים כמעט כל חיישן.1 MHzבר-השגה אך מתחיל לדרוש יותר מקיבוליות האפיק וממידות ה-pull-up.איטי יחסית ל-SPI. כל דבר שמעביר יותר מכמה מאות קילו-ביטים בשנייה ירצה במקום זאת SPI.
התנגשויות מען. שני התקנים עם אותו מען על אפיק אחד הם טעות חומרה שהפרוטוקול אינו יכול לעקוף.