I2C คืออะไร? สรุปครบจบในบทความเดียว จากมือใหม่สู่คนเข้าใจฮาร์ดแวร์
ลองจินตนาการว่าเรากำลังสร้างอุปกรณ์อิเล็กทรอนิกส์ชิ้นหนึ่ง โดยมีไมโครคอนโทรลเลอร์เป็นสมองหลัก และมีเซนเซอร์ จอแสดงผล รวมถึงหน่วยความจำเป็นอุปกรณ์ที่ต้องทำงานร่วมกัน
คำถามคือ เราจะทำให้อุปกรณ์ทั้งหมดสื่อสารกันได้อย่างไร?
เราสามารถเดินสายสัญญาณแยกไปยังอุปกรณ์แต่ละตัวได้ แต่เมื่อจำนวนอุปกรณ์เพิ่มขึ้น จำนวนสายที่ต้องใช้ก็อาจเพิ่มขึ้นตามไปด้วย ส่งผลให้การออกแบบวงจรซับซ้อนและจัดการได้ยากขึ้น
เพื่อให้การสื่อสารระหว่างชิปทำได้สะดวกขึ้น โดยไม่ต้องใช้สายสัญญาณจำนวนมาก จึงมีการพัฒนาโปรโตคอลการสื่อสารที่เรียกว่า I2C (Inter-Integrated Circuit) ซึ่งอ่านได้ว่า “ไอ-ทู-ซี” หรือ “ไอ-สแควร์-ซี” ขึ้นมา
I2C คืออะไร?
เวลาเราต่อวงจรอิเล็กทรอนิกส์ แล้วต้องเชื่อมต่ออุปกรณ์หลายๆ ชิ้นเข้าด้วยกัน เช่น หน้าจอ LCD, โมดูลเวลา Real-time Clock (RTC), หน่วยความจำ EEPROM หรือเซ็นเซอร์วัดอุณหภูมิ ถ้าต้องลากสายไฟแยกหาอุปกรณ์ทุกชิ้น บนบอร์ดทดลองคงเต็มไปด้วยสายไฟที่พันกันยุ่งเหยิง
นั่นคือเหตุผลที่ I2C (Inter-Integrated Circuit) ถูกออกแบบขึ้นมา! มันคือมาตรฐานการสื่อสารแบบอนุกรมยอดนิยม ที่ช่วยให้อุปกรณ์หลักอย่าง Master (เช่น ไมโครคอนโทรลเลอร์ ESP32, STM32 หรือ Arduino) สามารถพูดคุยกับอุปกรณ์บริวารอย่าง Slave ได้พร้อมกันหลายตัว โดยใช้ สายสัญญาณเพียง 2 เส้นเท่านั้น
ทำความรู้จักสายสัญญาณ SDA และ SCL
ด้วยการใช้สายไฟหลักแค่สองเส้น I2C จึงมักถูกเรียกว่าโปรโตคอลการสื่อสารแบบ 2 สาย (Two-wire Protocol) โดยสายแต่ละเส้นมีหน้าที่ชัดเจนดังนี้:
- SDA (Serial Data): สายส่งข้อมูล ทำหน้าที่ขนส่งชุดข้อมูลวิ่งไปมาระหว่าง Master และ Slave
- SCL (Serial Clock): สายสัญญาณนาฬิกาที่ทำหน้าที่กำหนดจังหวะการรับส่งข้อมูลบนบัส I2C เปรียบเสมือนการเคาะจังหวะให้ทุกอุปกรณ์ทำงานสอดคล้องกัน เพื่อให้การส่งและรับข้อมูลเป็นไปอย่างถูกต้องตามจังหวะที่กำหนด

การสื่อสารสองทิศทางแบบสลับกัน (Half-Duplex)
สาย SDA และ SCL เป็นสายสัญญาณแบบ สองทิศทาง (Bidirectional) หมายความว่า สัญญาณข้อมูลสามารถส่งผ่านสายเส้นเดียวกันได้ทั้งสองทิศทาง อย่างไรก็ตาม การสื่อสารผ่าน I2C เป็นแบบ Half-duplex กล่าวคือ สามารถรับส่งข้อมูลได้ครั้งละหนึ่งทิศทางเท่านั้น คล้ายกับการใช้วิทยุสื่อสารที่ผู้พูดต้องผลัดกันส่งข้อความ แทนการส่งและรับข้อมูลพร้อมกัน
โดยทั่วไป Master จะเป็นผู้ควบคุมการสื่อสาร ทำหน้าที่เริ่มต้นการสื่อสาร และระบุว่าจะส่งข้อมูลไปยังอุปกรณ์ Slave หรืออ่านข้อมูลจากอุปกรณ์ Slave ตัวใดในระบบ
Open-Drain และตัวต้านทาน Pull-Up คืออะไร?
ในชั้นฮาร์ดแวร์ (Physical Layer) ขา SDA และ SCL ของอุปกรณ์ I2C จะใช้วงจรแบบ Open-Drain ซึ่งมีลักษณะสำคัญคือ อุปกรณ์สามารถดึงสายสัญญาณลงสู่ระดับ LOW ได้ แต่ไม่สามารถขับสัญญาณขึ้นสู่ระดับ HIGH ได้โดยตรง
แล้วแรงดันระดับ HIGH เกิดขึ้นได้อย่างไร?
คำตอบคือ ต้องอาศัย ตัวต้านทาน Pull-Up (Pull-Up Resistor) ที่เชื่อมต่อสายสัญญาณเข้ากับแรงดันไฟเลี้ยงที่เหมาะสม (VDD) เมื่อตัวอุปกรณ์ทุกตัวหยุดดึงสายลงสู่ระดับ LOW ตัวต้านทาน Pull-Up จะช่วยดึงแรงดันบนสายให้กลับขึ้นสู่ระดับ HIGH
ดังนั้น ตัวต้านทาน Pull-Up จึงเป็นองค์ประกอบสำคัญของบัส I2C ที่ช่วยกำหนดสถานะ HIGH ให้กับสายสัญญาณ เมื่อไม่มีอุปกรณ์ใดดึงสายลงสู่ระดับ LOW

