2선식 인터페이스: 주소, 페이지, 뱅크, 타이밍
모든 플러거블 모듈은 동일한 두 가닥의 선 — 시리얼 클록과 시리얼 데이터 라인 — 을 통해 관리되며, 규격에서 2선 인터페이스(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(“address change required”)를 설정해 두며, A2h가 응답하기 전에 벤더 시퀀스가 필요합니다.
트랜잭션
| 동작 | 시퀀스 | 비고 |
|---|---|---|
| 랜덤 읽기 | START · 디바이스 addr+W · 바이트 오프셋 · START · 디바이스 addr+R · 데이터… · STOP | 일상적인 읽기; 오프셋이 자동 증가함 |
| 순차 읽기 | 첫 바이트 이후에도 클록을 계속 진행 | 현재 디바이스/페이지 범위 안에서 255 → 0으로 래핑됨 |
| 현재 주소 읽기 | START · 디바이스 addr+R · 데이터 | 마지막 오프셋에서 이어짐 — 다른 마스터가 개입하면 불안정함 |
| 바이트 쓰기 | START · addr+W · 오프셋 · 데이터 · STOP | 이후 t_WR 만큼 대기 |
| 페이지 쓰기 | START · addr+W · 오프셋 · 데이터 × n · STOP | 메모리 디바이스에 따라 제한됨(보통 4–16바이트)이며 내부 페이지 경계를 넘으면 안 됨 |
| Acknowledge 폴링 | 모듈이 ACK할 때까지 START + addr+W를 반복 | 쓰기 사이클이 끝났는지 아는 가장 빠른 방법 |
상위 페이지를 읽는 것은 항상 두 번의 트랜잭션입니다: 페이지 선택 바이트(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 |
더 느린 속도는 항상 허용됩니다. 쓰기의 경우 대부분의 프로그래머는 공칭 클록보다 훨씬 낮은 — 수 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 활성까지 |
| Data ready | 바이트 110 비트 0(SFP), 바이트 2 비트 0(QSFP) | 설정되어 있는 동안은 모니터 값을 신뢰하지 말 것 |
함정과 해결책
| 증상 | 프로토콜 원인 | 해결책 |
|---|---|---|
| 전부 FFh | ACK 없음 — 잘못된 디바이스 주소, 미구현 페이지, 모듈 없음 | A0h 대 A2h, 페이지 비트, 장착 상태 확인 |
| 잘못된 내용 | 오래된 페이지/뱅크 선택값 | 상위 페이지에 접근할 때마다 127(과 126)을 쓸 것 |
| 손상된 바이트 | 클록이 너무 빠름, 긴 리드선, DDM을 폴링하는 호스트와의 충돌 | 속도를 낮출 것, 케이블을 짧게 할 것, 운영 중인 스위치가 아니라 벤치에서 읽을 것 |
| 쓰기는 “성공”하지만 예전 값이 읽힘 | 너무 빠르게 씀, t_WR 무시, 페이지 쓰기 경계를 넘음 | 대기를 두고 바이트 단위나 작은 단위로 쓸 것; ACK 폴링 |
| 버스가 멈춤, SCL 또는 SDA가 로우에 고정 | 트랜잭션 중단 | SCL 펄스 9개를 내보낸 뒤 STOP; 모듈 전원을 껐다 켤 것 |
| 스위치에서는 되는데 프로그래머에서는 안 됨 | 모듈이 LPMode 해제나 선택 핀을 기대함 | ModSelL/LPMode를 지킬 것; t_init을 확보할 것 |
이에 대한 벤치 측 진단은 EEPROM 읽기·쓰기 오류에 정리되어 있습니다; 버스 위에 얹히는 보호 방식(비밀번호, 하드웨어 WP, 저장 명령)은 쓰기 보호 유형에 있습니다.
운영 중인 시스템에서 읽기
호스트는 몇 초마다 DDM을 폴링하고 플래그에 반응합니다; 같은 버스에 두 번째 마스터(프로그래머 클립, 인밴드 도구)가 있으면 충돌, 잘못된 주소로의 쓰기, 최악의 경우 페이지 쓰기가 엉뚱한 오프셋에 떨어져 모듈이 벽돌이 되는 사고까지 일어납니다. 꼭 필요하다면 현장에서 읽으십시오; 쓰기는 벤치에서 하십시오.
CodingBox에서
CodingBox는 폼 팩터별 주소 모델을 자동으로 처리하며 — SFP는 A0h/A2h, QSFP와 XFP는 페이징, CMIS는 뱅크+페이지 — 프로그래머 프로필별로 버스 속도와 쓰기 타이밍을 설정할 수 있게 하고, 각 쓰기를 다시 읽어 검증합니다(모듈 쓰기).