อินเทอร์เฟซสองสาย: แอดเดรส เพจ แบงก์ และจังหวะเวลา
โมดูลถอดเสียบทุกตัวถูกจัดการผ่านสายสองเส้นแบบเดียวกัน — สายสัญญาณนาฬิกาแบบอนุกรมและสายข้อมูลแบบอนุกรม — โดยใช้โพรโทคอล I²C ซึ่งสเปกเรียกว่า อินเทอร์เฟซสองสาย (TWI) สิ่งที่ต่างกันระหว่างโมดูล SFP, QSFP, XFP และ CMIS คือวิธีจัดระเบียบพื้นที่แอดเดรสบนโพรโทคอลนี้: อุปกรณ์แยกกัน, หน่วยความจำแบบแบ่งเพจ, หรือแบงก์ของเพจ เนื้อหานี้คือมุมมองระดับโพรโทคอลที่เครื่องโปรแกรม โฮสต์ และ CodingBox ต่างก็พึ่งพา
ชั้นกายภาพ
- สายแบบโอเพนเดรนสองเส้น คือ SCL และ SDA ถูกพูลอัพที่ฝั่งโฮสต์; ลอจิก 3.3 V
- โมดูลเป็นลูกข่ายเสมอ; โฮสต์ (หรือเครื่องโปรแกรม) เป็นมาสเตอร์และสร้างสัญญาณนาฬิกา
- โมดูลอาจยืดสัญญาณนาฬิกา (กด SCL ให้ต่ำค้างไว้) ระหว่างที่ไมโครคอนโทรลเลอร์กำลังดึงข้อมูล — สเปกอนุญาตให้นานได้ถึง 500 µs
- การตรวจจับการเสียบและการเลือกใช้ขาแยกต่างหาก ไม่ใช่ธุรกรรมบนบัส: MOD_ABS (SFP), ModPrsL และ ModSelL (กลุ่ม QSFP และ CMIS) ModSelL ทำให้โมดูลหลายตัวใช้บัสเดียวกันร่วมกันได้; SFP ไม่มีขาเลือก ดังนั้นโฮสต์จึงให้แต่ละเคจมีบัสของตัวเองหรือใช้มัลติเพล็กเซอร์
พื้นที่แอดเดรสตามสเปก
| ตระกูล | แอดเดรสอุปกรณ์ (เขียน 8 บิต / 7 บิต) | การจัดระเบียบ | การเลือกเพจ |
|---|---|---|---|
| SFP, SFP+, SFP28 (SFF-8472) | A0h / 50h ข้อมูลระบุตัวตน, A2h / 51h การวินิจฉัย | A0h: 256 ไบต์แบบแฟลต; A2h: 128 ไบต์แบบแฟลต + ครึ่งบนแบบแบ่งเพจซึ่งไม่บังคับ | ไบต์ 127 ของ A2h ถ้าบิต 4 ของไบต์ 64 ของ A0h ถูกตั้งค่า |
| XFP (INF-8077i) | A0h | 128 ไบต์แบบแฟลต + “ตาราง” ส่วนบนแบบแบ่งเพจ | ไบต์ 127 |
| QSFP+, QSFP28 (SFF-8636) | A0h | 128 ไบต์แบบแฟลต + 128 ไบต์ส่วนบนแบบแบ่งเพจ | ไบต์ 127 |
| QSFP-DD, OSFP, SFP-DD… (CMIS) | A0h | 128 ไบต์แบบแฟลต + แบงก์ × เพจของ 128 ไบต์ส่วนบน | ไบต์ 126 เลือกแบงก์, ไบต์ 127 เลือกเพจ |
ดังนั้น SFP จึงต้องใช้แอดเดรสอุปกรณ์ สอง แอดเดรสและไม่ต้องแบ่งเพจสำหรับการทำงานพื้นฐาน; ทุกอย่างหลังจาก XFP ใช้แอดเดรส เดียว และแบ่งเพจ SFP รุ่นเก่าบางตัวตั้งบิต 2 ของไบต์ 92 ใน A0h (“address change required”) และต้องมีลำดับคำสั่งเฉพาะของผู้ผลิตก่อนที่ A2h จะตอบสนอง
ธุรกรรม
| การดำเนินการ | ลำดับ | หมายเหตุ |
|---|---|---|
| การอ่านแบบสุ่ม | START · แอดเดรสอุปกรณ์+W · ออฟเซตไบต์ · START · แอดเดรสอุปกรณ์+R · ข้อมูล… · STOP | การอ่านที่ใช้งานทั่วไป; ออฟเซตเพิ่มขึ้นเองอัตโนมัติ |
| การอ่านต่อเนื่อง | คลิกสัญญาณนาฬิกาต่อไปหลังไบต์แรก | วนกลับที่ 255 → 0 ภายในมุมมองอุปกรณ์/เพจปัจจุบัน |
| การอ่านจากแอดเดรสปัจจุบัน | START · แอดเดรสอุปกรณ์+R · ข้อมูล | ต่อจากออฟเซตล่าสุด — เปราะบางหากมีมาสเตอร์ตัวอื่นแทรกเข้ามา |
| การเขียนทีละไบต์ | START · addr+W · ออฟเซต · ข้อมูล · STOP | จากนั้นรอ t_WR |
| การเขียนทีละเพจ | START · addr+W · ออฟเซต · ข้อมูล × n · STOP | จำกัดโดยตัวอุปกรณ์หน่วยความจำ (โดยทั่วไป 4–16 ไบต์) และต้องไม่ข้ามขอบเขตเพจภายในของมัน |
| การโพล ACK | ส่ง START + addr+W ซ้ำจนกว่าโมดูลจะ ACK | วิธีที่เร็วที่สุดในการรู้ว่ารอบการเขียนเสร็จสิ้นแล้ว |
การอ่านเพจบนเป็นสองธุรกรรมเสมอ: เขียนไบต์เลือกเพจ (127 และ 126 สำหรับแบงก์ของ CMIS) แล้วจึงอ่าน 128–255 การเลือกนี้จะค้างอยู่จนกว่าจะถูกเปลี่ยน ซึ่งเป็นเหตุผลที่การเลือกเพจค้างจากของเก่าเป็นสาเหตุคลาสสิกของการอ่านได้ “wrong content”
ความเร็ว
| สเปก | สัญญาณนาฬิกา |
|---|---|
| SFF-8472 (SFP) | พื้นฐาน 100 kHz; บางโมดูลรองรับ 400 kHz ได้ |
| INF-8077i (XFP) | 100 kHz |
| SFF-8636 รุ่น 2.x (QSFP) | สูงสุด 400 kHz |
| สเปกฮาร์ดแวร์ CMIS / QSFP-DD / OSFP | สูงสุด 400 kHz |
ช้ากว่านี้ทำได้เสมอ สำหรับการเขียน เครื่องโปรแกรมส่วนใหญ่จะลดสัญญาณนาฬิกาลงต่ำกว่าค่าตามพิกัดมาก — ลงมาอยู่ในระดับกิโลเฮิรตซ์ต่ำ ๆ — เพราะรอบการเขียน EEPROM และโมดูลที่มีไมโครคอนโทรลเลอร์คั่นกลางไวต่อจังหวะเวลากว่าการอ่านมาก
จังหวะเวลาที่สำคัญ
| พารามิเตอร์ | ขีดจำกัดทั่วไป | ความหมาย |
|---|---|---|
| t_init (SFP) | 300 ms | นับจากเปิดไฟ / ยกเลิก TX_DISABLE จนโมดูลทำงานได้เต็มที่และบัสตอบสนอง |
| t_init (QSFP) | 2 s | จนการเริ่มต้นทำงานเสร็จสมบูรณ์และ Data_Not_Ready ถูกล้าง |
| MgmtInit (CMIS) | ≤ 2 s ตามสเปกฮาร์ดแวร์ | จนโมดูลออกจาก MgmtInit และข้อมูลระบุตัวตนใช้ได้ |
| t_WR | 40 ms | รอบการเขียนสูงสุดสำหรับการเขียนทีละไบต์หรือต่อเนื่อง; โพล ACK หรือรอ |
| t_clock_hold | 500 µs | การยืดสัญญาณนาฬิกาสูงสุดโดยโมดูล |
| ton_IntL | 200 ms | นับจากเหตุการณ์แฟล็กจนถึง IntL ทำงาน |
| ข้อมูลพร้อม | ไบต์ 110 บิต 0 (SFP), ไบต์ 2 บิต 0 (QSFP) | อย่าเชื่อค่าที่ตรวจวัดขณะที่บิตนี้ถูกตั้งค่าอยู่ |
ปัญหาที่พบบ่อยและวิธีแก้
| อาการ | สาเหตุเชิงโพรโทคอล | วิธีแก้ |
|---|---|---|
| ทั้งหมดเป็น FFh | ไม่มี ACK — แอดเดรสอุปกรณ์ผิด, ไม่รองรับเพจนั้น, ไม่มีโมดูลเสียบอยู่ | ตรวจสอบ A0h เทียบกับ A2h, บิตเพจ, การเสียบ |
| เนื้อหาผิด | การเลือกเพจ/แบงก์ค้างจากของเก่า | เขียน 127 (และ 126) ก่อนเข้าถึงเพจบนทุกครั้ง |
| ไบต์เสียหาย | สัญญาณนาฬิกาเร็วเกินไป, สายยาวเกินไป, ชนกับโฮสต์ที่กำลังโพล DDM | ลดความเร็วลง, ใช้สายสั้นลง, อ่านบนโต๊ะทดสอบแทนที่จะอ่านในสวิตช์ที่ใช้งานจริง |
| การเขียน “สำเร็จ” แต่อ่านกลับมาได้ค่าเก่า | เขียนเร็วเกินไป, ไม่สนใจ t_WR, ข้ามขอบเขตการเขียนเพจ | เขียนทีละไบต์หรือทีละก้อนเล็ก ๆ พร้อมรอ; โพล ACK |
| บัสค้าง, SCL หรือ SDA ค้างที่ระดับต่ำ | ธุรกรรมถูกขัดจังหวะ | คลิกพัลส์ SCL ออกมาเก้าพัลส์ แล้วตามด้วย STOP; ปิดเปิดไฟโมดูลใหม่ |
| ทำงานได้ในสวิตช์ แต่ไม่ตอบสนองบนเครื่องโปรแกรม | โมดูลรอให้ปลด LPMode หรือรอขาเลือก | จัดการ ModSelL/LPMode ให้ถูกต้อง; เผื่อเวลา t_init |
การวินิจฉัยฝั่งโต๊ะทดสอบสำหรับปัญหาเหล่านี้รวบรวมไว้ใน ข้อผิดพลาดในการอ่านและเขียน EEPROM; ส่วนกลไกป้องกันที่ทำงานอยู่เหนือบัส (รหัสผ่าน, WP ฮาร์ดแวร์, คำสั่งบันทึก) อยู่ใน ชนิดของการป้องกันการเขียน
การอ่านในระบบที่ใช้งานจริง
โฮสต์จะโพล DDM ทุกไม่กี่วินาทีและตอบสนองต่อแฟล็ก; มาสเตอร์ตัวที่สองบนบัสเดียวกัน (คลิปของเครื่องโปรแกรม, เครื่องมือแบบอินแบนด์) ก่อให้เกิดการชนกัน, การเขียนผิดแอดเดรส และเลวร้ายที่สุดคือโมดูลถูกทำให้ใช้งานไม่ได้จากการเขียนเพจที่ตกลงบนออฟเซตผิด อ่านในที่ติดตั้งได้หากจำเป็น; แต่ให้เขียนบนโต๊ะทดสอบ
ใน CodingBox
CodingBox จัดการโมเดลแอดเดรสตามฟอร์มแฟกเตอร์ให้โดยอัตโนมัติ — A0h/A2h สำหรับ SFP, การแบ่งเพจสำหรับ QSFP และ XFP, แบงก์ + เพจสำหรับ CMIS — ให้คุณตั้งความเร็วบัสและจังหวะเวลาการเขียนต่อโปรไฟล์เครื่องโปรแกรมได้ และตรวจสอบการเขียนแต่ละครั้งด้วยการอ่านย้อนกลับมาเทียบ (การเขียนโมดูล)