เลือก Pull-Up Resistor อย่างไรให้วงจร I2C สื่อสารได้เสถียร ไม่หลุดบ่อย
แม้จะเข้าใจหลักการทำงานของ Pull-Up Resistor แล้ว แต่การเลือกค่าความต้านทานให้เหมาะสมก็เป็นอีกเรื่องที่ไม่ควรมองข้าม เพราะค่าที่เลือกใช้ส่งผลต่อความเสถียรและความเร็วในการสื่อสารของบัส I2C โดยตรง
แล้วควรเลือกใช้ค่าความต้านทานเท่าไรจึงจะเหมาะสม? มาทำความเข้าใจผลกระทบของค่าความต้านทานต่อคุณสมบัติสำคัญของวงจร I2C ทั้ง 3 ประการกัน
• ระยะเวลาในการไต่ระดับสัญญาณขึ้น (Rise Time): สัญญาณจะเปลี่ยนจาก LOW ไป HIGH ได้ช้าหรือเร็ว (ขึ้นอยู่กับค่าเวลา RC Constant)
• ความเร็วสูงสุดในการส่งข้อมูล (Clock Frequency): จะวิ่งได้ถึง 400 kHz หรือ 1 MHz ไหม ก็ขึ้นอยู่กับจุดนี้
• อัตราการกินพลังงานของระบบ (Power Consumption): ยิ่งดึงแรง ยิ่งกินไฟมาก

ค่าความต้านทาน Pull-Up ที่นิยมใช้: ควรเลือกเท่าไหร่ดี?
โดยปกติแล้ว ค่า Pull-Up ที่นิยมใช้ในวงจร I2C จะอยู่ในช่วง ถึง การเลือกค่าที่เหมาะสมจะขึ้นอยู่กับ ความยาวของสายสัญญาณ (Bus Capacitance), ระดับแรงดันไฟเลี้ยง และ ความเร็วในการรับส่งข้อมูล ที่เราเลือกใช้:
1. ค่าความต้านทานต่ำ หรือเรียกว่า Strong Pull-up (เช่น – )
• ข้อดี: ดึงสัญญาณขึ้นเร็วมาก (Rise time สั้น) สัญญาณคมชัด
• ข้อเสีย: กินกระแสไฟมากกว่า
• เหมาะสำหรับ: สายสัญญาณยาวๆ, มีอุปกรณ์ต่อร่วมหลายตัว หรือการทำงานที่ความเร็วสูง
2. ค่าความต้านทานสูง หรือเรียกว่า Weak Pull-up (เช่น – )
• ข้อดี: ประหยัดพลังงาน กินกระแสไฟน้อยมาก
• ข้อเสีย: ดึงสัญญาณขึ้นช้า (Rise time ยาว) สัญญาณอาจจะมนหรือโย้
• เหมาะสำหรับ: วงจรขนาดเล็ก สายสั้นๆ บนบอร์ดเดียวกัน หรือระบบที่เน้นประหยัดแบตเตอรี่

ข้อควรระวัง: หากใช้ตัวต้านทานค่าสูงเกินไป สัญญาณจะไต่ระดับขึ้น HIGH ไม่ทันจังหวะนาฬิกา ส่งผลให้ การสื่อสารล้มเหลว (Communication Error) โดยเฉพาะอย่างยิ่งเมื่อวิ่งที่ความเร็วระดับ Fast-mode () หรือ Fast-mode Plus ()
ในการสื่อสารแบบ I2C สามารถกำหนดความเร็วในการรับส่งข้อมูลสูงสุดแตกต่างกันได้ โดยแบ่งเป็นโหมดต่างๆ ดังตารางข้างล่างนี้
| โหมด | ความเร็ว |
|---|---|
| Standard mode | 100kbit/s |
| Fast mode | 400kbit/s |
| Fast mode plus | 1Mbit/s |
| High-speed mode | 3.4Mbit/s |
สิ่งสำคัญที่ควรเข้าใจคือ ความเร็วเหล่านี้หมายถึงอัตราการรับส่งข้อมูลผ่านบัส I2C ไม่ใช่ความเร็วในการประมวลผลของอุปกรณ์ กล่าวคือ แม้จะเลือกใช้โหมดที่มีความเร็วสูงขึ้น ก็ไม่ได้หมายความว่าไมโครคอนโทรลเลอร์หรืออุปกรณ์ที่เชื่อมต่อจะประมวลผลคำสั่งได้เร็วขึ้นตามไปด้วย แต่หมายถึงความสามารถในการรับส่งข้อมูลผ่านบัส I2C ที่เพิ่มขึ้นนั่นเอง
ทำความเข้าใจโครงสร้างข้อมูลบนบัส I2C กัน
หลังจากที่เราได้ทำความรู้จักกับ Hardware เบื้องต้นของ I2C กันไปแล้ว ต่อไปเราจะมาดูในส่วนของ Protocol กันบ้าง เมื่อชิปบนบอร์ดต้องการสื่อสารกันผ่าน I2C ข้อมูลไม่ได้ถูกส่งออกไปแบบไร้รูปแบบ แต่จะถูกส่งตาม กติกาและลำดับที่กำหนดไว้อย่างชัดเจน ตั้งแต่การเริ่มต้นสื่อสาร การระบุอุปกรณ์ปลายทาง ไปจนถึงการรับส่งข้อมูล
และ I2C เป็นโปรโตคอลการสื่อสารแบบอนุกรมระหว่างชิปที่เรียบง่ายแต่ทรงพลัง ทำงานด้วยสถาปัตยกรรมแบบ Master-Slave ซึ่งกฎเหล็กของ I2C มีอยู่ว่า “ทุกการสื่อสารบนบัส Master จะต้องเป็นคนเริ่มการสื่อสารก่อนเสมอ” และโดยมาก Master คือ MCU เช่น Arduino, ESP32, STM32 เป็นต้น


