การทดสอบและแก้ไขข้อผิดพลาดของบัสข้อมูลดิจิทัล I2C

เรียนรู้วิธีการทดสอบและแก้ไขข้อผิดพลาดในการสื่อสาร I²C และระบุปัญหาที่อาจขัดขวางการถ่ายโอนข้อมูลได้อย่างรวดเร็ว

การทดสอบและแก้ไขข้อผิดพลาดของบัสข้อมูลดิจิทัล I2C

คำว่า “บัส” (Bus) เป็นคำเก่าแก่ที่มีที่มาจากองค์ประกอบตัวนำซึ่งเป็นส่วนหนึ่งของระบบจ่ายไฟฟ้า โดยทั่วไปใช้เรียกตัวนำเฉพาะทางที่มีความยาวไม่มาก และแยกออกจากสายเคเบิลเหนือศีรษะหรือสายเคเบิลใต้ดิน โดยทั่วไป บัสในรูปแบบดั้งเดิมจะประกอบด้วยแท่งทองแดงเปลือย ซึ่งมักมีหน้าตัดเป็นรูปสี่เหลี่ยมผืนผ้า ติดตั้งอย่างมั่นคงอยู่ภายในตู้หรือโครงครอบ และสามารถรองรับการไหลของกระแสไฟฟ้าที่แรงดันไฟฟ้าสูงได้

จากบัสข้อมูลแบบขนานสู่แบบอนุกรม

ในทางตรงกันข้าม บัสข้อมูลในยุคแรกประกอบด้วยกลุ่มสายไฟหุ้มฉนวนที่จัดวางแบบขนาน โดยมีการต่อปลายสายด้วยการบัดกรีหรือขั้วต่อแบบเสียบ เมื่อเวลาผ่านไป มีการเปลี่ยนจากการส่งข้อมูลแบบขนานไปสู่การส่งข้อมูลแบบอนุกรมอย่างชัดเจน แม้ว่าการส่งแบบขนานจะยังคงถูกใช้งานอยู่ในบางกรณี การส่งข้อมูลแบบอนุกรมมีข้อได้เปรียบตรงที่ใช้สายไฟน้อยกว่า พร้อมทั้งมีภูมิคุ้มกันต่อสัญญาณรบกวนข้ามสาย (Crosstalk) สัญญาณรบกวน (Noise) และการสูญเสียข้อมูลได้ดีกว่า

ดิจิทัลบัสแต่ละประเภทมีวิธีการเข้าถึงและแสดงผลบนออสซิลโลสโคปที่แตกต่างกัน เพื่อใช้ในการแก้ไขปัญหา (Troubleshooting) หรือการออกแบบระบบ หนึ่งในดิจิทัลบัสที่ได้รับความนิยมอย่างแพร่หลายคือ I2C ซึ่งย่อมาจาก Inter-Integrated Circuit โดยรูปแบบตัวอักษรยกกำลังในชื่อ I²C เป็นเพียงรูปแบบการเขียนที่ใช้เป็นคำย่อ ไม่ได้หมายถึงการดำเนินการทางคณิตศาสตร์แต่อย่างใด

I2C คืออะไร?

I2C ซึ่งเปิดตัวครั้งแรกโดย Philips Semiconductor ในปี 1982 เป็นบัสอนุกรมแบบซิงโครนัส (Synchronous) แบบหลายมาสเตอร์-สเลฟ (Multimaster-Slave) แบบแพ็กเก็ตสวิตช์ (Packet-Switched) และแบบซิงเกิลเอนด์ (Single-Ended) ซึ่งใช้เชื่อมต่อวงจรรวม (IC) เข้ากับโปรเซสเซอร์ โดยทั่วไป I2C จะประกอบด้วยลายทองแดงบนแผ่นวงจรพิมพ์ (PCB) แต่ในบางกรณีอาจใช้สายไฟเชื่อมต่อระหว่างแผงวงจรหลายแผง

ตั้งแต่ปี 2006 เป็นต้นมา I2C ได้เปิดให้ใช้งานโดยไม่คิดค่าลิขสิทธิ์ (Open Source) ทำให้ผู้ผลิตทุกรายสามารถนำบัสนี้ไปใช้งานได้โดยไม่ต้องเสียค่าธรรมเนียม ยกเว้นในส่วนที่เกี่ยวข้องกับการขอที่อยู่สเลฟ (I2C Slave Address)

การทดสอบ I2C ด้วยออสซิลโลสโคป

การเชื่อมต่อ I2C กับออสซิลโลสโคป

ออสซิลโลสโคป Tektronix MDO3000 กำลังรับสัญญาณดิจิทัล I2C จากบอร์ดสาธิต Tektronix Demo 1

