พื้นฐานของโปรโตคอลการสื่อสาร I2C

บทความนี้จะอธิบายโปรโตคอลการสื่อสาร I2C อย่างละเอียด พร้อมทั้งอธิบายหลักการพื้นฐานและการทำงานของโปรโตคอลดังกล่าวเพื่อการสื่อสารอุปกรณ์ที่มีประสิทธิภาพ

พื้นฐานของโปรโตคอลการสื่อสาร I2C

คุณอาจพบว่าตัวเองใช้ I2C หากคุณเคยสร้างโปรเจ็กต์ที่ใช้หน้าจอ OLED เซ็นเซอร์วัดความดันบรรยากาศ หรือโมดูลไจโรสโคป/เครื่องวัดความเร่ง

บทนำเกี่ยวกับการสื่อสาร I2C

I2C ผสานรวมคุณสมบัติที่ดีที่สุดของ SPI และ UART เข้าด้วยกัน ด้วย I2C คุณสามารถเชื่อมต่อสเลฟหลายตัวเข้ากับมาสเตอร์ตัวเดียว (เช่น SPI) และคุณสามารถมีมาสเตอร์หลายตัวควบคุมสเลฟหนึ่งตัวหรือมากกว่าได้ วิธีนี้มีประโยชน์อย่างมากหากคุณต้องการให้ไมโครคอนโทรลเลอร์มากกว่าหนึ่งตัวเขียนข้อมูลลงการ์ดหน่วยความจำหรือแสดงข้อความบนหน้าจอ LCD

เช่นเดียวกับการสื่อสาร UART, I2C ใช้เพียงสองสายในการส่งข้อมูลระหว่างอุปกรณ์:

SDA (ข้อมูลอนุกรม) – สายสำหรับอุปกรณ์หลักและรองในการส่งและรับข้อมูล

SCL (Serial Clock) – เส้นสัญญาณนาฬิกา

I2C เป็นโปรโตคอลการสื่อสารแบบอนุกรม ดังนั้นข้อมูลจะถูกส่งทีละบิตบนสายเส้นเดียว (สาย SDA)

เช่นเดียวกับ SPI, I2C เป็นโปรโตคอลแบบซิงโครนัส หมายความว่าเอาต์พุตของบิตจะซิงโครไนซ์กับการสุ่มตัวอย่างบิตโดยใช้สัญญาณนาฬิกาที่ใช้ร่วมกันระหว่างอุปกรณ์มาสเตอร์และสเลฟ สัญญาณนาฬิกาจะถูกควบคุมโดยอุปกรณ์มาสเตอร์เสมอ

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 ยังคงเป็นแรงดันสูง

ขั้นตอนการส่งข้อมูล I2C

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 มีข้อดีมากมายที่ทำให้ดูซับซ้อนกว่าโปรโตคอลอื่น ๆ แต่ก็มีเหตุผลที่สมเหตุสมผลบางประการว่าทำไมคุณอาจต้องการหรือไม่ต้องการใช้ I2C เพื่อเชื่อมต่อกับอุปกรณ์เฉพาะ:

เอื้ออำนวย

  • ใช้สายไฟเพียงสองเส้นเท่านั้น
  • รองรับเซิร์ฟเวอร์หลายตัวและไคลเอนต์หลายตัว
  • บิต ACK/NACK ยืนยันว่าแต่ละเฟรมถูกส่งสำเร็จ
  • ฮาร์ดแวร์ที่ซับซ้อนน้อยกว่า UART
  • โปรโตคอลที่รู้จักและใช้กันอย่างแพร่หลาย

ข้อเสีย

  • ความเร็วในการถ่ายโอนข้อมูลช้ากว่า SPI
  • ขนาดของเฟรมข้อมูลถูกจำกัดไว้ที่ 8 บิต
  • ต้องใช้ฮาร์ดแวร์ที่ซับซ้อนกว่า SPI ในการใช้งาน

พื้นฐานของโปรโตคอลการสื่อสาร I2C