รูปที่ 7 แสดงภาพรวมของกระบวนการสื่อสารผ่าน I2C เพื่อประกอบความเข้าใจในขั้นตอนการสื่อสาร

1. สัญญาณเริ่มต้น (Start Condition)
ก่อนที่อุปกรณ์บนบัส I2C จะเริ่มรับส่งข้อมูลกัน จะต้องมีสัญญาณที่เรียกว่า START Condition เกิดขึ้นก่อนเสมอ
สัญญาณนี้เกิดขึ้นเมื่อ Master ดึงสาย SDA จากสถานะ HIGH ลงเป็น LOW ในขณะที่สาย SCL ยังคงอยู่ในสถานะ HIGH เพื่อประกาศให้ทราบว่าการสื่อสารกำลังจะเริ่มต้นขึ้น
ลองนึกภาพว่า START Condition เปรียบเสมือนสัญญาณเรียกความสนใจในห้องประชุม เมื่อสัญญาณนี้เกิดขึ้น อุปกรณ์ทุกตัวที่เชื่อมต่ออยู่บนบัสจะรับรู้ว่ากำลังจะมีการสื่อสารเกิดขึ้น และเตรียมตรวจสอบข้อมูลที่ส่งมาต่อไป เพื่อดูว่าอุปกรณ์ใดเป็นเป้าหมายของการสื่อสารครั้งนี้
รูปแบบสัญญาณ Start Condition


ในสภาวะการรับส่งข้อมูลปกติ สถานะของสาย SDA จะเปลี่ยนได้เฉพาะตอนที่สาย SCL เป็น LOW เท่านั้น ดังนั้น รูปแบบการเปลี่ยนสถานะแบบพิเศษนี้จึงไม่ซ้ำซ้อนกับการส่งข้อมูลทั่วไป ทำให้อุปกรณ์ที่รองรับมาตรฐาน I2C ทุกตัวสามารถตรวจจับและจดจำได้อย่างแม่นยำว่าเป็นจุดเริ่มต้นของชุดข้อมูลใหม่
สรุปสาระสำคัญที่ต้องจำ (Key Points):
- กลไกสัญญาณ: เกิดขึ้นเมื่อสาย SDA ถูกดึงลงเป็น LOW ในขณะที่สาย SCL เป็น HIGH ซึ่งในทางปฏิบัติหมายถึงการดึงสาย SDA ลงก่อน แล้วจึงดึงสาย SCL ลงตามมาเพื่อเริ่มป้อนจังหวะนาฬิกา
- สร้างโดย Master เท่านั้น: ฝั่งอุปกรณ์ Master จะเป็นผู้สร้างสัญญาณ Start Condition ขึ้นมาเสมอ
- ต้องตามด้วย Address Frame: หลังเกิด Start Condition จะต้องตามด้วยข้อมูลระบุตัวตนของอุปกรณ์ปลายทาง (Address Frame) ทันที
- สถานะบัสทำงาน (Bus Busy): ทันทีที่เกิดสัญญาณนี้ สายบัสจะเปลี่ยนสถานะเป็น “ไม่ว่าง (Busy)” จนกว่าจะมีการส่งสัญญาณจบการทำงาน (Stop Condition) หรือสัญญาณเริ่มต้นซ้ำ (Repeated Start)
2. ระบุอุปกรณ์และทิศทางการสื่อสาร (Address Frame)
หลังจากส่งสัญญาณ START แล้ว ขั้นตอนต่อไปคือการระบุว่า Master ต้องการสื่อสารกับอุปกรณ์ตัวใด โดย Master จะส่ง Address ของอุปกรณ์ปลายทาง (Slave Address) ซึ่งมีขนาด 7 บิต หรือ 10 บิต ขึ้นอยู่กับรูปแบบการกำหนดที่อยู่ที่ใช้งาน

ต่อจากชุดข้อมูลเลขที่อยู่ของอุปกรณ์บริวาร (7-bit Address) จะมีบิตพิเศษความยาว 1 บิตกำกับตามหลังมาเสมอ นั่นคือ R/W Bit (Read/Write Bit) ซึ่งทำหน้าที่เป็นตัวกำหนดว่า อุปกรณ์หลัก (Master) หรืออุปกรณ์บริวาร (Slave) ใครจะเป็นผู้คุมสาย SDA สำหรับการรับส่งข้อมูลในขั้นตอนถัดไป

