프로그래머에서의 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 바이트 92 비트 6(DDM 구현 여부)을 확인합니다; 일부 쓰기 보호된 유형은 A0h에만 응답함 |
| 읽을 때마다 값이 달라짐 | 실시간 모니터 — 정상; 또는 data not ready | DDM 바이트는 원래 변하는 값입니다; 스냅숏을 신뢰하기 전에 data-ready 비트를 확인합니다 |
쓰기가 아예 실패함
WRITE FAIL, 데이터에 대한 NACK, 또는 바이트를 다시 읽어도 변경되지 않음:
| 원인 | 알아보는 방법 | 해야 할 일 |
|---|---|---|
| 비밀번호 필요(펌웨어 컨트롤러) | 비밀번호 주소(SFP A2h 0x7B–0x7E, QSFP 123–126, CMIS 122–125)에 올바른 값을 넣기 전까지 쓰기가 거부됨 | 쓰기 보호된 메모리와 비밀번호에서 모듈의 비밀번호를 입력합니다; 알려진 벤더 비밀번호는 데이터베이스에서 자동으로 적용됩니다 |
| 하드웨어 쓰기 보호 | 비밀번호와 무관하게 읽기 전용이며 전원 재투입에도 유지됨 | WP 핀은 프로그래머 보드가 직접 제어해야 함 — 소프트웨어만으로는 불가능; 쓰기 보호 유형 참고 |
| 타이밍 | 간헐적 실패, 페이지 일부만 기록됨 | 클록을 늦춥니다(안정적인 EEPROM 쓰기에는 보통 ~1 kHz 필요), 바이트/페이지 사이의 쓰기 주기 시간(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는 쓰기 시 이를 자동으로 처리함(메모리 맵) |
| 식별 정보가 이제 앞뒤가 맞지 않음 — 예: 벤더는 바뀌었는데 컴플라이언스 코드나 파장은 다른 하드웨어를 가리킴 | 식별 정보를 실제 광학 부품과 일치시킵니다(속도와 레이트, 물리적 불일치) |
| 잘못된 모듈 종류의 레이아웃으로 씀 | SFP인 것처럼 쓴 XFP, 또는 QSFP 페이지 혼동 — 백업에서 복원합니다 |
쓰기 후 모듈이 죽음
교정 상수, 임계값 또는 벤더 전용 영역(일부 컨트롤러가 설정을 저장하는 곳)에 쓰레기값을 쓰면 모듈이 무용지물이 될 수 있습니다. 복구 방법: code database에서 CodingBox가 쓰기 전에 만들어 둔 백업을 복원한 다음, 의도한 필드만 다시 씁니다.
황금률
- 먼저 읽고 저장합니다 — 모든 쓰기 앞에는 데이터베이스에 남는 전체 읽기가 선행되어야 합니다.
- 첫 쓰기 시도 전에 보호 유형을 파악합니다(쓰기 보호 유형).
- 천천히 진행합니다 — 클록과 바이트 간 타이밍을 조정하면 대부분의 “무작위” 실패가 해결됩니다.
- 의도한 것만 씁니다 — 이미지를 복원하는 경우가 아니라면 페이지 전체가 아니라 필드 단위로.
- 전원을 재투입한 뒤 다시 읽어 확인합니다.
CodingBox에서
CodingBox는 폼 팩터별로 올바른 주소와 페이징으로 모듈을 읽고, EEPROM editor에서 원시 바이트와 디코딩된 바이트를 보여주며, 쓰기 시 체크섬을 다시 계산하고, 백업을 자동으로 저장하며, 보호되거나 저장 명령이 필요한 모듈을 위한 비밀번호 입력과 프로그래밍 스크립트를 지원합니다(모듈 쓰기). 코딩 보드 자체의 결함이 의심되면 제품 문제 해결을 참고하십시오.
이런 실패 뒤에 있는 버스 동작 원리 — 주소, 페이지 선택, 쓰기 주기 시간, 클록 스트레칭: 2선식 인터페이스.
모듈이 그렇게 응답하는 이유 — MCU 에뮬레이션 메모리, 부팅 윈도, 클록 스트레칭, 보호된 영역: 컨트롤러와 펌웨어.