3.23. พื้นฐาน I2C¶
I2C (Inter-Integrated Circuit, ออกเสียงว่า "ไอ-สแควร์-ซี" หรือ "ไอ-ทู-ซี") เป็นบัสอนุกรมสองสายที่ออกแบบมาสำหรับการเชื่อมต่อระยะสั้นระหว่างชิปบนบอร์ดเดียวกัน มีตำแหน่งอยู่ระหว่าง SPI และ UART ในด้านลำดับความสำคัญ: ช้ากว่า SPI แต่ประหยัดพินกว่า และมีระบบที่อยู่ (หลายอุปกรณ์บนสายสองเส้นเดียวกัน) ในขณะที่ SPI ต้องการสาย CS เฉพาะต่ออุปกรณ์
I2C คือบัสที่เลือกใช้สำหรับเซนเซอร์อัตราต่ำ -- accelerometer, เซนเซอร์อุณหภูมิ, เซนเซอร์ความชื้น, magnetometer, นาฬิกาเวลาจริง, 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 ของบัสเพียงอย่างเดียว โดยปกติต้องใช้ตัวต้านทานภายนอกบนบัส บอร์ด breakout ของเซนเซอร์หลายตัวรวมไว้แล้ว ตรวจสอบ data sheet ก่อนเพิ่มเติม
3.23.2. การทำธุรกรรม¶
ทุกธุรกรรม I2C ตามรูปแบบเดียวกัน:
ธุรกรรม I2C: START, ที่อยู่ 7 บิต + R/W, ACK, register, ACK, ข้อมูล, NACK, STOP¶
การแลกเปลี่ยนเกิดขึ้นทีละบิต:
START ตัวควบคุมดึง SDA ต่ำขณะที่ SCL ยังสูง ขอบพิเศษนี้บอกอุปกรณ์ทุกตัวบนบัสว่ากำลังจะเริ่มธุรกรรม
ที่อยู่ + R/W ตัวควบคุมส่งนาฬิกาออกเป็นที่อยู่อุปกรณ์ต่อพ่วง 7 บิตตามด้วยบิต read/write หนึ่งบิต (
0สำหรับเขียน1สำหรับอ่าน)ACK / NACK หลังทุก byte ตัว รับ จะขับ SDA เป็นเวลาหนึ่งนาฬิกาเพื่อ ACK (ต่ำ) หรือ NACK (สูง) บนไบต์ที่อยู่ อุปกรณ์ต่อพ่วงจะ ack หากรับรู้ที่อยู่ของตัวเอง ถ้าไม่มีอุปกรณ์ใด ack ตัวควบคุมจะเห็น NACK และทราบว่าที่อยู่นั้นไม่อยู่บนบัส
ไบต์ข้อมูล แต่ละไบต์ตามด้วย ACK จากตัวรับ สำหรับการเขียน อุปกรณ์ต่อพ่วง ack แต่ละ byte; สำหรับการอ่าน ตัวควบคุม ack แต่ละ byte ที่ต้องการเพิ่มเติมและ NACK ไบต์สุดท้ายเพื่อบอกอุปกรณ์ต่อพ่วงให้หยุด
STOP ตัวควบคุมปล่อย SDA สูงขณะที่ SCL สูง จบธุรกรรม
repeated start คือ START ที่สองที่ออกมาโดยไม่มี STOP ระหว่างกัน -- ตัวควบคุมสลับทิศทาง (เขียนที่อยู่ จากนั้นอ่านที่อยู่) บนอุปกรณ์ต่อพ่วงเดิมโดยไม่ปล่อยบัส
3.23.3. การกำหนดที่อยู่¶
พื้นที่ที่อยู่ 7 บิตครอบคลุม 0x08 -- 0x77; ค่าที่ปลายถูกสงวนไว้สำหรับวัตถุประสงค์พิเศษ ที่อยู่ของอุปกรณ์แต่ละตัวถูกกำหนดโดยนักออกแบบชิป ชิ้นส่วนหลายชนิดอนุญาตให้เปลี่ยนบิตล่างไม่กี่บิตที่ระดับบอร์ด (โดยการต่อพินสูงหรือต่ำ) เพื่อให้สองเซนเซอร์เดียวกันอยู่บนบัสเดียวกันได้
หากอุปกรณ์สองตัวใช้ที่อยู่เดียวกัน ไม่มีทางสื่อสารกับตัวใดตัวหนึ่งโดยที่อีกตัวไม่รบกวน ดังนั้นตรวจสอบ data sheet ก่อนจับคู่ชิ้นส่วน i2c.scan() (ครอบคลุมใน I2C ในโค้ด) เดินผ่านพื้นที่ที่อยู่และรายงานที่อยู่ที่ตอบสนอง ซึ่งเป็นวิธีมาตรฐานในการค้นหาสิ่งที่อยู่บนบัส
3.23.4. จุดแข็งและจุดอ่อน¶
จุดแข็งและจุดอ่อนของบัสกำหนดช่องที่ใช้:
สองพินสำหรับอุปกรณ์หลายตัว คู่ SCL/SDA เดียวสามารถรองรับเซนเซอร์หลายสิบตัว SPI ต้องการพิน CS เพิ่มเติมต่ออุปกรณ์
ความเร็วมาตรฐาน
100 kHz("โหมดมาตรฐาน") และ400 kHz("โหมดเร็ว") ครอบคลุมเซนเซอร์เกือบทั้งหมด1 MHzทำได้แต่เริ่มต้องการความจุของบัสและการปรับขนาด pull-up มากขึ้นช้ากว่า SPI อะไรก็ตามที่ย้ายข้อมูลมากกว่าสองสามร้อยกิโลบิตต่อวินาทีต้องการ SPI แทน
ความขัดแย้งของที่อยู่ อุปกรณ์สองตัวที่มีที่อยู่เดียวกันบนบัสเดียวเป็นความผิดพลาดของฮาร์ดแวร์ที่โปรโตคอลไม่สามารถแก้ไขได้