ข้อควรจำคือ มุมมองของการอ่าน (Read) หรือเขียน (Write) จะยึดจากฝั่ง Master เป็นหลักเสมอ โดยแบ่งออกเป็น 2 รูปแบบดังนี้
2.1 การอ่านข้อมูล (Read Operation: R/W = HIGH)
- บิต R/W มีสถานะเป็น HIGH
- Master เป็นฝ่ายรับข้อมูล ที่ส่งมาจาก Slave
- จึงเรียกว่าเป็นการ “อ่านข้อมูลจากบัส (Reading from the bus)” โดยหลังจากบิตนี้ Slave จะกลายเป็นผู้ควบคุมสาย SDA เพื่อส่งชุดข้อมูลกลับมาให้ Master
2.2 การเขียนข้อมูล (Write Operation: R/W = LOW)
- บิต R/W มีสถานะเป็น LOW
- Master เป็นฝ่ายส่งข้อมูล ไปยัง Slave
- จึงเรียกว่าเป็นการ “เขียนข้อมูลลงบัส (Writing to the bus)” โดย Master จะยังคงเป็นผู้ควบคุมสาย SDA เพื่อส่งชุดข้อมูลถัดไปให้ Slave รับไปประมวลผล
พูดง่าย ๆ คือ Address ทำหน้าที่ระบุว่า “ต้องการคุยกับอุปกรณ์ตัวไหน” ส่วน R/W Bit จะบอกว่า “ต้องการเขียนข้อมูลไป หรืออ่านข้อมูลกลับมา” ทำให้อุปกรณ์ที่เชื่อมต่ออยู่บนบัสสามารถตรวจสอบได้ว่าการสื่อสารครั้งนี้เกี่ยวข้องกับตนเองหรือไม่ และควรตอบสนองอย่างไร
3. การตอบรับ (Acknowledge)
หลังจาก Master ส่ง Address Frame ซึ่งประกอบด้วยที่อยู่ของอุปกรณ์ปลายทาง (Slave Address) 7 บิต และบิตกำหนดทิศทางการสื่อสาร (Read/Write) อีก 1 บิตแล้ว บิตถัดมาคือบิตที่ 9 ซึ่งใช้สำหรับการตอบรับ 2 สถานะคือ ตอบกลับ (Acknowledgment: ACK) หรือ ไม่ตอบกลับ (Not Acknowledge : NAK/NACK) เพื่อระบุว่าอุปกรณ์ปลายทางตอบรับ Address ที่ส่งมาหรือไม่ และมีกระบวนการทำงานในส่วนของ Address มีการทำงานหลักๆ 2 ส่วนดังนี้


มีกระบวนการทำงานในส่วนของ Address มีการทำงานหลักๆ 2 ส่วนดังนี้
ส่วนที่ 1 : ส่ง Address เพื่อค้นหา Slave
Master เริ่มต้นด้วยการส่ง Address Frame ผ่านสาย SDA เพื่อระบุอุปกรณ์ปลายทางที่ต้องการสื่อสาร โดยข้อมูลประกอบด้วย Slave Address จำนวน 7 บิต และบิต Read/Write อีก 1 บิต เพื่อกำหนดทิศทางการสื่อสาร

ส่วนที่ 2: Slave ตอบกลับด้วย ACK หรือ NAK/NACK
เมื่อได้รับ Address Frame แล้ว Slave แต่ละตัวจะตรวจสอบว่า Address ที่ส่งมาตรงกับ Address ของตนเองหรือไม่ หากมี Slave ที่ตรงกันและพร้อมตอบรับ จะส่งสัญญาณ ACK/NACK ใน บิตที่ 9 (คาบสัญญาณนาฬิกาที่ 9) โดยสถานะบนสาย SDA จะแสดงผลดังนี้
- ACK (Logic 0): Slave ดึงสาย SDA ให้เป็น LOW เพื่อแสดงการตอบรับ Address
- NAK/NACK (Logic 1): สาย SDA ยังคงอยู่ในระดับ HIGH แสดงว่าไม่มีการตอบรับ
ส่วน Slave ที่มี Address ไม่ตรงกันจะไม่ตอบรับและไม่เข้าร่วมการสื่อสารใน Transaction นั้น

4. ขั้นตอนการส่งข้อมูล (Data Frame)
เมื่ออุปกรณ์หลัก (Master) ส่งสัญญาณเริ่มต้น (Start Condition) และระบุ Address ปลายทางเรียบร้อยแล้ว บัส I2C จะเข้าสู่ขั้นตอนสำคัญที่สุด นั่นคือ “การรับส่งชุดข้อมูล (Data Transfer)”
กระบวนการนี้มีกฎระเบียบที่ชัดเจน เพื่อให้ชิปทุกตัวสามารถรับส่งข้อมูลได้อย่างแม่นยำ ปราศจากข้อผิดพลาด โดยมีรายละเอียดโครงสร้างและกลไกการทำงานดังนี้ครับ
4.1.1 ลำดับการรับส่งข้อมูล: ส่งทีละไบต์ เริ่มจากบิตสูงก่อน (MSB First)

การรับส่งข้อมูลบนบัส I2C จะถูกย่อยออกเป็นชุดๆ ชุดละ 1 ไบต์ (8 บิต) เสมอ โดยมีหลักการส่งสัญญาณดังนี้:
- MSB First (Most Significant Bit First): บิตที่มีค่าความสำคัญสูงสุด (Bit 7) จะถูกส่งออกไปเป็นบิตแรกเสมอ แล้วไล่ลำดับลงมาจนถึงบิตต่ำสุด (Bit 0)
- ผู้คุมสายสัญญาณ (SDA / SCL):
- โหมดเขียนข้อมูล (Write Operation): Master จะเป็นผู้ควบคุมทั้งสายข้อมูล (SDA) และสายสัญญาณนาฬิกา (SCL) เพื่อส่งข้อมูลไปยัง Slave
- โหมดอ่านข้อมูล (Read Operation): Master จะคุมเฉพาะสายสัญญาณนาฬิกา (SCL) แล้วปล่อยให้ Slave เป็นผู้ควบคุมสายข้อมูล (SDA) เพื่อส่งข้อมูลกลับมา
สิ่งสำคัญในการเขียน Data
ในการสื่อสารผ่าน I2C สัญญาณ SDA ต้องคงสถานะให้คงที่ขณะที่ SCL เป็น High และจะเปลี่ยนสถานะได้ในช่วงที่ SCL เป็น Low ยกเว้นสัญญาณ START และ STOP ซึ่งใช้การเปลี่ยนสถานะ SDA ขณะที่ SCL เป็น High เพื่อระบุจุดเริ่มต้นและสิ้นสุดของการสื่อสาร

4.1.2 บิตที่ 9: การตรวจสอบความถูกต้องด้วย ACK / NACK