มีการเปลี่ยนผ่านจากการส่งข้อมูลแบบขนานไปสู่การส่งข้อมูลแบบอนุกรมอย่างมาก ซึ่งช่วยลดการใช้สายและเพิ่มประสิทธิภาพของระบบ อย่างไรก็ตาม สิ่งหนึ่งที่เป็นความท้าทายคือการแก้ไขปัญหาและการสร้างต้นแบบสำหรับระบบส่งข้อมูลแบบอนุกรมมีขั้นตอนการเรียนรู้ที่ค่อนข้างสูง เหตุผลหนึ่งคือมาสเตอร์และสเลฟทั้งหมดอาจต้องการส่งข้อมูลในเวลาเดียวกัน จึงจำเป็นต้องมีกลไกที่ซับซ้อนสำหรับจัดการและตัดสินว่าอุปกรณ์ใดจะสามารถเข้าถึงบัสได้

หลักการทำงานของบัส I2C แบบสองสาย

การเชื่อมต่อระหว่างมาสเตอร์และสเลฟผ่านสายสองเส้นเป็นพื้นฐานของ I2C โดยสามารถมีมาสเตอร์และสเลฟจำนวนเท่าใดก็ได้อยู่บนบัสอนุกรมสองสายเดียวกัน มาสเตอร์และสเลฟทั้งหมดจะเชื่อมต่อแบบขนานเข้ากับสายทั้งสองเส้น ลักษณะคล้ายกับการต่อเต้ารับหลายจุดเข้ากับวงจรไฟฟ้าภายในบ้าน

แรงดันลอจิก High จะถูกกำหนดไว้บนสายเส้นหนึ่ง และหากมาสเตอร์หรือสเลฟตัวใดทำการนำกระแส สายนั้นจะถูกดึงลงสู่ระดับ Low ในสายทั้งสองเส้น เส้นหนึ่งทำหน้าที่เป็นสายข้อมูลอนุกรม และอีกเส้นหนึ่งทำหน้าที่เป็นสายสัญญาณนาฬิกา ด้วยการควบคุมว่าจะนำกระแสหรือไม่นำกระแส มาสเตอร์หรือสเลฟแต่ละตัวจึงสามารถส่งข้อมูลที่อุปกรณ์อื่นบนบัสสามารถตรวจจับได้

มาสเตอร์ทุกตัวจะตรวจสอบบัสเพื่อค้นหาเงื่อนไข Start หรือ Stop หากมาสเตอร์ตัวหนึ่งกำลังใช้งานบัสอยู่ มาสเตอร์ตัวอื่นจะไม่สามารถเข้ามาขัดจังหวะการสื่อสารได้ หากมาสเตอร์สองตัวเริ่มส่งข้อมูลพร้อมกัน มาสเตอร์ที่ส่งข้อความไปยังสเลฟที่มีที่อยู่ต่ำกว่าจะได้รับสิทธิ์ในการเข้าถึงบัสก่อน

สายข้อมูล สัญญาณนาฬิกา และการกำหนดแอดเดรสของ I2C

โปรโตคอล 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 คือเริ่มจากการพัฒนามาสเตอร์ก่อน จากนั้นจึงทดสอบร่วมกับสเลฟสำหรับการทดสอบ ซึ่งโดยพื้นฐานแล้วเป็นวงจรจำลองที่จัดเตรียมจุดเชื่อมต่อสำหรับการทดสอบไว้ โดยทั่วไป แพลตฟอร์มที่ใช้สร้างสเลฟสำหรับการทดสอบคือไมโครคอนโทรลเลอร์ชนิดเดียวกับที่ใช้ในการพัฒนาสเลฟจริง

การทดสอบวงจร I2C โดยทั่วไปมุ่งเน้นไปที่ 3 ด้าน ได้แก่ คุณลักษณะทางไฟฟ้าของบัส การทำงานด้านเวลา (Timing) และการจัดการกับเงื่อนไขผิดปกติ (Exceptions)

ตัวอย่างเช่น อาจเกิดกรณีที่เวลาหน่วงระหว่าง SCL และ SDA ยาวนานเกินไป ในกรณีดังกล่าวอาจเกิดเงื่อนไข START หรือ STOP ที่ไม่ต้องการขึ้นระหว่างรูปแบบสัญญาณ I2C ที่กำลังส่ง ส่งผลให้สเลฟได้รับข้อความแตกต่างจากที่ตั้งใจ หรือทำให้ไม่ได้รับสัญญาณตอบรับ