บทความนี้จะอธิบายโปรโตคอลการสื่อสาร I2C อย่างละเอียด พร้อมทั้งอธิบายหลักการพื้นฐานและการทำงานของโปรโตคอลดังกล่าวเพื่อการสื่อสารอุปกรณ์ที่มีประสิทธิภาพ

นักเขียนบทความ
by 
นักเขียนบทความ
พื้นฐานของโปรโตคอลการสื่อสาร I2C

พื้นฐานของโปรโตคอลการสื่อสาร I2C

บทความนี้จะอธิบายโปรโตคอลการสื่อสาร I2C อย่างละเอียด พร้อมทั้งอธิบายหลักการพื้นฐานและการทำงานของโปรโตคอลดังกล่าวเพื่อการสื่อสารอุปกรณ์ที่มีประสิทธิภาพ

คุณอาจพบว่าตัวเองใช้ I2C หากคุณเคยสร้างโปรเจ็กต์ที่ใช้หน้าจอ OLED เซ็นเซอร์วัดความดันบรรยากาศ หรือโมดูลไจโรสโคป/เครื่องวัดความเร่ง

บทนำเกี่ยวกับการสื่อสาร I2C

I2C ผสานรวมคุณสมบัติที่ดีที่สุดของ SPI และ UART เข้าด้วยกัน ด้วย I2C คุณสามารถเชื่อมต่อสเลฟหลายตัวเข้ากับมาสเตอร์ตัวเดียว (เช่น SPI) และคุณสามารถมีมาสเตอร์หลายตัวควบคุมสเลฟหนึ่งตัวหรือมากกว่าได้ วิธีนี้มีประโยชน์อย่างมากหากคุณต้องการให้ไมโครคอนโทรลเลอร์มากกว่าหนึ่งตัวเขียนข้อมูลลงการ์ดหน่วยความจำหรือแสดงข้อความบนหน้าจอ LCD

เช่นเดียวกับการสื่อสาร UART, I2C ใช้เพียงสองสายในการส่งข้อมูลระหว่างอุปกรณ์:

SDA (ข้อมูลอนุกรม) – สายสำหรับอุปกรณ์หลักและรองในการส่งและรับข้อมูล

SCL (Serial Clock) – เส้นสัญญาณนาฬิกา

I2C เป็นโปรโตคอลการสื่อสารแบบอนุกรม ดังนั้นข้อมูลจะถูกส่งทีละบิตบนสายเส้นเดียว (สาย SDA)

เช่นเดียวกับ SPI, I2C เป็นโปรโตคอลแบบซิงโครนัส หมายความว่าเอาต์พุตของบิตจะซิงโครไนซ์กับการสุ่มตัวอย่างบิตโดยใช้สัญญาณนาฬิกาที่ใช้ร่วมกันระหว่างอุปกรณ์มาสเตอร์และสเลฟ สัญญาณนาฬิกาจะถูกควบคุมโดยอุปกรณ์มาสเตอร์เสมอ

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 ยังคงเป็นแรงดันสูง

ขั้นตอนการส่งข้อมูล I2C

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 มีข้อดีมากมายที่ทำให้ดูซับซ้อนกว่าโปรโตคอลอื่น ๆ แต่ก็มีเหตุผลที่สมเหตุสมผลบางประการว่าทำไมคุณอาจต้องการหรือไม่ต้องการใช้ I2C เพื่อเชื่อมต่อกับอุปกรณ์เฉพาะ:

เอื้ออำนวย

  • ใช้สายไฟเพียงสองเส้นเท่านั้น
  • รองรับเซิร์ฟเวอร์หลายตัวและไคลเอนต์หลายตัว
  • บิต ACK/NACK ยืนยันว่าแต่ละเฟรมถูกส่งสำเร็จ
  • ฮาร์ดแวร์ที่ซับซ้อนน้อยกว่า UART
  • โปรโตคอลที่รู้จักและใช้กันอย่างแพร่หลาย

ข้อเสีย

  • ความเร็วในการถ่ายโอนข้อมูลช้ากว่า SPI
  • ขนาดของเฟรมข้อมูลถูกจำกัดไว้ที่ 8 บิต
  • ต้องใช้ฮาร์ดแวร์ที่ซับซ้อนกว่า SPI ในการใช้งาน

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