หัวใจสำคัญที่ทำให้ I2C มีความเสถียร คือการเช็กสถานะทุกๆ ครั้งที่มีการส่งข้อมูลครบ 1 ไบต์ (8 บิต) ฝั่งรับจะต้องส่งสัญญาณตอบรับกลับมาใน คาบสัญญาณนาฬิกาที่ 9 (9th Clock Cycle) เสมอ:
- ACK (Acknowledge): ฝั่งรับข้อมูลจะดึงสาย SDA ลงเป็น LOW เพื่อยืนยันว่า “ได้รับข้อมูลไบต์นี้ถูกต้องครบถ้วนแล้ว พร้อมรับไบต์ถัดไป”
- NAK (Not Acknowledge): ฝั่งรับข้อมูลจะปล่อยสาย SDA ไว้เป็น HIGH เพื่อแจ้งว่า “เกิดข้อผิดพลาดในการรับข้อมูล” หรือ “ไม่ต้องการรับข้อมูลเพิ่มแล้ว (เมื่อ Master อ่านข้อมูลครบ)”
4.2 การรับส่งข้อมูลแบบต่อเนื่อง (Continuous Data Streaming)
คำถามที่มือใหม่มักสงสัยคือ “ส่งข้อมูลได้ยาวแค่ไหน?”
คำตอบคือ Master สามารถส่งหรือรับข้อมูลกี่ไบต์ก็ได้ต่อเนื่องกันในการ Start เพียงครั้งเดียว! ไม่จำเป็นต้องเริ่มกระบวนการระบุ Address ใหม่ทุกๆ 8 บิต
ไดอะแกรมลำดับการส่งข้อมูลต่อเนื่อง (Data Transfer Flow):

5. ปิดการสื่อสาร (STOP Condition)

เมื่ออุปกรณ์หลัก (Master) ต้องการยุติการสื่อสารบนสายบัส I2C Master จำเป็นต้องส่งสัญญาณบอกจุดสิ้นสุด (End Signal) เพื่อแจ้งให้อุปกรณ์บริวาร (Slave) ทุกตัวรับทราบ โดยกระบวนการสร้างสัญญาณจะทำตามลำดับขั้นตอนดังนี้:
- ปล่อยสาย SDA จาก LOW ไปยัง HIGH: ปลี่ยนสถานะของสายข้อมูล (SDA) จากสภาวะ LOW ขึ้นไปเป็น HIGH
- รักษาสถานะสาย SCL ให้อยู่ในระดับ HIGH: สัญญาณตอบรับนี้จะเกิดขึ้นในขณะที่สายสัญญาณนาฬิกา (SCL) ยังคงสภาวะเป็น HIGH
(หมายเหตุ: ในทางฮาร์ดแวร์ เมื่อการสื่อสารจบลง สาย SCL และ SDA จะถูกดึงกลับขึ้นไปอยู่ที่ระดับ High ด้วยตัวต้านทาน Pull-Up เพื่อคืนสายบัสเข้าสู่สภาวะว่าง หรือ Idle State)

6. รูปแบบการเชื่อมต่อ
6.1 การเชื่อมต่อ Master ตัวเดียวกับ Slave หลายตัว (Single Master with Multiple Slaves)
จุดเด่นสำคัญของโปรโตคอล I2C คือระบบการระบุตัวตนด้วยเลขที่อยู่ (Addressing) ซึ่งช่วยให้อุปกรณ์หลักเพียงตัวเดียว (Single Master) สามารถควบคุมและสื่อสารกับอุปกรณ์บริวาร (Multiple Slaves) ได้หลายตัวพร้อมกันบนสายสัญญาณชุดเดียวกัน
จำนวนอุปกรณ์ที่รองรับในระบบ
ความสามารถในการเชื่อมต่ออุปกรณ์บริวารจะขึ้นอยู่กับขนาดของบิต Address ที่ใช้งาน:
- ระบบระบุตำแหน่ง 7 บิต (7-bit Addressing): เป็นมาตรฐานที่นิยมใช้แพร่หลายที่สุด สามารถกำหนดเลข Address ที่ไม่ซ้ำกันได้สูงสุด 128 Slave
- ระบบระบุตำแหน่ง 10 บิต (10-bit Addressing): แม้จะไม่พบเห็นได้บ่อยนักในโมดูลทั่วไป แต่ช่วยขยายขีดความสามารถให้รองรับเลข Address ได้มากถึง 1,024 Slave
รูปแบบการต่อสายวงจร Single Master with Multiple Slaves

ในการต่อใช้งาน Master 1 ตัว ร่วมกับ Slave หลายตัว สามารถเชื่อมต่อสายสัญญาณขนานกันได้ทันที โดยมีโครงสร้างดังนี้:
- เชื่อมสายสัญญาณร่วมกัน: ต่อสาย SDA ของ Master เข้ากับขา SDA ของ Slave ทุกตัว และต่อสาย SCL ของ Master เข้ากับขา SCL ของ Slave ทุกตัว
- ต่อตัวต้านทาน Pull-Up: ต่อตัวต้านทาน Pull-Up Resistor จำนวน 2 ตัว โดยตัวที่หนึ่งเชื่อมระหว่างสาย SDA กับแหล่งจ่ายไฟ () และตัวที่สองเชื่อมระหว่างสาย SCL กับแหล่งจ่ายไฟ ()
6.2 การเชื่อมต่อ Master หลายตัวกับ Slave หลายตัว (Multiple Masters with Multiple Slaves)
ระบบ I2C (Inter-Integrated Circuit) รองรับการเชื่อมต่อ Master และ Slave หลายตัวบนบัสชุดเดียวกัน โดย Master แต่ละตัวสามารถเริ่มต้นการสื่อสารกับ Slave ที่ต้องการได้ตามปกติ อย่างไรก็ตาม ในระบบ Multi-Master อาจเกิดกรณีที่ Master หลายตัวพยายามเข้าควบคุมบัสในเวลาเดียวกัน
เพื่อจัดการกับสถานการณ์นี้ มาตรฐาน I2C จึงกำหนดกลไก Bus Arbitration ซึ่งใช้ตรวจสอบและตัดสินว่า Master ตัวใดจะได้สิทธิ์ในการควบคุมบัส โดยอาศัยการตรวจสอบสัญญาณบนสาย SDA ระหว่างการส่งข้อมูล หาก Master ตัวใดแพ้ Arbitration จะต้องหยุดส่งข้อมูลและปล่อยให้ Master ที่ชนะดำเนินการสื่อสารต่อไปได้ตามปกติ
กลไกนี้ช่วยป้องกันไม่ให้การแย่งใช้บัสระหว่าง Master ทำให้การสื่อสารของตัวที่ชนะเสียหาย อย่างไรก็ตาม การใช้งานระบบ Multi-Master ยังต้องอาศัยการรองรับ Arbitration จากฮาร์ดแวร์และการจัดการข้อผิดพลาดที่เหมาะสมด้วย
รูปแบบการต่อสายวงจรแบบ Multiple Masters with Multiple Slaves

