編程器讀寫 EEPROM 時的錯誤
模組在被診斷或編碼之前必須先被讀取——之後往往還要被寫入。這兩步都有各自典型的失敗方式。本頁把每種失敗映射到其成因,以及能解決它的設定或操作步驟,從模組完全不被識別,到寫入「成功」卻悄悄消失。
模組未被檢測到
| 檢查項 | 原因 |
|---|---|
| 插接與適配座 | 模組必須完全插入連接器;使用對應封裝形式的轉接器——把 SFP 插進 QSFP 適配座是不會被看到的 |
| 上電時間 | 模組插入後需要最多約 2 秒(SFP)或更長(CMIS)時間,雙線總線才會應答 |
| 模組在位信號 | MOD_ABS / ModPrsL 必須被拉低;引腳彎曲或沒有該信號的模組會顯示為「不在位」 |
| 低功耗狀態(CMIS) | LowPwr 狀態下身份資訊可讀,但部分主機/編程器要求 Ready 狀態才能完整訪問 |
| 總線速度 | 從 100 kHz 或更低開始;部分模組在 400 kHz 下會返回 NACK |
| 模組已損壞 | 任何速度下都沒有 DDM、沒有身份資訊——在第二塊板卡上確認後再判定為損壞 |
讀出 FFh、00h 或亂碼
| 症狀 | 原因 | 解決辦法 |
|---|---|---|
| 全為 FFh | I²C NACK——該地址上沒有設備,或該頁不存在 | 檢查地址(SFP 上 A0h 身份資訊與 A2h 診斷資訊;QSFP/CMIS 上單一 A0h 加分頁) |
| 全為 00h | 模組未上電 / 處於復位狀態;或 EEPROM 確實為空 | 檢查適配座供電、模組是否在位;未編碼的空白模組確實存在 |
| 長度正確,內容錯誤 | 讀取的頁不是預期的頁 | 寫入頁選位元組(127)後重新讀取;CMIS 上還要檢查 bank 選擇(126) |
| 位元組錯亂 / 錯位 | 總線過快、線纜過長、與主機爭用總線 | 降到 ≤ 100 kHz;使用短線;在工作台上讀取,而不是在帶電交換機中讀取 |
| A2h 讀取失敗,A0h 正常 | 模組不帶診斷功能,或診斷區塊受保護 | 檢查 A0h 位元組 92 第 6 位(是否實現 DDM);部分受寫保護的類型只響應 A0h |
| 數值在多次讀取間變化 | 實時監測數據——屬正常現象;或數據尚未就緒 | DDM 位元組本就會變化;在信任某次快照前先檢查數據就緒位 |
寫入直接失敗
WRITE FAIL、數據 NACK,或位元組讀回後未改變:
| 原因 | 如何識別 | 該怎麼做 |
|---|---|---|
| 需要密碼(帶固件控制器) | 在密碼地址(SFP A2h 0x7B–0x7E,QSFP 123–126,CMIS 122–125)寫入正確值之前,寫操作會被拒絕 | 在受保護記憶體區與密碼中輸入模組密碼;資料庫中的已知廠商密碼會自動應用 |
| 硬件寫保護 | 無論密碼如何都是只讀,斷電重啟後依然如此 | WP 引腳必須由編程器板卡驅動——軟件本身無法做到;參見寫保護類型 |
| 時序問題 | 間歇性失敗,部分頁寫入不完整 | 放慢時鐘(通常約 1 kHz 才能可靠寫入 EEPROM),遵守位元組/頁之間的寫週期時間(5–10 ms),增加塊間延時 |
| 只讀區域 | 特定位元組永遠不變(校驗和、部分器件的閾值、廠商區) | EEPROM 按設計存在受保護區域;只寫模組允許寫入的欄位 |
| 狀態不對 | CMIS 模組可能要求先進入 LowPwr,或先停用數據通路,才接受寫入 | 先把模組切換到所需狀態 |
| 頁未選中 | 你在錯誤的頁上寫了正確的偏移量 | 寫入前設定位元組 127(及 126),並通過讀回頁選位元組來驗證 |
寫入「成功」但沒有生效
- 斷電重啟後回滾——模組把寫入內容存放在臨時記憶體區,需要廠商的保存命令;沒有它,舊鏡像會恢復。可通過編程腳本處理(寫保護類型 4)。
- 立即回滾——微控制器從自己的記憶體中鏡像 EEPROM 內容,並覆蓋你寫入的位元組;需要使用廠商的算法(類型 5)。
- 部分位元組生效,其餘不生效——記憶體映射部分受保護;應逐欄位寫入並逐一驗證。
寫入成功後主機仍拒絕模組
| 原因 | 解決辦法 |
|---|---|
| 校驗和過期——CC_BASE(位元組 63)、CC_EXT(95)、CC_DMI(A2h 95)、QSFP 191/223 | 重新計算;CodingBox 在寫入時會自動完成(記憶體映射) |
| 身份資訊現在自相矛盾——例如廠商變了,但合規代碼或波長仍暗示著不同的硬件 | 保持身份資訊與實際光學器件一致(速率與模式問題、物理層不匹配) |
| 按錯誤的模組類型佈局寫入——把 XFP 當 SFP 寫,或 QSFP 頁搞混 | 從備份恢復 |
模組寫入後損壞
覆蓋校準常數、閾值或廠商專用區域(部分控制器在此保存自己的配置)的垃圾數據,會直接把模組變磚。恢復方法:從 CodingBox 在寫入前保存到 code database 的備份恢復,然後只寫入你真正想改的欄位。
黃金法則
- 先讀後寫——每次寫入之前都應該先做一次完整讀取並存入資料庫。
- 在第一次寫入前確定保護類型 (寫保護類型)。
- 放慢速度——時鐘和位元組間時序能解決大多數「隨機」失敗。
- 只寫你想改的內容——除非是恢復鏡像,否則只寫欄位,不要整頁覆蓋。
- 斷電重啟後重新讀取以驗證。
在 CodingBox 中
CodingBox 會按封裝形式使用正確的地址和分頁方式讀取模組,在 EEPROM editor 中顯示原始位元組和解碼結果,寫入時自動重新計算校驗和,自動保存備份,並支援帶密碼或保存命令的受保護模組的密碼輸入和編程腳本(寫入模組)。如果懷疑是板卡級故障,參見產品的故障排查。
這些故障背後的總線機制——地址、頁選、寫週期時間、時鐘拉伸: 雙線介面。
為甚麼模組會這樣應答——MCU 模擬的記憶體、啟動窗口、時鐘拉伸、受保護區域: 控制器與固件。