ในทำนองเดียวกัน การทำงานที่ไม่สำเร็จอาจทำให้เกิดพัลส์ SCL ที่ขาดหายไปหรือเกิดขึ้นโดยไม่คาดคิด หากเกิดเหตุการณ์ที่ผิดปกติ การออกแบบจะทำให้เงื่อนไข START สามารถยกเลิกข้อความที่ส่งมาไม่ครบหรือผิดพลาดก่อนหน้านี้ และทำให้อุปกรณ์พร้อมรับข้อความใหม่อีกครั้ง

ปัญหาอื่นอาจเกิดขึ้นเมื่อมีการส่งข้อมูลน้อยกว่า 8 บิต ในกรณีนี้สเลฟจะรอข้อมูลส่วนที่เหลือ และตราบใดที่ยังไม่ได้รับบิตที่ 8 สเลฟจะไม่สร้างสัญญาณตอบรับ

เมื่อมีการดำเนินการแบบบล็อก (Block Operation) จำนวนไบต์ที่จะส่งหรือรับอาจถูกกำหนดไว้ล่วงหน้าในรีจิสเตอร์อีกตัวหนึ่ง หากจำนวนไบต์ที่ส่งหรือรับน้อยกว่าจำนวนที่คาดไว้ เครื่องสถานะ (State Machine) จะรอข้อมูลส่วนที่เหลือของข้อความ เงื่อนไข Start สามารถถูกสร้างขึ้นเพื่อข้ามสถานะการรอดังกล่าวได้

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

การใช้สเลฟจำลองสำหรับการทดสอบ

แนวทางทั่วไปคือการสร้างสเลฟจำลอง (Surrogate Slave) เพื่อใช้สนับสนุนการทดสอบมาสเตอร์ บทบาทหลักของสเลฟจำลองคือการทดสอบและตรวจสอบการทำงานของอินเทอร์เฟซ ดังนั้น สเลฟจำลองจึงอาจมีฟังก์ชันมากกว่าสเลฟที่ใช้งานจริง เพียงเพื่อรองรับวัตถุประสงค์ในการทดสอบ

อุปกรณ์และเครื่องมือสำหรับทดสอบ I2C

มีหลายวิธีในการทดสอบวงจร 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 แล้ว ยังรองรับ:

  • 1 × อินเทอร์เฟซ USB (Serial Emulation)
  • 1 × อินเทอร์เฟซ JTAG
  • 1 × SPI
  • 8 × อินพุต/เอาต์พุตดิจิทัลอเนกประสงค์ (GPIO)
  • 4 × ตัวแปลงสัญญาณแอนะล็อกเป็นดิจิทัล (ADC)

บอร์ดจะสื่อสารกับคอมพิวเตอร์โฮสต์ผ่าน CDC (USB Communications Device Class) ทำให้สามารถใช้งาน userial ได้ง่ายโดยไม่ต้องติดตั้งไดรเวอร์อุปกรณ์หรือไลบรารีเฉพาะ การใช้ส่วนติดต่อคำสั่งแบบ ASCII ช่วยให้สามารถควบคุมอุปกรณ์ด้วยตนเองผ่านโปรแกรมจำลองเทอร์มินัล (Terminal Emulator) ได้อย่างสะดวก

การทดสอบและแก้ไขข้อผิดพลาดของบัสข้อมูลดิจิทัล I2C

เรียนรู้วิธีการทดสอบและแก้ไขข้อผิดพลาดในการสื่อสาร I²C และระบุปัญหาที่อาจขัดขวางการถ่ายโอนข้อมูลได้อย่างรวดเร็ว

นักเขียนบทความ
by 
นักเขียนบทความ
การทดสอบและแก้ไขข้อผิดพลาดของบัสข้อมูลดิจิทัล I2C

การทดสอบและแก้ไขข้อผิดพลาดของบัสข้อมูลดิจิทัล I2C

เรียนรู้วิธีการทดสอบและแก้ไขข้อผิดพลาดในการสื่อสาร I²C และระบุปัญหาที่อาจขัดขวางการถ่ายโอนข้อมูลได้อย่างรวดเร็ว

คำว่า “บัส” (Bus) เป็นคำเก่าแก่ที่มีที่มาจากองค์ประกอบตัวนำซึ่งเป็นส่วนหนึ่งของระบบจ่ายไฟฟ้า โดยทั่วไปใช้เรียกตัวนำเฉพาะทางที่มีความยาวไม่มาก และแยกออกจากสายเคเบิลเหนือศีรษะหรือสายเคเบิลใต้ดิน โดยทั่วไป บัสในรูปแบบดั้งเดิมจะประกอบด้วยแท่งทองแดงเปลือย ซึ่งมักมีหน้าตัดเป็นรูปสี่เหลี่ยมผืนผ้า ติดตั้งอย่างมั่นคงอยู่ภายในตู้หรือโครงครอบ และสามารถรองรับการไหลของกระแสไฟฟ้าที่แรงดันไฟฟ้าสูงได้