…
กลไกการป้องกันสัญญาณชนกัน (Bus Arbitration & Collision Avoidance)
สมมติว่ามี Master 2 ตัว (Master 1 และ Master 2) ส่งข้อมูลพร้อมกันบนบัส I2C
- DATA1 และ DATA2 คือข้อมูลที่ Master แต่ละตัวต้องการส่ง
- SDA คือสัญญาณข้อมูลที่ปรากฏจริงบนบัส
- SCL คือสัญญาณนาฬิกาที่ใช้กำหนดจังหวะการส่งข้อมูล
เมื่อ Master ทั้งสองเริ่มส่งข้อมูลพร้อมกัน ทั้งคู่จะส่งข้อมูลทีละบิต พร้อมตรวจสอบว่าสัญญาณบน SDA ตรงกับข้อมูลที่ตัวเองส่งหรือไม่ หาก Master ตัวใดส่ง 1 แต่ตรวจพบว่า SDA เป็น 0 จะถือว่าแพ้ Arbitration และต้องหยุดส่งข้อมูล โดยรอจนกว่าบัสจะว่างก่อนจึงเริ่มสื่อสารใหม่ได้

ตัวอย่างการทำงาน

- เมื่อ Master 1 และ Master 2 ส่งสัญญาณ Start พร้อมกัน ทั้งสองจะเริ่มส่งข้อมูลบนบัส I2C
- ในระหว่างการส่งข้อมูล Master แต่ละตัวจะตรวจสอบสัญญาณ SDA บนบัสเทียบกับข้อมูลที่ตัวเองส่งออกไป จากรูปที่ 16 ซึ่งเป็นตัวอย่างการสื่อสาร I2C แบบ 10 บิต จะเห็นว่าในช่วงที่ High-order bits ของ Master ทั้งสองตรงกัน ระบบยังไม่สามารถตัดสินผู้ชนะ Arbitration ได้ ทำให้ Master ทั้งสองยังคงส่งข้อมูลต่อไปพร้อมกัน
- เมื่อถึง Low-order bit ตำแหน่งที่ 5 ข้อมูลของ Master ทั้งสองแตกต่างกัน โดย Master 1 ส่ง HIGH (
1) ขณะที่ Master 2 ส่ง LOW (0) ส่งผลให้สัญญาณ SDA บนบัสเป็น LOW (0) Master 1 จึงตรวจพบว่าข้อมูลบนบัสไม่ตรงกับที่ตัวเองส่ง และแพ้ Arbitration ส่วน Master 2 เป็นผู้ชนะและส่งข้อมูลต่อไปจนเสร็จสิ้น จากนั้น Master 1 จึงสามารถเริ่มส่งข้อมูลใหม่ได้เมื่อบัสว่าง
ทำไม Master ที่ส่ง HIGH ถึงแพ้ Arbitration?
เนื่องจาก I2C ใช้การสื่อสารแบบ Open-Drain ร่วมกับตัวต้านทาน Pull-up ทำให้สาย SDA มีสถานะเป็น HIGH เมื่อไม่มีอุปกรณ์ใดดึงสายลง LOW
เมื่อมี Master หลายตัวส่งข้อมูลพร้อมกัน หาก Master ตัวหนึ่งส่ง HIGH (1) ซึ่งเป็นการปล่อยสาย SDA ขณะที่อีกตัวส่ง LOW (0) โดยดึงสาย SDA ลง LOW สัญญาณที่ปรากฏบนบัสจะเป็น LOW (0)
Master ที่ส่ง HIGH แต่ตรวจพบว่าสัญญาณ SDA เป็น LOW จะรู้ว่าตัวเองแพ้ Arbitration และต้องหยุดส่งข้อมูล ส่วน Master ที่ส่ง LOW จะสามารถส่งข้อมูลต่อไปได้ตามปกติ
ดังนั้น Master ที่ส่ง HIGH ณ บิตแรกที่ข้อมูลแตกต่างกันจะเป็นฝ่ายแพ้ Arbitration
เหตุใดข้อมูลจึงไม่สูญหาย?
เนื่องจาก Master ที่ชนะยังคงส่งข้อมูลต่อไปได้โดยไม่ถูกรบกวนจาก Master ที่แพ้ ทำให้ข้อมูลของ Master ที่ชนะไม่เสียหายจากการแย่งสิทธิ์ควบคุมบัส
สรุป: I²C ใช้สาย SDA ในการทำ Arbitration และใช้สาย SCL ในการซิงโครไนซ์สัญญาณนาฬิกา โดยกระบวนการทั้งสองทำงานประสานกันระหว่างที่ Master ส่งข้อมูล
ข้อควรระวังในการใช้งาน I²C แบบ Multi-Master
ในการพัฒนาระบบ I²C แบบ Multiple Masters with Multiple Slaves ซึ่งมี Master มากกว่าหนึ่งตัวบนบัสเดียวกัน ควรตรวจสอบก่อนว่า Hardware และ Library ที่ใช้งานรองรับการทำงานแบบ Multi-Master หรือไม่ เนื่องจาก Hardware และ Library บางตัวอาจรองรับเฉพาะการทำงานแบบ Single-Master
ความแตกต่างสำคัญคือการรองรับกลไก Arbitration และ Arbitration Lost Detection ซึ่งเป็นกระบวนการตรวจจับว่า Master แพ้การแย่งสิทธิ์ควบคุมบัสหรือไม่ โดย Master ต้องตรวจสอบสัญญาณ SDA บนบัสเทียบกับข้อมูลที่ตนเองส่งออกไป หากส่ง HIGH (1) แต่ตรวจพบว่า SDA เป็น LOW (0) แสดงว่า Master ตัวนั้นแพ้ Arbitration และต้องหยุดส่งข้อมูล เพื่อให้ Master ที่ชนะสามารถสื่อสารต่อไปได้
ในระบบ Single-Master ซึ่งมี Master เพียงตัวเดียว ไม่จำเป็นต้องใช้ Arbitration เพื่อจัดการการแย่งสิทธิ์ระหว่าง Master อย่างไรก็ตาม การตรวจสอบ ACK/NACK จาก Slave และสถานะการสื่อสารอื่น ๆ ยังคงจำเป็นตามปกติ
ดังนั้น ก่อนนำ MCU และ Library ไปใช้งานในระบบ Multi-Master ควรตรวจสอบทั้งการรองรับ Multi-Master, Arbitration และ Arbitration Lost Detection รวมถึงความสามารถในการจัดการข้อผิดพลาดที่เกี่ยวข้อง เพื่อป้องกันปัญหาเมื่อ Master หลายตัวพยายามควบคุมบัสพร้อมกัน
Repeat Start Condition
ในระบบ Multiple Masters with Multiple Slaves บางครั้ง Master จำเป็นต้องรับส่งข้อมูลหลายข้อความในการสื่อสารรอบเดียว เช่น การรับส่งข้อมูลกับ Slave คนละตัว หรือการสลับระหว่างการทำงานอ่าน (Read) และเขียน (Write) โดยไม่ต้องการให้ Master ตัวอื่นเข้ามาแทรกแซงในช่วงเวลานี้ ในกรณีนี้คุณสามารถใช้ “Repeat Start Condition” ได้
กล่าวคือ ในการสื่อสารรอบเดียวกัน Master สามารถสร้าง Start Condition ขึ้นมาใหม่ได้หลายครั้งเพื่อทำภารกิจรับส่งข้อมูลหลายชุดให้เสร็จสิ้น แล้วจึงค่อยสร้าง Stop Condition ในตอนท้ายสุดเพื่อจบกระบวนการสื่อสารทั้งหมด เนื่องจากไม่มีการส่ง Stop Condition เกิดขึ้นเลยในระหว่างนั้น Master จึงครองสายบัส (Bus) ไว้ได้อย่างต่อเนื่อง โดยที่ Master ตัวอื่นไม่สามารถแทรกเข้ามาใช้งานได้

