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 ถึง 10 ไปยังรางจ่าย) จะดึงสายสูงขึ้นเมื่อไม่มีใครดึงลง พฤติกรรม wired-OR เกิดขึ้นจากนี้ -- อุปกรณ์ใดก็ตามที่ดึงสายต่ำจะชนะ และสถานะสูงเป็นเพียง "ไม่มีใครกำลังสื่อสาร"

pull-up ภายในของ MCU บนพิน SCL และ SDA มักจะ ไม่ แข็งแรงพอที่จะทำหน้าที่เป็น pull-up ของบัสเพียงอย่างเดียว โดยปกติต้องใช้ตัวต้านทานภายนอกบนบัส บอร์ด breakout ของเซนเซอร์หลายตัวรวมไว้แล้ว ตรวจสอบ data sheet ก่อนเพิ่มเติม

3.23.2. การทำธุรกรรม

ทุกธุรกรรม I2C ตามรูปแบบเดียวกัน:

SCL and SDA traces. SDA falls while SCL is high (START), then SCL clocks bytes on SDA -- a 7-bit address byte with a read/write bit and an ACK, then a register byte and an ACK, then a data byte and a NACK, then SDA rises while SCL is high (STOP).

ธุรกรรม 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 แทน

  • ความขัดแย้งของที่อยู่ อุปกรณ์สองตัวที่มีที่อยู่เดียวกันบนบัสเดียวเป็นความผิดพลาดของฮาร์ดแวร์ที่โปรโตคอลไม่สามารถแก้ไขได้