จากบัสข้อมูลแบบขนานสู่แบบอนุกรม

ในทางตรงกันข้าม บัสข้อมูลในยุคแรกประกอบด้วยกลุ่มสายไฟหุ้มฉนวนที่จัดวางแบบขนาน โดยมีการต่อปลายสายด้วยการบัดกรีหรือขั้วต่อแบบเสียบ เมื่อเวลาผ่านไป มีการเปลี่ยนจากการส่งข้อมูลแบบขนานไปสู่การส่งข้อมูลแบบอนุกรมอย่างชัดเจน แม้ว่าการส่งแบบขนานจะยังคงถูกใช้งานอยู่ในบางกรณี การส่งข้อมูลแบบอนุกรมมีข้อได้เปรียบตรงที่ใช้สายไฟน้อยกว่า พร้อมทั้งมีภูมิคุ้มกันต่อสัญญาณรบกวนข้ามสาย (Crosstalk) สัญญาณรบกวน (Noise) และการสูญเสียข้อมูลได้ดีกว่า

ดิจิทัลบัสแต่ละประเภทมีวิธีการเข้าถึงและแสดงผลบนออสซิลโลสโคปที่แตกต่างกัน เพื่อใช้ในการแก้ไขปัญหา (Troubleshooting) หรือการออกแบบระบบ หนึ่งในดิจิทัลบัสที่ได้รับความนิยมอย่างแพร่หลายคือ I2C ซึ่งย่อมาจาก Inter-Integrated Circuit โดยรูปแบบตัวอักษรยกกำลังในชื่อ I²C เป็นเพียงรูปแบบการเขียนที่ใช้เป็นคำย่อ ไม่ได้หมายถึงการดำเนินการทางคณิตศาสตร์แต่อย่างใด

I2C คืออะไร?

I2C ซึ่งเปิดตัวครั้งแรกโดย Philips Semiconductor ในปี 1982 เป็นบัสอนุกรมแบบซิงโครนัส (Synchronous) แบบหลายมาสเตอร์-สเลฟ (Multimaster-Slave) แบบแพ็กเก็ตสวิตช์ (Packet-Switched) และแบบซิงเกิลเอนด์ (Single-Ended) ซึ่งใช้เชื่อมต่อวงจรรวม (IC) เข้ากับโปรเซสเซอร์ โดยทั่วไป I2C จะประกอบด้วยลายทองแดงบนแผ่นวงจรพิมพ์ (PCB) แต่ในบางกรณีอาจใช้สายไฟเชื่อมต่อระหว่างแผงวงจรหลายแผง

ตั้งแต่ปี 2006 เป็นต้นมา I2C ได้เปิดให้ใช้งานโดยไม่คิดค่าลิขสิทธิ์ (Open Source) ทำให้ผู้ผลิตทุกรายสามารถนำบัสนี้ไปใช้งานได้โดยไม่ต้องเสียค่าธรรมเนียม ยกเว้นในส่วนที่เกี่ยวข้องกับการขอที่อยู่สเลฟ (I2C Slave Address)

การทดสอบ I2C ด้วยออสซิลโลสโคป

การเชื่อมต่อ I2C กับออสซิลโลสโคป

ออสซิลโลสโคป Tektronix MDO3000 กำลังรับสัญญาณดิจิทัล I2C จากบอร์ดสาธิต Tektronix Demo 1

มีการเปลี่ยนผ่านจากการส่งข้อมูลแบบขนานไปสู่การส่งข้อมูลแบบอนุกรมอย่างมาก ซึ่งช่วยลดการใช้สายและเพิ่มประสิทธิภาพของระบบ อย่างไรก็ตาม สิ่งหนึ่งที่เป็นความท้าทายคือการแก้ไขปัญหาและการสร้างต้นแบบสำหรับระบบส่งข้อมูลแบบอนุกรมมีขั้นตอนการเรียนรู้ที่ค่อนข้างสูง เหตุผลหนึ่งคือมาสเตอร์และสเลฟทั้งหมดอาจต้องการส่งข้อมูลในเวลาเดียวกัน จึงจำเป็นต้องมีกลไกที่ซับซ้อนสำหรับจัดการและตัดสินว่าอุปกรณ์ใดจะสามารถเข้าถึงบัสได้

หลักการทำงานของบัส I2C แบบสองสาย