Written by Pawinphat Charoenrat
Reference :
Community.element14.com
Allaboutcircuits.com
Aticleworld.com
Circuitbasics.com
Circuitbread.com
Seeedstudio.com
https://learn.sparkfun.com/tutorials/i2c/all
Digilent.com
Mickmake.com
ภาคผนวก
ก. โปรโตคอล I2C: แบบ Address 10 บิต
โดยทั่วไป บัส I2C จะใช้ (Address) ขนาด 7 บิต ซึ่งรองรับอุปกรณ์ได้สูงสุด 128 ตัว แต่ในระบบขนาดใหญ่ที่มีชิปเชื่อมต่อกันจำนวนมาก มาตรฐาน I2C จึงรองรับ Address แบบ 10 บิต (10-bit Addressing) เพื่อขยายความสามารถให้รองรับอุปกรณ์ได้มากถึง 1,024 ตัว
เนื่องจากสายบัสส่งข้อมูลครั้งละ 1 ไบต์ (8 บิต) การระบุตัวตนแบบ 10 บิตจึงต้องแบ่งการส่งข้อมูลออกเป็น 2 เฟรม (Two Frames) ติดต่อกันอย่างต่อเนื่อง

1. เฟรมที่แรก (First Frame): ส่งบิตตำแหน่งล่างของ Address (High-order bits)
เฟรมแรกใช้รูปแบบ 11110 A9 A8 R/W เพื่อระบุว่าเป็นการสื่อสารแบบ 10-bit Address พร้อมส่งบิตบน 2 บิตของ Address ปลายทาง โดยแบ่งข้อมูลได้ดังนี้
- 11110 (5 บิตแรก): รหัสนำหน้าพิเศษ (Reserved Prefix) ที่ใช้ระบุว่าเป็นการส่ง Address แบบ 10 บิต
- A9–A8 (2 บิตถัดมา): บิตบน 2 บิตของ Address ปลายทาง
- R/W (บิตสุดท้าย): บิตกำหนดทิศทางการสื่อสาร ว่าจะอ่านหรือเขียนข้อมูล
การตอบรับ (ACK): Slave ที่รองรับ 10-bit Address และมีบิตบน
A9–A8ตรงกับที่ Master ส่งมา จะตอบรับด้วย ACK ในเฟรมแรก โดยอาจมี Slave หลายตัวตอบรับพร้อมกันได้ หากมีบิตบนตรงกัน
2. เฟรมที่สอง (Second Frame): ส่งบิตตำแหน่งล่างของ Address (Low-order bits)
หลังจากได้รับ ACK จากเฟรมแรกแล้ว Master จะส่ง Address อีก 1 ไบต์ เพื่อระบุ Address ของอุปกรณ์ปลายทางให้ครบทั้ง 10 บิต
- A7–A0 (8 บิต): บิตล่าง 8 บิตที่เหลือของ Address ปลายทาง
การตอบรับ (ACK): Slave ที่มี Address ตรงกันครบทั้ง 10 บิตจะตอบรับด้วย ACK ส่วน Slave ที่ Address ไม่ตรงกันจะไม่ตอบรับ หาก Master ไม่ได้รับ ACK แสดงว่าไม่มีอุปกรณ์ตอบรับ Address ในขั้นตอนนี้
จุดเด่น: ใช้งานร่วมกับอุปกรณ์แบบ 7 บิตได้ (Coexistence)
อุปกรณ์ที่ใช้ 10-bit Address สามารถเชื่อมต่อบนบัส I2C เดียวกับอุปกรณ์ที่ใช้ 7-bit Address ได้ โดยรหัสนำหน้า 11110 ถูกกำหนดไว้สำหรับการสื่อสารแบบ 10 บิต จึงช่วยแยกการระบุ Address ทั้งสองรูปแบบออกจากกัน
Note :
High-order bits และ Low-order bits คืออะไร?
เมื่อ Address มีหลายบิต เราจะแบ่งบิตออกเป็นส่วนบน (High-order bits) และส่วนล่าง (Low-order bits) เพื่อให้อธิบายและส่งข้อมูลได้ง่ายขึ้น
– High-order bits (บิตบน): บิตที่มีค่าน้ำหนักสูงกว่า ใช้ระบุส่วนต้นของ Address
– Low-order bits (บิตล่าง): บิตที่มีค่าน้ำหนักต่ำกว่า ใช้ระบุส่วนที่เหลือของ Address
ทำไมต้องแบ่งเป็นบิตบนและบิตล่าง?
เพราะ Address แบบ 10 บิตมีข้อมูลมากกว่า 1 ไบต์ จึงต้องส่ง Address แยกเป็น 2 เฟรม โดยส่งบิตบน 2 บิตแรก (A9–A8) ในเฟรมแรก แล้วส่งบิตล่างอีก 8 บิต (A7–A0) ในเฟรมที่สอง วิธีนี้ช่วยให้ Master ส่ง Address ได้ครบทั้ง 10 บิตผ่านบัส I2C ซึ่งส่งข้อมูลครั้งละ 8 บิต

