บทความนี้จะอธิบายโปรโตคอลการสื่อสาร I2C อย่างละเอียด พร้อมทั้งอธิบายหลักการพื้นฐานและการทำงานของโปรโตคอลดังกล่าวเพื่อการสื่อสารอุปกรณ์ที่มีประสิทธิภาพ
คุณอาจพบว่าตัวเองใช้ I2C หากคุณเคยสร้างโปรเจ็กต์ที่ใช้หน้าจอ OLED เซ็นเซอร์วัดความดันบรรยากาศ หรือโมดูลไจโรสโคป/เครื่องวัดความเร่ง
I2C ผสานรวมคุณสมบัติที่ดีที่สุดของ SPI และ UART เข้าด้วยกัน ด้วย I2C คุณสามารถเชื่อมต่อสเลฟหลายตัวเข้ากับมาสเตอร์ตัวเดียว (เช่น SPI) และคุณสามารถมีมาสเตอร์หลายตัวควบคุมสเลฟหนึ่งตัวหรือมากกว่าได้ วิธีนี้มีประโยชน์อย่างมากหากคุณต้องการให้ไมโครคอนโทรลเลอร์มากกว่าหนึ่งตัวเขียนข้อมูลลงการ์ดหน่วยความจำหรือแสดงข้อความบนหน้าจอ LCD
เช่นเดียวกับการสื่อสาร UART, I2C ใช้เพียงสองสายในการส่งข้อมูลระหว่างอุปกรณ์:
SDA (ข้อมูลอนุกรม) – สายสำหรับอุปกรณ์หลักและรองในการส่งและรับข้อมูล
SCL (Serial Clock) – เส้นสัญญาณนาฬิกา
I2C เป็นโปรโตคอลการสื่อสารแบบอนุกรม ดังนั้นข้อมูลจะถูกส่งทีละบิตบนสายเส้นเดียว (สาย SDA)
เช่นเดียวกับ SPI, I2C เป็นโปรโตคอลแบบซิงโครนัส หมายความว่าเอาต์พุตของบิตจะซิงโครไนซ์กับการสุ่มตัวอย่างบิตโดยใช้สัญญาณนาฬิกาที่ใช้ร่วมกันระหว่างอุปกรณ์มาสเตอร์และสเลฟ สัญญาณนาฬิกาจะถูกควบคุมโดยอุปกรณ์มาสเตอร์เสมอ
ด้วย I2C ข้อมูลจะถูกส่งเป็น ข้อความ โดยข้อความจะถูกแบ่งออกเป็น เฟรม ข้อมูล แต่ละข้อความจะมีเฟรมแอดเดรสซึ่งประกอบด้วยแอดเดรสไบนารีของอุปกรณ์สเลฟ และเฟรมข้อมูลอย่างน้อยหนึ่งเฟรมที่มีข้อมูลที่ถูกส่ง ข้อความยังประกอบด้วยเงื่อนไขเริ่มต้นและหยุด บิตการอ่าน/เขียน และบิต ACK/NACK ระหว่างแต่ละเฟรมข้อมูลด้วย:
เงื่อนไขการเริ่มต้น: สาย SDA จะเปลี่ยนจากระดับแรงดันไฟฟ้าสูงเป็นระดับแรงดันไฟฟ้าต่ำ ก่อนที่ สาย SCL จะเปลี่ยนจากสูงเป็นต่ำ
สภาวะหยุด: สาย SDA เปลี่ยนจากระดับแรงดันไฟต่ำไปเป็นระดับแรงดันสูง หลังจาก สาย SCL เปลี่ยนจากต่ำไปสูง
เฟรมที่อยู่: สตริง 7 หรือ 10 บิตเฉพาะสำหรับอุปกรณ์สเลฟแต่ละตัว ซึ่งระบุอุปกรณ์สเลฟเมื่ออุปกรณ์หลักต้องการสื่อสารกับอุปกรณ์นั้น
บิตอ่าน/เขียน: บิตเดียวที่กำหนดว่ามาสเตอร์กำลังส่งข้อมูลไปยังสเลฟ (ระดับแรงดันไฟต่ำ) หรือร้องขอข้อมูลจากสเลฟ (ระดับแรงดันไฟสูง)
บิต ACK/NACK: แต่ละเฟรมในข้อความจะตามด้วยบิต acknowledge/non-acknowledge หากได้รับเฟรมแอดเดรสหรือเฟรมข้อมูลสำเร็จ บิต ACK จะถูกส่งกลับไปยังผู้ส่งจากอุปกรณ์รับ
I2C ไม่มีสายเลือกสเลฟเหมือน SPI ดังนั้นจึงจำเป็นต้องมีวิธีอื่นเพื่อแจ้งให้สเลฟทราบว่าข้อมูลกำลังถูกส่งไปที่มัน ไม่ใช่สเลฟตัวอื่น โดยทำได้โดย การกำหนดแอดเดรส เฟรมที่แอดเดรสจะอยู่ที่เฟรมแรกหลังจากบิตเริ่มต้นในข้อความใหม่เสมอ
มาสเตอร์จะส่งแอดเดรสของสเลฟที่ต้องการสื่อสารด้วยไปยังสเลฟทุกตัวที่เชื่อมต่ออยู่ จากนั้นสเลฟแต่ละตัวจะเปรียบเทียบแอดเดรสที่ส่งมาจากมาสเตอร์กับแอดเดรสของตัวเอง หากแอดเดรสตรงกัน จะส่งบิต ACK แรงดันต่ำกลับไปยังมาสเตอร์ หากแอดเดรสไม่ตรงกัน สเลฟจะไม่ทำงานและสาย SDA จะยังคงทำงานอยู่
เฟรมแอดเดรสประกอบด้วยบิตเดี่ยวที่ส่วนท้าย ซึ่งบอกสเลฟว่ามาสเตอร์ต้องการเขียนข้อมูลไปยังสเลฟหรือรับข้อมูลจากสเลฟ หากมาสเตอร์ต้องการส่งข้อมูลไปยังสเลฟ บิตอ่าน/เขียนจะเป็นค่าต่ำ หากมาสเตอร์ร้องขอข้อมูลจากสเลฟ บิตอ่าน/เขียนจะเป็นค่าสูง
เมื่ออุปกรณ์หลักตรวจพบบิต ACK จากอุปกรณ์สเลฟ เฟรมข้อมูลแรกก็พร้อมที่จะส่ง
เฟรมข้อมูลจะมีความยาว 8 บิตเสมอ และจะถูกส่งโดยบิตที่มีนัยสำคัญที่สุดก่อน แต่ละเฟรมข้อมูลจะตามด้วยบิต ACK/NACK ทันทีเพื่อตรวจสอบว่าได้รับเฟรมสำเร็จหรือไม่ บิต ACK จะต้องได้รับโดยมาสเตอร์หรือสเลฟ (ขึ้นอยู่กับอุปกรณ์ที่ส่งข้อมูล) ก่อนที่จะส่งเฟรมข้อมูลถัดไปได้
หลังจากส่งเฟรมข้อมูลทั้งหมดแล้ว มาสเตอร์สามารถส่งคำสั่งหยุดไปยังสเลฟเพื่อหยุดการส่งข้อมูลได้ คำสั่งหยุดนี้คือการเปลี่ยนแรงดันไฟฟ้าจากต่ำไปสูงบนสาย SDA ตามด้วยการเปลี่ยนแรงดันไฟฟ้าจากต่ำไปสูงบนสาย SCL ขณะที่สาย SCL ยังคงเป็นแรงดันสูง
1. อุปกรณ์หลักจะส่งเงื่อนไขเริ่มต้นไปยังอุปกรณ์สเลฟที่เชื่อมต่อทั้งหมดโดยเปลี่ยนสาย SDA จากแรงดันไฟฟ้าสูงเป็นต่ำ ก่อนที่ จะเปลี่ยนสาย SCL จากสูงเป็นต่ำ:
2. มาสเตอร์จะส่งที่อยู่ 7 หรือ 10 บิตของสเลฟที่ต้องการสื่อสารด้วยให้กับสเลฟแต่ละตัว พร้อมกับบิตอ่าน/เขียน:
3. สเลฟแต่ละตัวจะเปรียบเทียบแอดเดรสที่ส่งมาจากมาสเตอร์กับแอดเดรสของตัวเอง หากแอดเดรสตรงกัน สเลฟจะส่งคืนบิต ACK โดยการดึงสาย SDA ลงต่ำหนึ่งบิต หากแอดเดรสจากมาสเตอร์ไม่ตรงกับแอดเดรสของสเลฟ สเลฟจะยึดสาย SDA ไว้สูง
4. เซิร์ฟเวอร์ส่งหรือรับเฟรมข้อมูล:
5. หลังจากส่งเฟรมข้อมูลแต่ละเฟรมแล้ว อุปกรณ์รับจะส่งบิต ACK กลับมาอีกบิตหนึ่งให้กับผู้ส่งเพื่อยืนยันว่าได้รับเฟรมสำเร็จ:
6. เพื่อหยุดการส่งข้อมูล มาสเตอร์จะส่งเงื่อนไขหยุดไปยังสเลฟโดยเปลี่ยน SCL ให้เป็นระดับสูงก่อนที่จะเปลี่ยน SDA ให้เป็นระดับสูง:
เนื่องจาก I2C ใช้การกำหนดแอดเดรส จึงสามารถควบคุมสเลฟหลายตัวจากมาสเตอร์ตัวเดียวได้ การกำหนดแอดเดรสแบบ 7 บิตสามารถมีแอดเดรสที่ไม่ซ้ำกันได้ 128 (27) แอดเดรส การใช้การกำหนดแอดเดรสแบบ 10 บิตนั้นไม่เป็นที่นิยมนัก แต่จะมีแอดเดรสที่ไม่ซ้ำกัน 1,024 (210) แอดเดรส ในการเชื่อมต่อสเลฟหลายตัวเข้ากับมาสเตอร์ตัวเดียว ให้ต่อสายตามนี้ โดยใช้ตัวต้านทานแบบดึงขึ้น 4.7 กิโลโอห์ม เชื่อมต่อสาย SDA และ SCL เข้ากับ Vcc:
มาสเตอร์หลายตัวสามารถเชื่อมต่อกับสเลฟตัวเดียวหรือหลายตัวได้ ปัญหาของมาสเตอร์หลายตัวในระบบเดียวกันเกิดขึ้นเมื่อมาสเตอร์สองตัวพยายามส่งหรือรับข้อมูลพร้อมกันผ่านสาย SDA เพื่อแก้ปัญหานี้ มาสเตอร์แต่ละตัวต้องตรวจสอบว่าสาย SDA ต่ำหรือสูงก่อนทำการส่งสัญญาณ หากสาย SDA ต่ำ หมายความว่ามาสเตอร์อีกตัวหนึ่งกำลังควบคุมบัสอยู่ และมาสเตอร์ควรรอก่อนที่จะส่งข้อความ หากสาย SDA สูง แสดงว่าการส่งสัญญาณปลอดภัย ในการเชื่อมต่อมาสเตอร์หลายตัวเข้ากับสเลฟหลายตัว ให้ใช้แผนผังต่อไปนี้ โดยใช้ตัวดึงสัญญาณ 4.7 กิโลโอห์ม เชื่อมต่อสาย SDA และ SCL เข้ากับ Vcc:
I2C มีข้อดีมากมายที่ทำให้ดูซับซ้อนกว่าโปรโตคอลอื่น ๆ แต่ก็มีเหตุผลที่สมเหตุสมผลบางประการว่าทำไมคุณอาจต้องการหรือไม่ต้องการใช้ I2C เพื่อเชื่อมต่อกับอุปกรณ์เฉพาะ:
เอื้ออำนวย
ข้อเสีย