I2C เป็นการสื่อสารผ่านสายแบบอนุกรม (Serial) คืออุปกรณ์หลายตัวต่ออยู่บนสายชุดเดียวกัน อุปกรณ์ Master เป็นตัวควบคุมการรับส่งข้อมูลภายในสาย อุปกรณ์ที่นำมาต่อบนสายเส้นเดียวกันที่ไม่ใช่ Master ถูกเรียกว่า Slave โดย Slave มีเลขประจำตัวของตัวเองที่ไม่ซ้ำกับตัวอื่นในสายเส้นเดียวกัน เมื่อ Master ต้องการคุยกับ Slave ตัวใด จะส่งหมายเลขประจำตัวของ Slave ออกไปก่อน หลักการทำงานของ I2C แบบละเอียดสามารถดูได้จากรูปคลื่นสัญญาณทางไฟฟ้า เมื่อเข้าใจรูปคลื่นแล้วการประยุกต์ใช้ต่อก็จะทำได้ง่ายขึ้น ในบทความนี้จึงอธิบายหลักการทำงานของ I2C โดยใช้รูปสัญญาณไฟฟ้าเป็นหลัก
สายไฟของ I2C
I2C ประกอบด้วยสายไฟ 2 เส้น คือ SDA (Serial Data Line) ใช้ในการรับ-ส่งข้อมูล และ Serial Clock Line (SCL) ใช้กำหนดจังหวะการรับ-ส่งข้อมูล โดยการเข้าควบคุมสายไฟทั้ง 2 เส้นของ Master และ Slave มีกฏดังนี้
ทั้ง Master และ Slave จะดึงสัญญาณลอจิกของขา SDA และ SCL ให้เป็น 0 ได้เท่านั้น ไม่สามารถดึงสัญญาณขึ้นให้เป็น 1 ได้ - วงจรภายในของไมโครคอนโทรลเลอร์ทั้งขา SDA และ SCL เป็นแบบ Open Drain คือสามารถดึงสัญญาณลงกราว์ดเพื่อส่งลอจิก 0 ได้ ส่วนการส่งลอจิก 1 เพียงปล่อยให้ SDA, SCL ลอย ตัวต้านทาน Pull-Up จะทำหน้าที่ดึงสัญญาณขา SDA, SCL ให้เป็น 1 เอง
มีเฉพาะ Master เท่านั้นที่สามารถควบคุม SCL ได้ - การรับ-ส่งข้อมูลทุกครั้ง ฝั่ง Master เป็นคนกำหนดจังหวะ จึงมีเฉพาะ Master เท่านั้นที่สั่งให้ดึง SCL เป็นลอจิก 0 หรือปล่อยลอยเป็นลอจิก 1 ส่วนฝั่ง Slave มีหน้าที่อ่านสาย SCL แล้วทำงานตามจังหวะที่ Master กำหนดเท่านั้น
ทั้ง Master และ Slave เข้าควบคุมสาย SDA ได้ แต่ Slave จะเข้าควบคุมได้เฉพาะบางจังหวะเท่านั้น
ในระหว่างรับ-ส่งข้อมูล สาย SDA จะเปลี่ยนลอจิกจาก 0 เป็น 1 หรือจาก 1 เป็น 0 ได้เฉพาะตอนที่สาย SCL มีสถานะเป็น 0 เท่านั้น - หากสาย SDA เปลี่ยนสถานะจาก 0 เป็น 1 หรือจาก 1 เป็น 0 ตอนสาย SCL เป็นลอจิก 1 แสดงว่าเป็นสัญญาณเริ่มต้น (Start) หรือเป็นสัญญาณจบ (Stop)
การเริ่มต้นส่งข้อมูล (Start)
ในสถานะว่าง (Idle) ไม่มีการรับ-ส่งข้อมูล ทั้ง SDA และ SCL มีสถานะเป็น 1 ค้างทั้งคู่ เมื่อเริ่มมีการสื่อสารเกิดขึ้น ขา SDA จะเปลี่ยนลอจิกจาก 1 เป็น 0 ในขณะที่ SCL ยังมีสถานะเป็น 1 ค้างอยู่
การรับ-ส่งข้อมูล
ใน 1 เฟรม จะประกอบด้วยข้อมูล 8 บิต และ ACK/NACK อีก 1 บิต รวมการรับ-ส่งข้อมูล 1 เฟรม มี 9 บิต
หลักจาก Master ส่งสัญญาณเริ่มต้น (Start) ออกไป เฟรมแรกสุดจะต้องเป็นหมายเลขของ Slave ที่จะสื่อสารในบิตที่ 7 ถึงบิตที่ 1 และทิศทางการรับส่งข้อมูลในบิตที่ 0 (R/^W bit : Read / ^Write bit) หากในรอบนั้น Master ต้องการส่งข้อมูลไป Slave ... ในบิตที่ 0 จะกำหนดเป็น 0 (^W) ... หากในรอบนั้น Master ต้องการรับข้อมูลจาก Slave ... ในบิตที่ 0 จะกำหนดเป็น 1 (R) จากนั้น Master จึงปล่อยลอยสาย SDA .... หาก Slave หมายเลขที่กำหนดมีอยู่จริง ตัว Slave จะเข้าควบคุมสาย SDA แทน โดยดึงสัญญาณสาย SDA ให้เป็น 0 เพื่อบอก Master ว่าพร้อมรับ-ส่งข้อมูลแล้ว เมื่อ Master ส่งสัญญาณที่ขา SCL จาก 0 -> 1 -> 0 ทางฝั่ง Slave จะปล่อยลอยสาย SDA แล้ว Master จะกลับมาควบคุมสาย SDA อีกครั้ง หลังจากนั้นหากมีการรับ-ส่งข้อมูล ก็จะรับ-ส่งกันต่อไป หากไม่มีมีการรับ-ส่งข้อมูล ก็จะส่งสัญญาณสิ้นสุด (Stop) ออกไป
การสิ้นสุดการส่งข้อมูล (Stop)
หากรับ-ส่งข้อมูลเรียบร้อยแล้ว ฝั่ง Master จะปล่อยสาย SCL ให้ลอยก่อน จากนั้นจึงปล่อยสาย SDA ให้ลอยตาม เพื่อเป็นการส่งสัญญาณ Stop บอกฝั่ง Slave ทุกตัวว่าจบการรับ-ส่งข้อมูลในรอบนั้นแล้ว
สรุป
อินเตอร์เฟส I2C มีสายไฟ 2 เส้น คือ SDA ไว้รับ-ส่งข้อมูล และ SCL ไว้ส่งสัญญาณกำหนดจังหวะการรับ-ส่งข้อมูล แบ่งการทำงานเป็น 3 จังหวะ คือจังหวะเริ่มต้นส่งข้อมูล (Start) จังหวะรับ-ส่งข้อมูล และจังหวะสิ้นสุดการส่งข้อมูล (Stop)
หากผู้อ่านสนใจเจาะลึกรายละเอียด เรียนกันแบบตัวต่อตัว สามารถลงทะเบียนคอร์ส การอินเตอร์เฟสและการดีบัคได้ เรียนแบบ onsite ที่ GLAB ใกล้เซ็นทรัลลาดพร้าว ค่าสมัคร 500 บาท สำหรับท่านที่นำอุปกรณ์มาเอง และ 2,700 บาท สำหรับท่านที่ GLAB เตรียมอุปกรณ์ให้ ศึกษารายละเอียอดคอร์ส คลิกที่นี่ หรือสมัครเข้าอบรม คลิกที่นี่
.
ขาดตกบกพร่องประการใด ต้องขออภัยมา ณ ที่นี้ด้วย หรือมีข้อมูลเพิ่มเติมคอมเม้นได้ด้านล่างนี้
Comments