ข. กลไกการยืดสัญญาณนาฬิกา (Clock Stretching) ในบัส I2C
ในการสื่อสารผ่าน I2C แม้อุปกรณ์จะรองรับความเร็วในการรับส่งข้อมูล (Bit Rate) สูง แต่ก็ไม่ได้หมายความว่าอุปกรณ์จะประมวลผลหรือเตรียมข้อมูลได้ทันความเร็วนั้นเสมอไป
ลองนึกภาพว่า Master ต้องการอ่านข้อมูลจาก Slave แต่ Slave ยังเตรียมข้อมูลไม่เสร็จ หาก Master ดำเนินการต่อทันที ก็อาจทำให้การสื่อสารไม่เป็นไปตามที่คาดหวัง
เพื่อแก้ปัญหานี้ I2C จึงมีกลไกที่เรียกว่า Clock Stretching ซึ่งช่วยให้ Slave ขอเวลาเพิ่มได้ โดยดึงสายสัญญาณนาฬิกา SCL ให้อยู่ในสถานะ LOW ชั่วคราว ทำให้ Master ต้องรอจนกว่า Slave จะพร้อม แล้วจึงสื่อสารต่อได้
พูดง่าย ๆ คือ Clock Stretching เปรียบเสมือนการที่ Slave บอก Master ว่า “รอสักครู่ ขอเวลาเตรียมข้อมูลให้พร้อมก่อน”
กลไกการทำงานของ Clock Stretching

- Slave ดึงสาย SCL ลงค้างไว้ที่ LOW: เมื่อ Slave ต้องการเวลาประมวลผลเพิ่ม มันจะทำการดึงขา SCL ลงมาเป็นสถานะ LOW ค้างไว้
- Master หยุดการส่งข้อมูลชั่วคราว: เนื่องจากการอ่านข้อมูล (Data Sampling) บนบัส I2C จะเกิดขึ้นที่ขอบขาขึ้น (Rising Edge) ของสัญญาณ SCL เมื่อสาย SCL ถูกดึงค้างเป็น LOW สัญญาณนาฬิกาจะไม่สามารถขึ้นเป็น HIGH ได้ Master จึงต้องหยุดรอจนกว่าสาย SCL จะถูกปล่อยให้กลับขึ้นเป็น HIGH
- การสื่อสารดำเนินต่อ: เมื่อ Slave ประมวลผลเสร็จเรียบร้อย มันจะปล่อยสาย SCL ให้กลับขึ้นเป็น HIGH ตามปกติ เพื่อให้ Master เริ่มเคาะจังหวะสัญญาณนาฬิกาและรับส่งข้อมูลต่อได้ทันที
ข้อควรระวังและข้อจำกัดที่ควรรู้
- อุปกรณ์ไม่ได้รองรับทุกตัว: อุปกรณ์ I2C บางชนิดไม่รองรับฟีเจอร์ Clock Stretching ดังนั้นก่อนออกแบบวงจร จำเป็นต้องตรวจสอบข้อมูลใน Datasheet ของอุปกรณ์ชิ้นนั้นๆ เสมอ
- ความเสี่ยงระบบค้าง (Bus Lockup): หากอุปกรณ์ Slave เกิดการชำรุด หรือทำงานผิดพลาดแล้วดึงสาย SCL ค้างไว้ตลอดเวลา สภาพบัสทั้งหมดจะถูกหยุดชะงัก (Halt) ทำให้ Master ไม่สามารถสื่อสารกับ Slave ตัวอื่นๆ ในระบบได้เลย
Bunpajarn | Learn • Share • Grow Together.
พื้นที่สำหรับคนที่รักและสนใจ Electronics & Embedded
