เรียนรู้วิธีการทดสอบและแก้ไขข้อผิดพลาดในการสื่อสาร I²C และระบุปัญหาที่อาจขัดขวางการถ่ายโอนข้อมูลได้อย่างรวดเร็ว
คำว่า “บัส” (Bus) เป็นคำเก่าแก่ที่มีที่มาจากองค์ประกอบตัวนำซึ่งเป็นส่วนหนึ่งของระบบจ่ายไฟฟ้า โดยทั่วไปใช้เรียกตัวนำเฉพาะทางที่มีความยาวไม่มาก และแยกออกจากสายเคเบิลเหนือศีรษะหรือสายเคเบิลใต้ดิน โดยทั่วไป บัสในรูปแบบดั้งเดิมจะประกอบด้วยแท่งทองแดงเปลือย ซึ่งมักมีหน้าตัดเป็นรูปสี่เหลี่ยมผืนผ้า ติดตั้งอย่างมั่นคงอยู่ภายในตู้หรือโครงครอบ และสามารถรองรับการไหลของกระแสไฟฟ้าที่แรงดันไฟฟ้าสูงได้
ในทางตรงกันข้าม บัสข้อมูลในยุคแรกประกอบด้วยกลุ่มสายไฟหุ้มฉนวนที่จัดวางแบบขนาน โดยมีการต่อปลายสายด้วยการบัดกรีหรือขั้วต่อแบบเสียบ เมื่อเวลาผ่านไป มีการเปลี่ยนจากการส่งข้อมูลแบบขนานไปสู่การส่งข้อมูลแบบอนุกรมอย่างชัดเจน แม้ว่าการส่งแบบขนานจะยังคงถูกใช้งานอยู่ในบางกรณี การส่งข้อมูลแบบอนุกรมมีข้อได้เปรียบตรงที่ใช้สายไฟน้อยกว่า พร้อมทั้งมีภูมิคุ้มกันต่อสัญญาณรบกวนข้ามสาย (Crosstalk) สัญญาณรบกวน (Noise) และการสูญเสียข้อมูลได้ดีกว่า
ดิจิทัลบัสแต่ละประเภทมีวิธีการเข้าถึงและแสดงผลบนออสซิลโลสโคปที่แตกต่างกัน เพื่อใช้ในการแก้ไขปัญหา (Troubleshooting) หรือการออกแบบระบบ หนึ่งในดิจิทัลบัสที่ได้รับความนิยมอย่างแพร่หลายคือ I2C ซึ่งย่อมาจาก Inter-Integrated Circuit โดยรูปแบบตัวอักษรยกกำลังในชื่อ I²C เป็นเพียงรูปแบบการเขียนที่ใช้เป็นคำย่อ ไม่ได้หมายถึงการดำเนินการทางคณิตศาสตร์แต่อย่างใด
I2C ซึ่งเปิดตัวครั้งแรกโดย Philips Semiconductor ในปี 1982 เป็นบัสอนุกรมแบบซิงโครนัส (Synchronous) แบบหลายมาสเตอร์-สเลฟ (Multimaster-Slave) แบบแพ็กเก็ตสวิตช์ (Packet-Switched) และแบบซิงเกิลเอนด์ (Single-Ended) ซึ่งใช้เชื่อมต่อวงจรรวม (IC) เข้ากับโปรเซสเซอร์ โดยทั่วไป I2C จะประกอบด้วยลายทองแดงบนแผ่นวงจรพิมพ์ (PCB) แต่ในบางกรณีอาจใช้สายไฟเชื่อมต่อระหว่างแผงวงจรหลายแผง
ตั้งแต่ปี 2006 เป็นต้นมา I2C ได้เปิดให้ใช้งานโดยไม่คิดค่าลิขสิทธิ์ (Open Source) ทำให้ผู้ผลิตทุกรายสามารถนำบัสนี้ไปใช้งานได้โดยไม่ต้องเสียค่าธรรมเนียม ยกเว้นในส่วนที่เกี่ยวข้องกับการขอที่อยู่สเลฟ (I2C Slave Address)
การเชื่อมต่อ I2C กับออสซิลโลสโคป
ออสซิลโลสโคป Tektronix MDO3000 กำลังรับสัญญาณดิจิทัล I2C จากบอร์ดสาธิต Tektronix Demo 1
มีการเปลี่ยนผ่านจากการส่งข้อมูลแบบขนานไปสู่การส่งข้อมูลแบบอนุกรมอย่างมาก ซึ่งช่วยลดการใช้สายและเพิ่มประสิทธิภาพของระบบ อย่างไรก็ตาม สิ่งหนึ่งที่เป็นความท้าทายคือการแก้ไขปัญหาและการสร้างต้นแบบสำหรับระบบส่งข้อมูลแบบอนุกรมมีขั้นตอนการเรียนรู้ที่ค่อนข้างสูง เหตุผลหนึ่งคือมาสเตอร์และสเลฟทั้งหมดอาจต้องการส่งข้อมูลในเวลาเดียวกัน จึงจำเป็นต้องมีกลไกที่ซับซ้อนสำหรับจัดการและตัดสินว่าอุปกรณ์ใดจะสามารถเข้าถึงบัสได้
การเชื่อมต่อระหว่างมาสเตอร์และสเลฟผ่านสายสองเส้นเป็นพื้นฐานของ I2C โดยสามารถมีมาสเตอร์และสเลฟจำนวนเท่าใดก็ได้อยู่บนบัสอนุกรมสองสายเดียวกัน มาสเตอร์และสเลฟทั้งหมดจะเชื่อมต่อแบบขนานเข้ากับสายทั้งสองเส้น ลักษณะคล้ายกับการต่อเต้ารับหลายจุดเข้ากับวงจรไฟฟ้าภายในบ้าน
แรงดันลอจิก High จะถูกกำหนดไว้บนสายเส้นหนึ่ง และหากมาสเตอร์หรือสเลฟตัวใดทำการนำกระแส สายนั้นจะถูกดึงลงสู่ระดับ Low ในสายทั้งสองเส้น เส้นหนึ่งทำหน้าที่เป็นสายข้อมูลอนุกรม และอีกเส้นหนึ่งทำหน้าที่เป็นสายสัญญาณนาฬิกา ด้วยการควบคุมว่าจะนำกระแสหรือไม่นำกระแส มาสเตอร์หรือสเลฟแต่ละตัวจึงสามารถส่งข้อมูลที่อุปกรณ์อื่นบนบัสสามารถตรวจจับได้
มาสเตอร์ทุกตัวจะตรวจสอบบัสเพื่อค้นหาเงื่อนไข Start หรือ Stop หากมาสเตอร์ตัวหนึ่งกำลังใช้งานบัสอยู่ มาสเตอร์ตัวอื่นจะไม่สามารถเข้ามาขัดจังหวะการสื่อสารได้ หากมาสเตอร์สองตัวเริ่มส่งข้อมูลพร้อมกัน มาสเตอร์ที่ส่งข้อความไปยังสเลฟที่มีที่อยู่ต่ำกว่าจะได้รับสิทธิ์ในการเข้าถึงบัสก่อน
โปรโตคอล I2C ทำงานผ่านสายข้อมูลแบบสองทิศทางที่เรียกว่า SDA ซึ่งใช้รับรูปแบบสัญญาณ I2C และส่งสัญญาณตอบรับ (Acknowledgment) เมื่อการสื่อสารสำเร็จ และสายสัญญาณนาฬิกาที่เรียกว่า SCL อุปกรณ์สเลฟแต่ละตัวจะถูกระบุด้วยแอดเดรสขนาด 7 บิตที่แตกต่างกัน
การถ่ายโอนข้อมูลจะเริ่มต้นด้วยเงื่อนไข Start (ขอบขาลงของ SDA ในขณะที่ SCL อยู่ในระดับ High) และสิ้นสุดด้วยเงื่อนไข Stop (ขอบขาขึ้นของ SDA ในขณะที่ SCL อยู่ในระดับ High)
คำสั่งจะถูกส่งผ่าน SDA เป็นบล็อกขนาด 1 ไบต์ โดยบิตแรกเป็นบิตที่มีนัยสำคัญสูงสุด (Most Significant Bit หรือ MSB) บิตของ SDA จะต้องคงที่ในขณะที่ SCL อยู่ในระดับ High และจะต้องเปลี่ยนแปลงในขณะที่ SCL อยู่ในระดับ Low หากบิตของ SDA ไม่คงที่ในขณะที่ SCL อยู่ในระดับ High สถานการณ์ดังกล่าวจะถูกตีความว่าเป็นเงื่อนไข Stop หรือ Start ซึ่งอาจเป็นสาเหตุทั่วไปของข้อความที่เสียหายหรือการไม่ได้รับสัญญาณตอบรับ
จำนวนไบต์ที่สามารถส่งได้ไม่มีการกำหนดจำนวนสูงสุด โดยแต่ละไบต์จะต้องตามด้วยบิตตอบรับจากสเลฟ เพื่อยืนยันว่าได้รับไบต์นั้นสำเร็จ
แนวทางทั่วไปในการออกแบบวงจร I2C คือเริ่มจากการพัฒนามาสเตอร์ก่อน จากนั้นจึงทดสอบร่วมกับสเลฟสำหรับการทดสอบ ซึ่งโดยพื้นฐานแล้วเป็นวงจรจำลองที่จัดเตรียมจุดเชื่อมต่อสำหรับการทดสอบไว้ โดยทั่วไป แพลตฟอร์มที่ใช้สร้างสเลฟสำหรับการทดสอบคือไมโครคอนโทรลเลอร์ชนิดเดียวกับที่ใช้ในการพัฒนาสเลฟจริง
การทดสอบวงจร I2C โดยทั่วไปมุ่งเน้นไปที่ 3 ด้าน ได้แก่ คุณลักษณะทางไฟฟ้าของบัส การทำงานด้านเวลา (Timing) และการจัดการกับเงื่อนไขผิดปกติ (Exceptions)
ตัวอย่างเช่น อาจเกิดกรณีที่เวลาหน่วงระหว่าง SCL และ SDA ยาวนานเกินไป ในกรณีดังกล่าวอาจเกิดเงื่อนไข START หรือ STOP ที่ไม่ต้องการขึ้นระหว่างรูปแบบสัญญาณ I2C ที่กำลังส่ง ส่งผลให้สเลฟได้รับข้อความแตกต่างจากที่ตั้งใจ หรือทำให้ไม่ได้รับสัญญาณตอบรับ
ในทำนองเดียวกัน การทำงานที่ไม่สำเร็จอาจทำให้เกิดพัลส์ SCL ที่ขาดหายไปหรือเกิดขึ้นโดยไม่คาดคิด หากเกิดเหตุการณ์ที่ผิดปกติ การออกแบบจะทำให้เงื่อนไข START สามารถยกเลิกข้อความที่ส่งมาไม่ครบหรือผิดพลาดก่อนหน้านี้ และทำให้อุปกรณ์พร้อมรับข้อความใหม่อีกครั้ง
ปัญหาอื่นอาจเกิดขึ้นเมื่อมีการส่งข้อมูลน้อยกว่า 8 บิต ในกรณีนี้สเลฟจะรอข้อมูลส่วนที่เหลือ และตราบใดที่ยังไม่ได้รับบิตที่ 8 สเลฟจะไม่สร้างสัญญาณตอบรับ
เมื่อมีการดำเนินการแบบบล็อก (Block Operation) จำนวนไบต์ที่จะส่งหรือรับอาจถูกกำหนดไว้ล่วงหน้าในรีจิสเตอร์อีกตัวหนึ่ง หากจำนวนไบต์ที่ส่งหรือรับน้อยกว่าจำนวนที่คาดไว้ เครื่องสถานะ (State Machine) จะรอข้อมูลส่วนที่เหลือของข้อความ เงื่อนไข Start สามารถถูกสร้างขึ้นเพื่อข้ามสถานะการรอดังกล่าวได้
นอกจากนี้ มาสเตอร์จะต้องสามารถทำงานร่วมกับคุณลักษณะด้านการตอบสนองและเวลา (Timing) ของสเลฟได้อย่างเหมาะสม ความไวต่อปัญหาเหล่านี้โดยทั่วไปสามารถระบุได้จากการทดสอบมากกว่าการวิเคราะห์เพียงอย่างเดียว โดยเฉพาะอย่างยิ่ง สเลฟอาจส่งคำขอฉุกเฉินหรือสัญญาณอินเทอร์รัปต์ไปยังมาสเตอร์ การทดสอบว่าเหตุการณ์เหล่านี้เกิดขึ้นอย่างไรและมาสเตอร์ตอบสนองอย่างไร อาจช่วยเปิดเผยปัญหาที่ซ่อนอยู่ในอินเทอร์เฟซ I2C ได้
แนวทางทั่วไปคือการสร้างสเลฟจำลอง (Surrogate Slave) เพื่อใช้สนับสนุนการทดสอบมาสเตอร์ บทบาทหลักของสเลฟจำลองคือการทดสอบและตรวจสอบการทำงานของอินเทอร์เฟซ ดังนั้น สเลฟจำลองจึงอาจมีฟังก์ชันมากกว่าสเลฟที่ใช้งานจริง เพียงเพื่อรองรับวัตถุประสงค์ในการทดสอบ
มีหลายวิธีในการทดสอบวงจร I2C วิธีหนึ่งคือการใช้บอร์ด Tektronix Demo 1 ซึ่งออกแบบมาให้ใช้งานร่วมกับออสซิลโลสโคป Tektronix MSO4000 แต่สามารถใช้งานได้ดีกับรุ่น MDO3000 เช่นกัน บอร์ดนี้ให้สัญญาณจาก Serial Bus หลายประเภท รวมถึงขั้วต่อเฉพาะสำหรับ I2C
บอร์ดมาพร้อมกับสาย USB แบบ T-Type ซึ่งมีหัวต่อ USB Type-A สองหัวที่ปลายด้านหนึ่ง โดยต้องเสียบหัวต่อทั้งสองเข้ากับพอร์ต USB แยกกันบนออสซิลโลสโคป เพื่อให้สามารถรองรับกระแสไฟฟ้าได้เพียงพอ
LED สีแดง 1 ดวงและ LED สีเขียว 2 ดวงจะแสดงสถานะว่าบอร์ดได้รับไฟเลี้ยงและพร้อมใช้งาน เมื่อได้ทดลองรับสัญญาณ Serial Bus ของ I2C จากบอร์ดสาธิตแล้ว คุณสามารถเชื่อมต่อโพรบเข้ากับจุดทดสอบที่คล้ายกันในอุปกรณ์ที่ไม่ทำงาน โดยควรตรวจสอบแผนผังวงจรและเอกสารข้อมูล (Datasheet) ประกอบ เพื่อดูว่าจะต้องเชื่อมต่อและตั้งค่าอย่างไรจึงจะสามารถรับสัญญาณได้
Bus Pirate
อีกหนึ่งวิธีที่มีต้นทุนไม่สูงนัก (ประมาณ 1000 บาท) สำหรับการทดสอบวงจร I2C คือ Bus Pirate ซึ่งเป็นอินเทอร์เฟซบัสอเนกประสงค์ที่สามารถสื่อสารกับชิปส่วนใหญ่ผ่านเทอร์มินัลแบบอนุกรมบนคอมพิวเตอร์ โดยรองรับโปรโตคอลอนุกรมหลายประเภทที่แรงดัน 0–5.5 V
Bus Pirate ยังมีฟังก์ชันที่เป็นประโยชน์หลายอย่าง เช่น โพรบวัดแรงดัน 0–6 V การวัดความถี่ตั้งแต่ 1 Hz ถึง 40 MHz เครื่องกำเนิด PWM/ความถี่ตั้งแต่ 1 kHz ถึง 4 MHz ตัวต้านทาน Pull-up แบบหลายแรงดันที่ติดตั้งอยู่บนบอร์ด มาโครสำหรับคำสั่งที่ใช้บ่อย เครื่องดักจับทราฟฟิกบนบัส (Bus Traffic Sniffer) Bootloader สำหรับอัปเดตเฟิร์มแวร์ได้อย่างสะดวก เครื่องวิเคราะห์ลอจิกที่รองรับ SUMP ตั้งแต่ 10 Hz ถึง 1 MHz และฟังก์ชันอื่น ๆ ที่เป็นประโยชน์อีกมากมาย
Arduino Leonardo
อีกหนึ่งแนวทางสำหรับการทดสอบแบบโอเพนซอร์สเรียกว่า userial ซึ่งเป็นบริดจ์ USB-to-I2C/SPI/GPIO แบบไม่มีค่าใช้จ่าย โดยใช้ชิป Atmel ที่อยู่บนบอร์ด Arduino Leonardo นอกจาก I2C แล้ว ยังรองรับ:
บอร์ดจะสื่อสารกับคอมพิวเตอร์โฮสต์ผ่าน CDC (USB Communications Device Class) ทำให้สามารถใช้งาน userial ได้ง่ายโดยไม่ต้องติดตั้งไดรเวอร์อุปกรณ์หรือไลบรารีเฉพาะ การใช้ส่วนติดต่อคำสั่งแบบ ASCII ช่วยให้สามารถควบคุมอุปกรณ์ด้วยตนเองผ่านโปรแกรมจำลองเทอร์มินัล (Terminal Emulator) ได้อย่างสะดวก