การเชื่อมต่อระหว่างมาสเตอร์และสเลฟผ่านสายสองเส้นเป็นพื้นฐานของ I2C โดยสามารถมีมาสเตอร์และสเลฟจำนวนเท่าใดก็ได้อยู่บนบัสอนุกรมสองสายเดียวกัน มาสเตอร์และสเลฟทั้งหมดจะเชื่อมต่อแบบขนานเข้ากับสายทั้งสองเส้น ลักษณะคล้ายกับการต่อเต้ารับหลายจุดเข้ากับวงจรไฟฟ้าภายในบ้าน

แรงดันลอจิก High จะถูกกำหนดไว้บนสายเส้นหนึ่ง และหากมาสเตอร์หรือสเลฟตัวใดทำการนำกระแส สายนั้นจะถูกดึงลงสู่ระดับ Low ในสายทั้งสองเส้น เส้นหนึ่งทำหน้าที่เป็นสายข้อมูลอนุกรม และอีกเส้นหนึ่งทำหน้าที่เป็นสายสัญญาณนาฬิกา ด้วยการควบคุมว่าจะนำกระแสหรือไม่นำกระแส มาสเตอร์หรือสเลฟแต่ละตัวจึงสามารถส่งข้อมูลที่อุปกรณ์อื่นบนบัสสามารถตรวจจับได้

มาสเตอร์ทุกตัวจะตรวจสอบบัสเพื่อค้นหาเงื่อนไข Start หรือ Stop หากมาสเตอร์ตัวหนึ่งกำลังใช้งานบัสอยู่ มาสเตอร์ตัวอื่นจะไม่สามารถเข้ามาขัดจังหวะการสื่อสารได้ หากมาสเตอร์สองตัวเริ่มส่งข้อมูลพร้อมกัน มาสเตอร์ที่ส่งข้อความไปยังสเลฟที่มีที่อยู่ต่ำกว่าจะได้รับสิทธิ์ในการเข้าถึงบัสก่อน

สายข้อมูล สัญญาณนาฬิกา และการกำหนดแอดเดรสของ I2C

โปรโตคอล 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 คือเริ่มจากการพัฒนามาสเตอร์ก่อน จากนั้นจึงทดสอบร่วมกับสเลฟสำหรับการทดสอบ ซึ่งโดยพื้นฐานแล้วเป็นวงจรจำลองที่จัดเตรียมจุดเชื่อมต่อสำหรับการทดสอบไว้ โดยทั่วไป แพลตฟอร์มที่ใช้สร้างสเลฟสำหรับการทดสอบคือไมโครคอนโทรลเลอร์ชนิดเดียวกับที่ใช้ในการพัฒนาสเลฟจริง

การทดสอบวงจร I2C โดยทั่วไปมุ่งเน้นไปที่ 3 ด้าน ได้แก่ คุณลักษณะทางไฟฟ้าของบัส การทำงานด้านเวลา (Timing) และการจัดการกับเงื่อนไขผิดปกติ (Exceptions)

ตัวอย่างเช่น อาจเกิดกรณีที่เวลาหน่วงระหว่าง SCL และ SDA ยาวนานเกินไป ในกรณีดังกล่าวอาจเกิดเงื่อนไข START หรือ STOP ที่ไม่ต้องการขึ้นระหว่างรูปแบบสัญญาณ I2C ที่กำลังส่ง ส่งผลให้สเลฟได้รับข้อความแตกต่างจากที่ตั้งใจ หรือทำให้ไม่ได้รับสัญญาณตอบรับ

ในทำนองเดียวกัน การทำงานที่ไม่สำเร็จอาจทำให้เกิดพัลส์ SCL ที่ขาดหายไปหรือเกิดขึ้นโดยไม่คาดคิด หากเกิดเหตุการณ์ที่ผิดปกติ การออกแบบจะทำให้เงื่อนไข START สามารถยกเลิกข้อความที่ส่งมาไม่ครบหรือผิดพลาดก่อนหน้านี้ และทำให้อุปกรณ์พร้อมรับข้อความใหม่อีกครั้ง

ปัญหาอื่นอาจเกิดขึ้นเมื่อมีการส่งข้อมูลน้อยกว่า 8 บิต ในกรณีนี้สเลฟจะรอข้อมูลส่วนที่เหลือ และตราบใดที่ยังไม่ได้รับบิตที่ 8 สเลฟจะไม่สร้างสัญญาณตอบรับ

เมื่อมีการดำเนินการแบบบล็อก (Block Operation) จำนวนไบต์ที่จะส่งหรือรับอาจถูกกำหนดไว้ล่วงหน้าในรีจิสเตอร์อีกตัวหนึ่ง หากจำนวนไบต์ที่ส่งหรือรับน้อยกว่าจำนวนที่คาดไว้ เครื่องสถานะ (State Machine) จะรอข้อมูลส่วนที่เหลือของข้อความ เงื่อนไข Start สามารถถูกสร้างขึ้นเพื่อข้ามสถานะการรอดังกล่าวได้

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

