สำหรับใครที่อยู่ในแวดวงของอิเล็กทรอนิกส์ การทำงาน D.I.Y หรือโปรเจคต่าง ๆ ที่ต้องใช้ไมโครคอนโทรเลอร์ (MCU) สำหรับสร้างสิ่งประดิษฐ์ขึ้นมา และเชื่อว่าทุกคนต้องคุ้นชินกับคำว่า I2C หรือ หรือ Inter-Integrated Circuit ซึ่งเป็นโปรโตคอลการสื่อสารที่ใช้กันอย่างแพร่หลายในโลกของระบบฝังตัว ใช้สำหรับสื่อสารระหว่างอุปกรณ์ต่าง ๆ เช่น เซนเซอร์ (Sensor), หน่วยความจำ (Memory) และ ไมโครคอนโทรลเลอร์ (Microcontroller) ซึ่งจำเป็นต้องใช้วิธีที่มีประสิทธิภาพง่าย และใช้ทรัพยากรน้อย ซึ่ง I2C ตอบโจทย์นี้ได้อย่างลงตัว
บทความนี้จะพาทุกคนไปทำความเข้าใจว่า I2C คืออะไร ? ทำงานอย่างไร ? พร้อมข้อดีและข้อจำเสีย เพื่อให้ทุกคนได้รู้จักโปรโตคอลการสื่อสารชนิดนี้มากขึ้น
I2C (อ่านว่า "ไอสแควร์ซี") หรือ Inter-Integrated Circuit เป็นโปรโตคอลการสื่อสารที่ผสมผสานข้อดีของการสื่อสารแบบ SPI และ UART เข้าไว้ด้วยกันอย่างลงตัว ทำให้สามารถเชื่อมต่ออุปกรณ์หลายตัวในระบบเดียวกันได้ ไม่ว่าจะเป็นการใช้ไมโครคอนโทรลเลอร์หลายตัว เพื่อบันทึกข้อมูลลงในการ์ดหน่วยความจำตัวเพียงเดียว หรือการควบคุมจอแสดงผล LCD เดียวจากหลายแหล่งข้อมูล ซึ่ง I2C ช่วยให้การพัฒนา และใช้งานระบบฝังตัวเป็นไปอย่างยืดหยุ่น และง่ายดาย
ความจริงแล้ว I2C คล้ายกับการสื่อสารผ่านพอร์ต UART ที่ใช้สายเพียงสองเส้น I2C ก็ใช้เพียงสองสายในการส่งข้อมูลระหว่างอุปกรณ์เช่นกัน ซึ่งแต่ละสายก็จะมีรายละเอียดดังนี้
ภาพจาก : https://www.thegeekpub.com/18351/how-i2c-works-i2c-explained-simply/
I2C เป็นการสื่อสารแบบอนุกรม (Serial Communication) ซึ่งข้อมูลจะถูกส่งทีละบิตผ่านสายสัญญาณ SDA พร้อมกันกับสัญญาณนาฬิกาจากสาย SCL ที่ตัว Master ควบคุม ทำให้อุปกรณ์ทั้งหมดสามารถซิงโครไนซ์ข้อมูลได้อย่างแม่นยำ
2C ถูกพัฒนาขึ้นครั้งแรกโดยบริษัท Philips Semiconductors ในปี ค.ศ.1982 (พ.ศ.2525) ซึ่งปัจจุบันคือ NXP Semiconductors จุดเริ่มต้นของ I2C มาจากความต้องการโปรโตคอลการสื่อสารที่เรียบง่าย และมีประสิทธิภาพสำหรับการสื่อสารระหว่างชิปหลายตัวบนแผงวงจรเดียวกัน โดยใช้เพียงสองสาย (SDA และ SCL) ซึ่งทำให้ลดความซับซ้อนของการเดินสาย และลดต้นทุนการผลิต
ภาพจาก : https://www.symboltm.com/new-gallery-30
แนวคิดนี้เกิดจากการพยายามหาวิธีการที่ง่าย และประหยัดการใช้โปรโตคอลการสื่อสารแบบเดิม ซึ่งมักต้องใช้สายหลายเส้นสำหรับการส่งข้อมูล และสัญญาณควบคุม กลับกัน I2C ถูกออกแบบมาเพื่อรองรับการเชื่อมต่ออุปกรณ์หลายตัวเข้ากับบัสเพียงบัสเดียว สามารถทำงานในรูปแบบ Master-Slave ได้ ซึ่งมีประโยชน์มากในการพัฒนาอุปกรณ์อิเล็กทรอนิกส์ และระบบฝังตัว เช่น เซนเซอร์, จอแสดงผล และไมโครคอนโทรลเลอร์
ตลอดหลายปีที่ผ่านมา I2C ได้รับการพัฒนาให้มีความเร็วในการสื่อสารสูงขึ้นเรื่อย ๆ โดยเริ่มจากโหมดมาตรฐานที่ 100 kbps ไปจนถึงโหมด High-Speed (3.4 Mbps) และ Ultra-Fast (5 Mbps) เพื่อรองรับการใช้งานในอุตสาหกรรมที่ต้องการความเร็ว และประสิทธิภาพสูงในปัจจุบัน
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
I2C ใช้การส่งข้อมูลในรูปแบบของ "ข้อความ" (Messages) โดยข้อความจะถูกแบ่งออกเป็น เฟรม (Frames) แต่ละข้อความประกอบด้วยเฟรมที่มีข้อมูลสำคัญ เช่น เฟรมที่ระบุที่อยู่ของอุปกรณ์ปลายทาง (Address Frame) และเฟรมที่มีข้อมูลที่ต้องการส่ง (Data Frames) ทีนี้ เรามาดูรายละเอียดของแต่เฟรมข้อความที่ถูกส่งไปบนสายสัญญาณกัน
การสื่อสารใน I2C เริ่มต้นเมื่อ Master ส่งสัญญาณ "Start" เปลี่ยนระดับแรงดันบนสาย SDA จากสูง (1) ไปต่ำ (0) ในขณะที่สาย SCL ยังคงอยู่ในระดับสูง (1) ก็จะส่งสัญญาณไปยังทุกอุปกรณ์ Slave ที่เชื่อมต่ออยู่ว่า Master กำลังเริ่มการส่งข้อมูล ทำให้บัส I2C ถูกล็อกเพื่อใช้เฉพาะกับการส่งข้อมูลของ Master ในช่วงเวลานั้น
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
หลังจากส่งสัญญาณเริ่มต้น Master จะส่งเฟรมระบุที่อยู่ (Address Frame) เพื่อบอกว่าอุปกรณ์ Slave ใดเป็นเป้าหมายการสื่อสาร ที่อยู่ของ Slave จะมีความยาว 7 บิตหรือ 10 บิต ขึ้นอยู่กับการออกแบบของระบบ รวมถึงมีบิตอ่าน/เขียน (Read/Write bit) เพิ่มเติมอีกหนึ่งบิต เพื่อระบุว่าข้อมูลจะถูกส่งไปยัง Slave (เขียน) หรือจะอ่านข้อมูลจาก Slave (อ่าน)
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
เมื่อเฟรมที่อยู่ถูกส่งออกไปแล้ว ทุก Slave ที่เชื่อมต่อจะตรวจสอบว่าที่อยู่ที่ได้รับนั้นตรงกับที่อยู่ของตัวเองหรือไม่ หากตรงกัน Slave นั้นจะส่งสัญญาณ ACK (Acknowledgment) กลับมายัง Master โดยดึงสาย SDA ลงต่ำ (0) เพื่อยืนยันการรับข้อมูล หากไม่ตรงกัน Slave จะไม่ตอบสนอง ทำให้สาย SDA ยังคงอยู่ในระดับสูง
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
เมื่อได้รับการตอบรับ (ACK) จาก Slave แล้ว Master จะเริ่มส่ง หรือรับข้อมูลในรูปแบบ Data Frame ข้อมูลแต่ละเฟรมจะมีความยาว 8 บิต และถูกส่งโดยเริ่มจากบิตที่สำคัญที่สุด (MSB) ไปยังบิตที่น้อยกว่า การส่งข้อมูลสามารถเกิดขึ้นได้ทั้งในทิศทางจาก Master ไปยัง Slave (เขียน) หรือจาก Slave ไปยัง Master (อ่าน) ตามที่ระบุในบิต อ่าน/เขียน
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
หลังจากที่ส่งเฟรมข้อมูลแต่ละเฟรม อุปกรณ์ที่รับข้อมูลจะส่งสัญญาณ ACK กลับไปยังอุปกรณ์ผู้ส่ง เพื่อยืนยันว่าข้อมูลถูกรับอย่างถูกต้อง หากการส่งข้อมูลมีปัญหา อุปกรณ์ผู้รับอาจส่งสัญญาณ NACK (Not Acknowledgment) โดยปล่อยให้สาย SDA อยู่ในระดับสูง เพื่อบอกว่าข้อมูลไม่ถูกต้อง หรือมีข้อผิดพลาด
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
เมื่อการส่งข้อมูลเสร็จสิ้น Master จะส่งสัญญาณ "Stop" เพื่อยุติการสื่อสาร โดยการเปลี่ยนสาย SCL ไปยังระดับสูง (1) ก่อนที่จะเปลี่ยนสาย SDA จากต่ำ (0) ไปสูง (1) ซึ่งเป็นสัญญาณบอกให้บัส I2C ว่าการสื่อสารได้เสร็จสิ้นแล้ว และบัสกลับมาอยู่ในสถานะว่างพร้อมสำหรับการสื่อสารครั้งต่อไป
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
I2C ใช้การระบุที่อยู่ (Addressing) ทำให้สามารถควบคุม Slave หลายตัวได้จาก Master เดียว โดยที่อยู่แบบ 7 บิต จะรองรับอุปกรณ์ได้สูงสุด 128 ตัว ส่วนที่อยู่แบบ 10 บิต (ซึ่งใช้น้อยกว่า) รองรับได้ถึง 1,024 ตัว ในการเชื่อมต่อ Slave หลายตัวเข้ากับ Master เดียว ให้ต่อสาย SDA และ SCL ของอุปกรณ์ทั้งหมดเข้าด้วยกัน และใช้ตัวต้านทานต่อแบบ Pull-up ขนาด 4.7K โอห์ม เชื่อมต่อกับ Vcc เพื่อรักษาระดับแรงดันบนบัสเอาไว้
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
ระบบ I2C สามารถเชื่อมต่อ Master หลายตัวกับ Slave หลายตัวได้ แต่จะมีปัญหาเมื่อ Master สองตัวพยายามส่ง หรือรับข้อมูลพร้อมกันผ่านสาย SDA เพื่อแก้ปัญหานี้ แต่ละ Master ต้องตรวจสอบว่าระดับแรงดันบนสาย SDA สูง หรือต่ำก่อนส่งข้อมูล ถ้าระดับต่ำ แสดงว่า Master อื่นกำลังใช้บัสอยู่ ต้องรอจนกว่าระดับจะสูงจึงจะส่งข้อมูลได้ การเชื่อมต่อหลาย Master ให้ใช้ตัวต้านทาน Pull-up ขนาด 4.7K โอห์ม บนสาย SDA และ SCL เช่นกัน
ภาพจาก : https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/
แม้ว่า I2C อาจดูทรงพลัง และไม่ได้มีหลักการที่ซับซ้อน แต่เมื่อเทียบกับโปรโตคอลอื่น ๆ แล้วมันก็ยังถือว่าต้องใช้ความเข้าใจมากอยู่ดี ซึ่ง I2C ก็มีทั้งข้อดี และข้อเสีย ที่ควรพิจารณา ดังนี้
I2C เป็นโปรโตคอลการสื่อสารที่เรียบง่ายแต่มีประสิทธิภาพ เหมาะสำหรับการเชื่อมต่ออุปกรณ์หลายตัวด้วยการใช้สายสัญญาณเพียงสองเส้น แม้จะมีข้อจำกัดเรื่องอัตราการส่งข้อมูล และขนาดเฟรมที่จำกัด แต่ด้วยการรองรับหลายเครื่อง Master และ Slave ทำให้ I2C เป็นตัวเลือกยอดนิยมสำหรับการสื่อสารระหว่างอุปกรณ์ต่าง ๆ ในระบบอิเล็กทรอนิกส์ และระบบสมองกลฝังตัว
และในบทความต่อ ๆไป ผู้เขียนจะมาเจาะลึกเพิ่มเติมกับโปรโตคอล UART และ SPI ซึ่งเป็นโปรโตคอลการสื่อสารยอดนิยมอีกสองตัวที่มีข้อดี และข้อเสีย ต่างกันไป เพื่อให้เข้าใจความแตกต่างของโปรโตคอลเหล่านี้กัน
|