Giao diện hai dây: địa chỉ, trang, bank, timing
Mọi module cắm rút đều được quản lý qua cùng hai dây — một đường xung nhịp nối tiếp và một đường dữ liệu nối tiếp — dùng giao thức I²C mà các đặc tả gọi là giao diện hai dây (TWI). Điều khác nhau giữa module SFP, QSFP, XFP và CMIS là cách không gian địa chỉ được tổ chức bên trên nó: thiết bị riêng biệt, bộ nhớ phân trang, hay các bank của trang. Nội dung này là góc nhìn ở mức giao thức mà bộ lập trình, host và CodingBox đều dựa vào.
Lớp vật lý
- Hai đường open-drain, SCL và SDA, được kéo lên (pull-up) ở phía host; logic 3,3 V.
- Module luôn là slave; host (hoặc bộ lập trình) là master và tạo xung nhịp.
- Module có thể kéo giãn xung nhịp (giữ SCL ở mức thấp) trong khi vi điều khiển lấy dữ liệu — các đặc tả cho phép tới 500 µs.
- Sự hiện diện và việc chọn module là các chân riêng, không phải giao dịch trên bus: MOD_ABS (SFP), ModPrsL và ModSelL (nhóm QSFP và CMIS). ModSelL cho phép nhiều module dùng chung một bus; SFP không có chân chọn, nên host phải cấp cho mỗi cage một bus riêng hoặc dùng bộ dồn kênh (multiplexer).
Không gian địa chỉ theo từng đặc tả
| Họ | Địa chỉ thiết bị (ghi 8-bit / 7-bit) | Tổ chức | Chọn trang |
|---|---|---|---|
| SFP, SFP+, SFP28 (SFF-8472) | A0h / 50h thông tin nhận dạng, A2h / 51h chẩn đoán | A0h: 256 byte phẳng; A2h: 128 byte phẳng + nửa trên phân trang tùy chọn | byte 127 của A2h, nếu bit 4 của byte 64 ở A0h được bật |
| XFP (INF-8077i) | A0h | 128 byte phẳng + các “bảng” trên phân trang | byte 127 |
| QSFP+, QSFP28 (SFF-8636) | A0h | 128 byte phẳng + 128 byte trên phân trang | byte 127 |
| QSFP-DD, OSFP, SFP-DD… (CMIS) | A0h | 128 byte phẳng + bank × trang của 128 byte trên | byte 126 chọn bank, byte 127 chọn trang |
Do đó một SFP cần hai địa chỉ thiết bị và không cần phân trang cho phần cơ bản; mọi thứ sau XFP dùng một địa chỉ và có phân trang. Một số SFP thế hệ cũ bật bit 2 của byte 92 ở A0h (“cần đổi địa chỉ”) và cần một chuỗi lệnh riêng của nhà sản xuất trước khi A2h phản hồi.
Giao dịch
| Thao tác | Trình tự | Ghi chú |
|---|---|---|
| Đọc ngẫu nhiên | START · địa chỉ thiết bị+W · offset byte · START · địa chỉ thiết bị+R · dữ liệu… · STOP | kiểu đọc thường dùng hằng ngày; offset tự tăng |
| Đọc tuần tự | tiếp tục cấp xung sau byte đầu tiên | quay vòng từ 255 → 0 trong phạm vi thiết bị/trang hiện tại |
| Đọc tại địa chỉ hiện tại | START · địa chỉ thiết bị+R · dữ liệu | tiếp tục từ offset cuối cùng — dễ lỗi nếu có master khác can thiệp vào giữa chừng |
| Ghi từng byte | START · địa chỉ+W · offset · dữ liệu · STOP | sau đó chờ t_WR |
| Ghi theo trang | START · địa chỉ+W · offset · dữ liệu × n · STOP | bị giới hạn bởi thiết bị nhớ (thường 4–16 byte) và không được vượt qua ranh giới trang nội bộ của nó |
| Thăm dò ACK | phát START + địa chỉ+W liên tục cho tới khi module ACK | cách nhanh nhất để biết chu kỳ ghi đã xong |
Đọc một trang trên luôn cần hai giao dịch: ghi byte chọn trang (127, và 126 cho bank của CMIS), rồi đọc 128–255. Lựa chọn này còn giữ nguyên cho tới khi bị thay đổi, đó là lý do vì sao một lựa chọn trang cũ là nguồn gốc kinh điển của lỗi đọc “sai nội dung”.
Tốc độ
| Đặc tả | Xung nhịp |
|---|---|
| SFF-8472 (SFP) | nền tảng 100 kHz; một số module chịu được 400 kHz |
| INF-8077i (XFP) | 100 kHz |
| SFF-8636 rev 2.x (QSFP) | tới 400 kHz |
| Thông số phần cứng CMIS / QSFP-DD / OSFP | tới 400 kHz |
Chạy chậm hơn luôn hợp lệ. Khi ghi, phần lớn bộ lập trình giảm tốc độ xuống thấp hơn nhiều so với xung nhịp danh định — xuống mức kilohertz thấp — vì chu kỳ ghi EEPROM và các module qua trung gian vi điều khiển nhạy cảm với thời gian hơn nhiều so với khi đọc.
Các mốc thời gian quan trọng
| Tham số | Giới hạn điển hình | Ý nghĩa |
|---|---|---|
| t_init (SFP) | 300 ms | từ khi cấp nguồn / bỏ TX_DISABLE cho tới khi module hoạt động đầy đủ và bus phản hồi |
| t_init (QSFP) | 2 s | cho tới khi khởi tạo hoàn tất và Data_Not_Ready được xóa |
| MgmtInit (CMIS) | ≤ 2 s theo thông số phần cứng | cho tới khi module rời khỏi MgmtInit và thông tin nhận dạng hợp lệ |
| t_WR | 40 ms | chu kỳ ghi tối đa cho một byte hoặc ghi tuần tự; thăm dò ACK hoặc chờ |
| t_clock_hold | 500 µs | mức kéo giãn xung nhịp tối đa mà module được phép |
| ton_IntL | 200 ms | từ khi có sự kiện cờ tới khi IntL được kích hoạt |
| Dữ liệu sẵn sàng | bit 0 của byte 110 (SFP), bit 0 của byte 2 (QSFP) | đừng tin các giá trị giám sát khi bit này còn được bật |
Các lỗi thường gặp và cách khắc phục
| Triệu chứng | Nguyên nhân giao thức | Cách khắc phục |
|---|---|---|
| Toàn FFh | không có ACK — sai địa chỉ thiết bị, trang chưa triển khai, module vắng mặt | kiểm tra A0h so với A2h, bit trang, độ cắm khít |
| Sai nội dung | lựa chọn trang/bank đã cũ | ghi 127 (và 126) trước mỗi lần truy cập trang trên |
| Byte bị hỏng | xung nhịp quá nhanh, dây dẫn quá dài, tranh chấp với host đang thăm dò DDM | giảm tốc độ, dùng cáp ngắn, đọc trên bàn thử thay vì trên switch đang hoạt động |
| Ghi “thành công” nhưng đọc lại vẫn thấy dữ liệu cũ | ghi quá nhanh, bỏ qua t_WR, vượt qua ranh giới ghi trang | ghi từng byte hoặc từng đoạn nhỏ kèm thời gian chờ; thăm dò ACK |
| Bus treo, SCL hoặc SDA kẹt ở mức thấp | giao dịch bị ngắt giữa chừng | cấp ra chín xung SCL, rồi STOP; tắt/bật lại nguồn module |
| Hoạt động trên switch nhưng không hoạt động trên bộ lập trình | module cần được giải phóng LPMode hoặc cần chân chọn | tôn trọng ModSelL/LPMode; chờ đủ t_init |
Cách chẩn đoán trên bàn thử cho các trường hợp này được tập hợp trong Lỗi đọc và ghi EEPROM; các cơ chế bảo vệ vận hành bên trên bus (mật khẩu, WP phần cứng, lệnh lưu) nằm trong Các kiểu bảo vệ ghi.
Đọc trong hệ thống đang hoạt động
Host thăm dò DDM mỗi vài giây và phản ứng theo cờ; một master thứ hai trên cùng bus (kẹp của bộ lập trình, công cụ in-band) gây ra xung đột, ghi sai địa chỉ và, tệ nhất, làm hỏng module vĩnh viễn do một lần ghi trang rơi vào sai offset. Nếu bắt buộc, hãy đọc tại chỗ; còn ghi thì thực hiện trên bàn thử.
Trong CodingBox
CodingBox tự động xử lý mô hình địa chỉ theo từng form factor — A0h/A2h cho SFP, phân trang cho QSFP và XFP, bank + trang cho CMIS — cho phép bạn đặt tốc độ bus và thời gian ghi theo từng hồ sơ bộ lập trình, và xác minh mỗi lần ghi bằng cách đọc lại (Ghi vào module).