การใช้สเลฟจำลองสำหรับการทดสอบ

แนวทางทั่วไปคือการสร้างสเลฟจำลอง (Surrogate Slave) เพื่อใช้สนับสนุนการทดสอบมาสเตอร์ บทบาทหลักของสเลฟจำลองคือการทดสอบและตรวจสอบการทำงานของอินเทอร์เฟซ ดังนั้น สเลฟจำลองจึงอาจมีฟังก์ชันมากกว่าสเลฟที่ใช้งานจริง เพียงเพื่อรองรับวัตถุประสงค์ในการทดสอบ

อุปกรณ์และเครื่องมือสำหรับทดสอบ I2C

มีหลายวิธีในการทดสอบวงจร 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 แล้ว ยังรองรับ:

  • 1 × อินเทอร์เฟซ USB (Serial Emulation)
  • 1 × อินเทอร์เฟซ JTAG
  • 1 × SPI
  • 8 × อินพุต/เอาต์พุตดิจิทัลอเนกประสงค์ (GPIO)
  • 4 × ตัวแปลงสัญญาณแอนะล็อกเป็นดิจิทัล (ADC)

บอร์ดจะสื่อสารกับคอมพิวเตอร์โฮสต์ผ่าน CDC (USB Communications Device Class) ทำให้สามารถใช้งาน userial ได้ง่ายโดยไม่ต้องติดตั้งไดรเวอร์อุปกรณ์หรือไลบรารีเฉพาะ การใช้ส่วนติดต่อคำสั่งแบบ ASCII ช่วยให้สามารถควบคุมอุปกรณ์ด้วยตนเองผ่านโปรแกรมจำลองเทอร์มินัล (Terminal Emulator) ได้อย่างสะดวก

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

เรียนรู้วิธีการทดสอบและแก้ไขข้อผิดพลาดในการสื่อสาร I²C และระบุปัญหาที่อาจขัดขวางการถ่ายโอนข้อมูลได้อย่างรวดเร็ว

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

คำว่า “บัส” (Bus) เป็นคำเก่าแก่ที่มีที่มาจากองค์ประกอบตัวนำซึ่งเป็นส่วนหนึ่งของระบบจ่ายไฟฟ้า โดยทั่วไปใช้เรียกตัวนำเฉพาะทางที่มีความยาวไม่มาก และแยกออกจากสายเคเบิลเหนือศีรษะหรือสายเคเบิลใต้ดิน โดยทั่วไป บัสในรูปแบบดั้งเดิมจะประกอบด้วยแท่งทองแดงเปลือย ซึ่งมักมีหน้าตัดเป็นรูปสี่เหลี่ยมผืนผ้า ติดตั้งอย่างมั่นคงอยู่ภายในตู้หรือโครงครอบ และสามารถรองรับการไหลของกระแสไฟฟ้าที่แรงดันไฟฟ้าสูงได้

จากบัสข้อมูลแบบขนานสู่แบบอนุกรม

ในทางตรงกันข้าม บัสข้อมูลในยุคแรกประกอบด้วยกลุ่มสายไฟหุ้มฉนวนที่จัดวางแบบขนาน โดยมีการต่อปลายสายด้วยการบัดกรีหรือขั้วต่อแบบเสียบ เมื่อเวลาผ่านไป มีการเปลี่ยนจากการส่งข้อมูลแบบขนานไปสู่การส่งข้อมูลแบบอนุกรมอย่างชัดเจน แม้ว่าการส่งแบบขนานจะยังคงถูกใช้งานอยู่ในบางกรณี การส่งข้อมูลแบบอนุกรมมีข้อได้เปรียบตรงที่ใช้สายไฟน้อยกว่า พร้อมทั้งมีภูมิคุ้มกันต่อสัญญาณรบกวนข้ามสาย (Crosstalk) สัญญาณรบกวน (Noise) และการสูญเสียข้อมูลได้ดีกว่า

ดิจิทัลบัสแต่ละประเภทมีวิธีการเข้าถึงและแสดงผลบนออสซิลโลสโคปที่แตกต่างกัน เพื่อใช้ในการแก้ไขปัญหา (Troubleshooting) หรือการออกแบบระบบ หนึ่งในดิจิทัลบัสที่ได้รับความนิยมอย่างแพร่หลายคือ I2C ซึ่งย่อมาจาก Inter-Integrated Circuit โดยรูปแบบตัวอักษรยกกำลังในชื่อ I²C เป็นเพียงรูปแบบการเขียนที่ใช้เป็นคำย่อ ไม่ได้หมายถึงการดำเนินการทางคณิตศาสตร์แต่อย่างใด

