プログラマーでの EEPROM 読み書きエラー
モジュールを診断またはコーディングする前に、まず読み取りが必要です。そして多くの場合、書き込みも必要になります。このどちらの手順にも、特徴的な失敗パターンがあります。このページでは、モジュールがまったく認識されない場合から、「成功」したはずの書き込みが静かに消えてしまう場合まで、それぞれの失敗を原因と、それを解決する設定や手順に対応付けます。
モジュールが検出されない
| 確認項目 | 理由 |
|---|---|
| 挿し込みとクレードル | モジュールはコネクタの奥まで確実に挿す必要がある。フォームファクターに合ったアダプターを使う — QSFP クレードルに挿した SFP は認識されない |
| 起動待ち時間 | モジュールは挿入後、2線バスが応答するまでに最大約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 ではバンク選択(126)も |
| バイトが乱れる/ずれる | バスが速すぎる、ケーブルが長い、ホストとの競合 | 100 kHz 以下に落とす。短いリード線を使う。稼働中のスイッチではなくベンチで読み取る |
| A2h の読み取りは失敗するが A0h は正常 | 診断機能を持たないモジュール、または診断ブロックが保護されている | A0h の byte 92 bit 6(DDM implemented)を確認する。書き込み保護されたタイプの一部は A0h にしか応答しない |
| 読み取るたびに値が変わる | ライブ監視 — 正常な動作。またはdata not ready | DDM のバイトは変化するのが正常。スナップショットを信頼する前にデータレディビットを確認する |
書き込みが完全に失敗する
WRITE FAIL、データに対する NACK、または書き込み後に読み返しても値が変わっていない場合:
| 原因 | 見分け方 | 対処法 |
|---|---|---|
| パスワードが必要(ファームウェアコントローラー) | パスワードアドレス(SFP A2h 0x7B–0x7E、QSFP 123–126、CMIS 122–125)に正しい値を書き込むまで書き込みが拒否される | 書き込み保護されたメモリとパスワードでモジュールのパスワードを入力する。既知のベンダーパスワードはデータベースから自動的に適用される |
| ハードウェア書き込み保護 | パスワードに関係なく読み取り専用で、電源を入れ直しても解除されない | WP ピンをコーディングボードで駆動する必要がある — ソフトウェアだけでは解除できない。書き込み保護の種類を参照 |
| タイミング | 断続的な失敗、ページの一部しか書き込まれない | クロックを落とす(信頼できる EEPROM 書き込みには約1 kHz が必要なことが多い)、バイト/ページ間の書き込みサイクル時間(5–10 ms)を守る、ブロック間に遅延を追加する |
| 読み取り専用領域 | 特定のバイトが変化しない(チェックサム、一部製品のしきい値、ベンダー領域) | EEPROM には設計上保護された領域がある。モジュールが許可するフィールドのみ書き込む |
| 状態の誤り | CMIS モジュールでは、書き込みを受け付ける前に LowPwr、またはデータパスの非アクティブ化が必要な場合がある | 先にモジュールを必要な状態にする |
| ページが未選択 | 正しいオフセットに、誤ったページで書き込んでしまった | 書き込み前に byte 127(および 126)を設定し、ページ選択バイトを読み返して確認する |
書き込みは「成功」するが定着しない
- 電源を入れ直すと元に戻る — モジュールは書き込み内容を一時メモリーに保持しており、ベンダー独自のsave コマンドが必要です。これを実行しないと、古いイメージに戻ってしまいます。プログラミングスクリプトで対応します(書き込み保護タイプ4)。
- 即座に元に戻る — マイクロコントローラーが自身のストアから EEPROM の内容をミラーリングし、書き込んだバイトを上書きしてしまいます。メーカー独自のアルゴリズムが必要です(タイプ5)。
- 一部のバイトだけ定着する — 部分的に保護されたマップです。フィールドごとに書き込み、それぞれ検証してください。
書き込み成功後にホストがモジュールを拒否する
| 原因 | 対処法 |
|---|---|
| チェックサムが古いまま — CC_BASE(byte 63)、CC_EXT(95)、CC_DMI(A2h 95)、QSFP 191/223 | 再計算する。CodingBox は書き込み時に自動的に行う(メモリーマップ) |
| 識別情報に矛盾が生じた — 例えばベンダーは変更したが、コンプライアンスコードや波長が異なるハードウェアを示している | 識別情報を実際の光学系と整合させる(速度とレート、物理的な不一致) |
| 誤ったモジュール種別のレイアウトに書き込んだ | XFP を SFP として書き込んでしまった、または QSFP のページを取り違えた — バックアップから復元する |
書き込み後にモジュールが死ぬ
校正定数、しきい値、またはベンダー固有領域(一部のコントローラーは、ここに設定を保持している)に不正な値を書き込むと、モジュールが文鎮化することがあります。復旧の手順:CodingBox が書き込み前に取得したバックアップを code database から復元し、意図したフィールドのみを書き込み直してください。
鉄則
- まず読み取って保存する — どの書き込みも、その前にデータベースへ記録される完全な読み取りを行う。
- 最初の書き込みを試す前に保護タイプを特定する(書き込み保護の種類)。
- ゆっくり進める — クロックとバイト間タイミングが、「ランダムな」失敗の大半を解決する。
- 意図したものだけを書き込む — イメージを復元する場合を除き、ページ全体ではなくフィールド単位で。
- 電源を入れ直したあとに再読み取りして検証する。
CodingBox での作業
CodingBox は、フォームファクターごとに正しいアドレスとページングでモジュールを読み取り、EEPROM editor で生バイトとデコード後の値を表示し、書き込み時にチェックサムを再計算し、バックアップを自動的に保存します。また、保護されたモジュールや save コマンドが必要なモジュールのために、パスワード入力とプログラミングスクリプトにも対応しています(モジュールへの書き込み)。コーディングボード自体の故障が疑われる場合は、製品のトラブルシューティングを参照してください。
これらの失敗の背後にあるバスの仕組み — アドレス、ページ選択、書き込みサイクル時間、クロックストレッチ:2線インターフェース。
モジュールがそのように応答する理由 — MCU によるメモリーエミュレーション、ブート時間枠、クロックストレッチ、保護領域:コントローラーとファームウェア。