พื้นฐานของโปรโตคอลการสื่อสาร I2C

พื้นฐานของโปรโตคอลการสื่อสาร I2C

บทความนี้จะอธิบายโปรโตคอลการสื่อสาร I2C อย่างละเอียด พร้อมทั้งอธิบายหลักการพื้นฐานและการทำงานของโปรโตคอลดังกล่าวเพื่อการสื่อสารอุปกรณ์ที่มีประสิทธิภาพ

Lorem ipsum dolor amet consectetur adipiscing elit tortor massa arcu non.

คุณอาจพบว่าตัวเองใช้ I2C หากคุณเคยสร้างโปรเจ็กต์ที่ใช้หน้าจอ OLED เซ็นเซอร์วัดความดันบรรยากาศ หรือโมดูลไจโรสโคป/เครื่องวัดความเร่ง

บทนำเกี่ยวกับการสื่อสาร I2C

I2C ผสานรวมคุณสมบัติที่ดีที่สุดของ SPI และ UART เข้าด้วยกัน ด้วย I2C คุณสามารถเชื่อมต่อสเลฟหลายตัวเข้ากับมาสเตอร์ตัวเดียว (เช่น SPI) และคุณสามารถมีมาสเตอร์หลายตัวควบคุมสเลฟหนึ่งตัวหรือมากกว่าได้ วิธีนี้มีประโยชน์อย่างมากหากคุณต้องการให้ไมโครคอนโทรลเลอร์มากกว่าหนึ่งตัวเขียนข้อมูลลงการ์ดหน่วยความจำหรือแสดงข้อความบนหน้าจอ LCD

เช่นเดียวกับการสื่อสาร UART, I2C ใช้เพียงสองสายในการส่งข้อมูลระหว่างอุปกรณ์:

SDA (ข้อมูลอนุกรม) – สายสำหรับอุปกรณ์หลักและรองในการส่งและรับข้อมูล

SCL (Serial Clock) – เส้นสัญญาณนาฬิกา

I2C เป็นโปรโตคอลการสื่อสารแบบอนุกรม ดังนั้นข้อมูลจะถูกส่งทีละบิตบนสายเส้นเดียว (สาย SDA)

เช่นเดียวกับ SPI, I2C เป็นโปรโตคอลแบบซิงโครนัส หมายความว่าเอาต์พุตของบิตจะซิงโครไนซ์กับการสุ่มตัวอย่างบิตโดยใช้สัญญาณนาฬิกาที่ใช้ร่วมกันระหว่างอุปกรณ์มาสเตอร์และสเลฟ สัญญาณนาฬิกาจะถูกควบคุมโดยอุปกรณ์มาสเตอร์เสมอ

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 ยังคงเป็นแรงดันสูง

ขั้นตอนการส่งข้อมูล I2C

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 มีข้อดีมากมายที่ทำให้ดูซับซ้อนกว่าโปรโตคอลอื่น ๆ แต่ก็มีเหตุผลที่สมเหตุสมผลบางประการว่าทำไมคุณอาจต้องการหรือไม่ต้องการใช้ I2C เพื่อเชื่อมต่อกับอุปกรณ์เฉพาะ:

เอื้ออำนวย

  • ใช้สายไฟเพียงสองเส้นเท่านั้น
  • รองรับเซิร์ฟเวอร์หลายตัวและไคลเอนต์หลายตัว
  • บิต ACK/NACK ยืนยันว่าแต่ละเฟรมถูกส่งสำเร็จ
  • ฮาร์ดแวร์ที่ซับซ้อนน้อยกว่า UART
  • โปรโตคอลที่รู้จักและใช้กันอย่างแพร่หลาย

ข้อเสีย

  • ความเร็วในการถ่ายโอนข้อมูลช้ากว่า SPI
  • ขนาดของเฟรมข้อมูลถูกจำกัดไว้ที่ 8 บิต
  • ต้องใช้ฮาร์ดแวร์ที่ซับซ้อนกว่า SPI ในการใช้งาน