I2C คืออะไร?

I2C ซึ่งเปิดตัวครั้งแรกโดย Philips Semiconductor ในปี 1982 เป็นบัสอนุกรมแบบซิงโครนัส (Synchronous) แบบหลายมาสเตอร์-สเลฟ (Multimaster-Slave) แบบแพ็กเก็ตสวิตช์ (Packet-Switched) และแบบซิงเกิลเอนด์ (Single-Ended) ซึ่งใช้เชื่อมต่อวงจรรวม (IC) เข้ากับโปรเซสเซอร์ โดยทั่วไป I2C จะประกอบด้วยลายทองแดงบนแผ่นวงจรพิมพ์ (PCB) แต่ในบางกรณีอาจใช้สายไฟเชื่อมต่อระหว่างแผงวงจรหลายแผง

ตั้งแต่ปี 2006 เป็นต้นมา I2C ได้เปิดให้ใช้งานโดยไม่คิดค่าลิขสิทธิ์ (Open Source) ทำให้ผู้ผลิตทุกรายสามารถนำบัสนี้ไปใช้งานได้โดยไม่ต้องเสียค่าธรรมเนียม ยกเว้นในส่วนที่เกี่ยวข้องกับการขอที่อยู่สเลฟ (I2C Slave Address)

การทดสอบ I2C ด้วยออสซิลโลสโคป

การเชื่อมต่อ I2C กับออสซิลโลสโคป

ออสซิลโลสโคป Tektronix MDO3000 กำลังรับสัญญาณดิจิทัล I2C จากบอร์ดสาธิต Tektronix Demo 1

มีการเปลี่ยนผ่านจากการส่งข้อมูลแบบขนานไปสู่การส่งข้อมูลแบบอนุกรมอย่างมาก ซึ่งช่วยลดการใช้สายและเพิ่มประสิทธิภาพของระบบ อย่างไรก็ตาม สิ่งหนึ่งที่เป็นความท้าทายคือการแก้ไขปัญหาและการสร้างต้นแบบสำหรับระบบส่งข้อมูลแบบอนุกรมมีขั้นตอนการเรียนรู้ที่ค่อนข้างสูง เหตุผลหนึ่งคือมาสเตอร์และสเลฟทั้งหมดอาจต้องการส่งข้อมูลในเวลาเดียวกัน จึงจำเป็นต้องมีกลไกที่ซับซ้อนสำหรับจัดการและตัดสินว่าอุปกรณ์ใดจะสามารถเข้าถึงบัสได้

หลักการทำงานของบัส I2C แบบสองสาย

การเชื่อมต่อระหว่างมาสเตอร์และสเลฟผ่านสายสองเส้นเป็นพื้นฐานของ I2C โดยสามารถมีมาสเตอร์และสเลฟจำนวนเท่าใดก็ได้อยู่บนบัสอนุกรมสองสายเดียวกัน มาสเตอร์และสเลฟทั้งหมดจะเชื่อมต่อแบบขนานเข้ากับสายทั้งสองเส้น ลักษณะคล้ายกับการต่อเต้ารับหลายจุดเข้ากับวงจรไฟฟ้าภายในบ้าน

แรงดันลอจิก High จะถูกกำหนดไว้บนสายเส้นหนึ่ง และหากมาสเตอร์หรือสเลฟตัวใดทำการนำกระแส สายนั้นจะถูกดึงลงสู่ระดับ Low ในสายทั้งสองเส้น เส้นหนึ่งทำหน้าที่เป็นสายข้อมูลอนุกรม และอีกเส้นหนึ่งทำหน้าที่เป็นสายสัญญาณนาฬิกา ด้วยการควบคุมว่าจะนำกระแสหรือไม่นำกระแส มาสเตอร์หรือสเลฟแต่ละตัวจึงสามารถส่งข้อมูลที่อุปกรณ์อื่นบนบัสสามารถตรวจจับได้

มาสเตอร์ทุกตัวจะตรวจสอบบัสเพื่อค้นหาเงื่อนไข Start หรือ Stop หากมาสเตอร์ตัวหนึ่งกำลังใช้งานบัสอยู่ มาสเตอร์ตัวอื่นจะไม่สามารถเข้ามาขัดจังหวะการสื่อสารได้ หากมาสเตอร์สองตัวเริ่มส่งข้อมูลพร้อมกัน มาสเตอร์ที่ส่งข้อความไปยังสเลฟที่มีที่อยู่ต่ำกว่าจะได้รับสิทธิ์ในการเข้าถึงบัสก่อน

สายข้อมูล สัญญาณนาฬิกา และการกำหนดแอดเดรสของ I2C

