雙線介面:地址、頁面、記憶庫與時序
每個可插拔模組都通過同樣的兩根線(一根串行時鐘線,一根串行數據線)來管理,使用規範中稱為雙線介面(TWI)的 I²C 協議。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 位元組平坦地址 + 可選分頁上半部分 | A2h 位元組 127,若 A0h 位元組 64 位元 4 置位 |
| 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 會置位 A0h 位元組 92 位元 2(「需要地址切換」),需要先執行廠商定義的序列,A2h 才會響應。
事務
| 操作 | 序列 | 說明 |
|---|---|---|
| 隨機讀取 | START · 器件地址+W · 位元組偏移 · START · 器件地址+R · 數據…… · STOP | 日常讀取方式;偏移量自動遞增 |
| 順序讀取 | 第一個位元組之後繼續提供時鐘 | 在當前器件/頁面視圖內從 255 → 0 回繞 |
| 當前地址讀取 | START · 器件地址+R · 數據 | 從上次的偏移量繼續;如果有其他主設備介入則不可靠 |
| 位元組寫入 | START · 地址+W · 偏移 · 數據 · STOP | 之後等待 t_WR |
| 頁面寫入 | START · 地址+W · 偏移 · 數據 × n · STOP | 受限於記憶體器件本身(通常 4–16 位元組),且不得跨越其內部頁面邊界 |
| 應答輪詢 | 反覆發出 START + 地址+W,直到模組應答(ACK) | 判斷寫入週期是否完成的最快方法 |
讀取上層頁面始終需要兩次事務:先寫入頁面選擇位元組(127,CMIS 記憶庫還需 126),再讀取 128–255。該選擇會一直保持,直到被更改,因此過時的頁面選擇是導致讀到「內容錯誤」的典型原因。
速率
| 規範 | 時鐘 |
|---|---|
| SFF-8472(SFP) | 基準 100 kHz;部分模組可容忍 400 kHz |
| INF-8077i(XFP) | 100 kHz |
| SFF-8636 rev 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 被拉低卡死 | 事務被中斷 | 輸出 9 個 SCL 脈衝,然後發出 STOP;對模組重新上電 |
| 在交換機中正常,在編程器上無響應 | 模組需要釋放 LPMode 或某個選擇引腳 | 遵守 ModSelL/LPMode 要求;預留 t_init 時間 |
這些問題在工作台一側的診斷方法彙總於 EEPROM 讀寫錯誤;建立在總線之上的保護機制(密碼、硬件寫保護、保存命令)見 寫保護類型。
在運行中的系統裏讀取
主機每隔幾秒輪詢一次 DDM 並對旗標做出反應;同一總線上的第二個主設備(編程器夾具、帶內工具)會造成衝突、錯誤地址的寫入,最壞情況下還會因為頁面寫入落在錯誤偏移量上而使模組變磚。如果必須在原位讀取也可以;但寫入請在工作台上進行。
在 CodingBox 中
CodingBox 會按封裝形式自動處理地址模型(SFP 用 A0h/A2h,QSFP 和 XFP 用分頁, CMIS 用記憶庫加頁面),允許你按編程器配置文件設定總線速率和寫入時序,並通過回讀來驗證每次寫入(編程模組)。