โปรโตคอล 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 คือเริ่มจากการพัฒนามาสเตอร์ก่อน จากนั้นจึงทดสอบร่วมกับสเลฟสำหรับการทดสอบ ซึ่งโดยพื้นฐานแล้วเป็นวงจรจำลองที่จัดเตรียมจุดเชื่อมต่อสำหรับการทดสอบไว้ โดยทั่วไป แพลตฟอร์มที่ใช้สร้างสเลฟสำหรับการทดสอบคือไมโครคอนโทรลเลอร์ชนิดเดียวกับที่ใช้ในการพัฒนาสเลฟจริง

การทดสอบวงจร I2C โดยทั่วไปมุ่งเน้นไปที่ 3 ด้าน ได้แก่ คุณลักษณะทางไฟฟ้าของบัส การทำงานด้านเวลา (Timing) และการจัดการกับเงื่อนไขผิดปกติ (Exceptions)

ตัวอย่างเช่น อาจเกิดกรณีที่เวลาหน่วงระหว่าง SCL และ SDA ยาวนานเกินไป ในกรณีดังกล่าวอาจเกิดเงื่อนไข START หรือ STOP ที่ไม่ต้องการขึ้นระหว่างรูปแบบสัญญาณ I2C ที่กำลังส่ง ส่งผลให้สเลฟได้รับข้อความแตกต่างจากที่ตั้งใจ หรือทำให้ไม่ได้รับสัญญาณตอบรับ

ในทำนองเดียวกัน การทำงานที่ไม่สำเร็จอาจทำให้เกิดพัลส์ SCL ที่ขาดหายไปหรือเกิดขึ้นโดยไม่คาดคิด หากเกิดเหตุการณ์ที่ผิดปกติ การออกแบบจะทำให้เงื่อนไข START สามารถยกเลิกข้อความที่ส่งมาไม่ครบหรือผิดพลาดก่อนหน้านี้ และทำให้อุปกรณ์พร้อมรับข้อความใหม่อีกครั้ง

ปัญหาอื่นอาจเกิดขึ้นเมื่อมีการส่งข้อมูลน้อยกว่า 8 บิต ในกรณีนี้สเลฟจะรอข้อมูลส่วนที่เหลือ และตราบใดที่ยังไม่ได้รับบิตที่ 8 สเลฟจะไม่สร้างสัญญาณตอบรับ

เมื่อมีการดำเนินการแบบบล็อก (Block Operation) จำนวนไบต์ที่จะส่งหรือรับอาจถูกกำหนดไว้ล่วงหน้าในรีจิสเตอร์อีกตัวหนึ่ง หากจำนวนไบต์ที่ส่งหรือรับน้อยกว่าจำนวนที่คาดไว้ เครื่องสถานะ (State Machine) จะรอข้อมูลส่วนที่เหลือของข้อความ เงื่อนไข Start สามารถถูกสร้างขึ้นเพื่อข้ามสถานะการรอดังกล่าวได้

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

การใช้สเลฟจำลองสำหรับการทดสอบ

แนวทางทั่วไปคือการสร้างสเลฟจำลอง (Surrogate Slave) เพื่อใช้สนับสนุนการทดสอบมาสเตอร์ บทบาทหลักของสเลฟจำลองคือการทดสอบและตรวจสอบการทำงานของอินเทอร์เฟซ ดังนั้น สเลฟจำลองจึงอาจมีฟังก์ชันมากกว่าสเลฟที่ใช้งานจริง เพียงเพื่อรองรับวัตถุประสงค์ในการทดสอบ

อุปกรณ์และเครื่องมือสำหรับทดสอบ I2C

มีหลายวิธีในการทดสอบวงจร 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 แล้ว ยังรองรับ:

  • 1 × อินเทอร์เฟซ USB (Serial Emulation)
  • 1 × อินเทอร์เฟซ JTAG
  • 1 × SPI
  • 8 × อินพุต/เอาต์พุตดิจิทัลอเนกประสงค์ (GPIO)
  • 4 × ตัวแปลงสัญญาณแอนะล็อกเป็นดิจิทัล (ADC)

บอร์ดจะสื่อสารกับคอมพิวเตอร์โฮสต์ผ่าน CDC (USB Communications Device Class) ทำให้สามารถใช้งาน userial ได้ง่ายโดยไม่ต้องติดตั้งไดรเวอร์อุปกรณ์หรือไลบรารีเฉพาะ การใช้ส่วนติดต่อคำสั่งแบบ ASCII ช่วยให้สามารถควบคุมอุปกรณ์ด้วยตนเองผ่านโปรแกรมจำลองเทอร์มินัล (Terminal Emulator) ได้อย่างสะดวก