文章目录
- [8.11.10 时钟与测量控制](#8.11.10 时钟与测量控制)
-
- [(1)时钟源设置(Byte 176)](#(1)时钟源设置(Byte 176))
- [(2)全局启动/停止(Byte 177: bit 7,StartStopIsGlobal)](#(2)全局启动/停止(Byte 177: bit 7,StartStopIsGlobal))
- [(3)重启错误计数(Byte 177: bit 5,ResetErrorInformation)](#(3)重启错误计数(Byte 177: bit 5,ResetErrorInformation))
- [(4)自动重启门控(Byte 177: bit 4,AutoRestartGating)](#(4)自动重启门控(Byte 177: bit 4,AutoRestartGating))
- [(5)门控测量时间(Byte 177: bit 3-1,MeasurementTime)](#(5)门控测量时间(Byte 177: bit 3-1,MeasurementTime))
- [(6)更新周期选择(Byte 177: bit 0,UpdatePeriodSelect)](#(6)更新周期选择(Byte 177: bit 0,UpdatePeriodSelect))
- [(7)主机侧 PRBS 码型检查器的时钟源(Byte 178: bit 3-2,HostPRBSCheckerClockSource)](#(7)主机侧 PRBS 码型检查器的时钟源(Byte 178: bit 3-2,HostPRBSCheckerClockSource))
- [(8)媒体侧 PRBS 码型检查器的时钟源(Byte 178: bit 1-0,MediaPRBSCheckerClockSource)](#(8)媒体侧 PRBS 码型检查器的时钟源(Byte 178: bit 1-0,MediaPRBSCheckerClockSource))
- [8.11.12 环回控制](#8.11.12 环回控制)
- [8.11.13 诊断掩码](#8.11.13 诊断掩码)
- [8.11.14 用户自定义码型](#8.11.14 用户自定义码型)
- 总结
摘要:此专栏主要介绍光模块通用管理接口规范(Common Management Interface Specification, CMIS)协议规范 V5.0 的解读。本文主要关注协议文档的 8.11 节关于 Page 13h 的内容。不仅是对文档的简单翻译,还会剖析协议规定背后的深层含义。为了方便与协议文档内容对应,本文的章节编号与协议文档保持一致。
8.11.10 时钟与测量控制
这一节是码型发生器和检查器的"总控面板"说明。前面几节分别讲了主机侧/媒体侧的发生器和检查器怎么用,但还有一些公共的、全局性的控制需要统一管理,比如:
- 时钟源选择:测试信号该用哪个时钟来驱动?是用模块自己的参考时钟,还是从接收信号里恢复出来的时钟?
- 测量启动与停止:什么时候开始计数误码?什么时候停止?如何复位计数器?
- 测量时长控制:是连续测量,还是定时测量(门控)?门控时间多长?
- 更新周期:测量过程中,多久刷新一次中间结果?
规范还贴心地提供了一些实际配置示例,放在附录 E 里。
(1)时钟源设置(Byte 176)
时钟源有三个,分别是:
- 内部时钟 :模块自带的晶振,稳定、独立,但不一定和实际数据同步。如果只是想快速测一下链路通断,选内部时钟最方便。
- 参考时钟:来自某个指定通道的外部时钟,通常由系统提供,比内部时钟更精确。
- 恢复时钟 :从实际接收到的数据信号里"提取"出来的时钟,它能完全跟随数据流的节奏,做到完全同步。如果要做环回测试 ,通常需要从接收信号里恢复时钟,保证收发完全同步,这时选恢复时钟最合适。
- 主机侧 PRBS 码型发生器的时钟源 (Byte 176: bit 7-4,HostPRBSGeneratorClockSource)
- 0:所有通道使用内部时钟
- i=1-8:所有通道使用媒体通道 i 的参考时钟
- 9-14:保留
- 15:每个媒体通道或数据路径使用从数据中恢复出来的时钟。
- 媒体侧 PRBS 码型发生器的时钟源 (Byte 176: bit 3-0,MediaPRBSGeneratorClockSource)
- 0:所有通道使用内部时钟
- 1:所有通道使用参考时钟
- i=2-9:所有通道使用主机通道 i-1 的参考时钟
- 10-14:保留
- 15:每个主机通道或数据路径使用从数据中恢复出来的时钟。

(2)全局启动/停止(Byte 177: bit 7,StartStopIsGlobal)
这个位是给多 Bank 模块提供的一个"全局开关 ",让主机能够一键同步启动或停止所有 Bank 的测量,而不需要一个一个 Bank 去写。
-
背景:多 Bank 带来的同步难题
对于支持多个 Bank(每个 Bank 对应 8 个通道)的模块。在诊断测量中,启动/停止测量的控制位分布在每个 Bank 的 Page 13h 里。比如:
- ResetErrorInformation:复位错误信息,在每个 Bank 的 13h:177.5 都有一份,共 4 个实例(对应 Bank 0--3)。
- HostSideCheckerEnableLane:主机侧检查器使能,在每个 Bank 的 13h:160.0-7 有一组 8 位,共 32 个实例(4 Bank × 8 通道)。
- MediaSideCheckerEnableLane:媒体侧检查器通道使能,共 32 个实例,地址是每个 Bank 的 13h:168.0-7。
主机如果想启动所有 Bank 的测量,必须逐个 Bank 去写这些控制位。但 I2C 总线是串行的,写 Bank 0 和写 Bank 1 之间必然有时间差 。这就导致不同 Bank 的测量开始时刻不一致,影响同步测量的精度。
-
StartStopIsGlobal 的作用
这个位就是为解决同步问题而设计的"总开关":
- 0b:你写某个 Bank 的启动/停止控制,只影响那个 Bank。其他 Bank 不受影响。
- 1b:你写任意一个 Bank 的启动/停止控制,模块内部会把它广播到所有支持的 Bank,让所有 Bank 的对应控制同时变化,达到同步启动/停止的效果。
(3)重启错误计数(Byte 177: bit 5,ResetErrorInformation)
ResetErrorInformation 位就像诊断测量系统的"暂停/清零"按钮,但它非常巧妙,根据你按下的方向(从 0 到 1,还是从 1 到 0)以及模块的配置不同,会产生不同的效果。
-
对错误信息的影响 :冻结与清零
想象模块内部有一个计数器,一直在统计误码。DiagnosticsSelector 01h--05h 代表"实时统计",11h--15h 代表"上一轮门控的结果"。
- 按下"暂停"(0b→1b) :
计数器停止累加,当前计数被冻结住。同时,如果模块支持门控统计,它会把这份冻结的当前数据搬运到"上一轮结果"存储区(11h--15h),这样主机就可以读取一个稳定的中间结果。 - 按下"复位"(1b→0b) :
计数器清零,重新从 0 开始统计。但"上一轮结果"存储区(11h--15h)不会动,仍然保留之前冻结的值,方便主机之后慢慢读。
- 按下"暂停"(0b→1b) :
-
对门控定时器的影响 :取决于模块是否支持每通道定时器
门控定时器用来控制测量的时间长度。ResetErrorInformation 的变化同时也会影响这些定时器的启停。
- 如果模块只有全局定时器(不支持每通道定时器):这个位控制唯一的一个总定时器。
- 从 0 到 1:停止总定时器。
- 从 1 到 0:启动总定时器。
- 如果模块支持每通道独立定时器:这个位的含义变成:
- 为 1:让定时器保持停止。
- 为 0:启动定时器。
而且启动或停止的范围由 StartStopIsGlobal 决定:若 StartStopIsGlobal=0,只影响当前 Bank 的通道;若为 1,则影响所有 Bank 的所有通道。
#mermaid-svg-bW24McCXDZEBeSS7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bW24McCXDZEBeSS7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bW24McCXDZEBeSS7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bW24McCXDZEBeSS7 .error-icon{fill:#552222;}#mermaid-svg-bW24McCXDZEBeSS7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bW24McCXDZEBeSS7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bW24McCXDZEBeSS7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bW24McCXDZEBeSS7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bW24McCXDZEBeSS7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bW24McCXDZEBeSS7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bW24McCXDZEBeSS7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bW24McCXDZEBeSS7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bW24McCXDZEBeSS7 .marker.cross{stroke:#333333;}#mermaid-svg-bW24McCXDZEBeSS7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bW24McCXDZEBeSS7 p{margin:0;}#mermaid-svg-bW24McCXDZEBeSS7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bW24McCXDZEBeSS7 .cluster-label text{fill:#333;}#mermaid-svg-bW24McCXDZEBeSS7 .cluster-label span{color:#333;}#mermaid-svg-bW24McCXDZEBeSS7 .cluster-label span p{background-color:transparent;}#mermaid-svg-bW24McCXDZEBeSS7 .label text,#mermaid-svg-bW24McCXDZEBeSS7 span{fill:#333;color:#333;}#mermaid-svg-bW24McCXDZEBeSS7 .node rect,#mermaid-svg-bW24McCXDZEBeSS7 .node circle,#mermaid-svg-bW24McCXDZEBeSS7 .node ellipse,#mermaid-svg-bW24McCXDZEBeSS7 .node polygon,#mermaid-svg-bW24McCXDZEBeSS7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bW24McCXDZEBeSS7 .rough-node .label text,#mermaid-svg-bW24McCXDZEBeSS7 .node .label text,#mermaid-svg-bW24McCXDZEBeSS7 .image-shape .label,#mermaid-svg-bW24McCXDZEBeSS7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-bW24McCXDZEBeSS7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bW24McCXDZEBeSS7 .rough-node .label,#mermaid-svg-bW24McCXDZEBeSS7 .node .label,#mermaid-svg-bW24McCXDZEBeSS7 .image-shape .label,#mermaid-svg-bW24McCXDZEBeSS7 .icon-shape .label{text-align:center;}#mermaid-svg-bW24McCXDZEBeSS7 .node.clickable{cursor:pointer;}#mermaid-svg-bW24McCXDZEBeSS7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bW24McCXDZEBeSS7 .arrowheadPath{fill:#333333;}#mermaid-svg-bW24McCXDZEBeSS7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bW24McCXDZEBeSS7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bW24McCXDZEBeSS7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bW24McCXDZEBeSS7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bW24McCXDZEBeSS7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bW24McCXDZEBeSS7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bW24McCXDZEBeSS7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bW24McCXDZEBeSS7 .cluster text{fill:#333;}#mermaid-svg-bW24McCXDZEBeSS7 .cluster span{color:#333;}#mermaid-svg-bW24McCXDZEBeSS7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bW24McCXDZEBeSS7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bW24McCXDZEBeSS7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-bW24McCXDZEBeSS7 .icon-shape,#mermaid-svg-bW24McCXDZEBeSS7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bW24McCXDZEBeSS7 .icon-shape p,#mermaid-svg-bW24McCXDZEBeSS7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bW24McCXDZEBeSS7 .icon-shape .label rect,#mermaid-svg-bW24McCXDZEBeSS7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bW24McCXDZEBeSS7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bW24McCXDZEBeSS7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bW24McCXDZEBeSS7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开始
把 ResetErrorInformation 从 0 置为 1:冻结旧数据,停止定时器
配置好码型、通道等
把 ResetErrorInformation 从 1 清为 0:清零计数器,启动定时器,开始新的测量
测量完成后,再把它从 0 置为 1:停止测量,把结果搬到 11h--15h 的"门控结果"区
主机去读取结果
(4)自动重启门控(Byte 177: bit 4,AutoRestartGating)
这位是诊断测量的"循环模式开关"。它决定了一轮定时测量结束后,模块是停下来等主机,还是自动开始下一轮。
- 0b:单轮模式(测完就停):当门控时间结束时,模块会置位字节 14h:134-135 中的 Gate Complete Flag。模块会更新误码计数结果,并停止误码检测。
- 1b:自动循环模式(测完立刻再来一轮) :当门控时间结束时,模块会置位字节 14h:134-135 中的 Gate Complete Flag。模块会更新误码计数结果,然后立即清除内部误码计数器 并重启门控定时器,继续统计误码。
注: 在自动重启模式下,主机必须在门控时间结束前读取误码计数结果,以避免结果值被新结果覆盖。
(5)门控测量时间(Byte 177: bit 3-1,MeasurementTime)
测量(门控)时间:在一个定义的测量周期内产生一个完整结果所需的时间。

(6)更新周期选择(Byte 177: bit 0,UpdatePeriodSelect)
这个字段设置的是:在模块进行长时间测量时,主机查看中间进度的频率,就像下载文件时进度条的刷新速度。
- 作用
这个位就是控制"每隔多久更新一次中间结果":- 0b:每 1 秒更新一次。主机每秒都能读到最新的误码计数,进度条很平滑,但会占用更多 I2C 读操作。
- 1b:每 5 秒更新一次。主机每 5 秒才看到一次新数据,更新频率低一些,但也能满足大多数监控需求。
- 前提条件 :模块必须支持周期性更新
这个字段只有在模块支持周期性更新时才有效。支持与否由能力位 **PeriodicUpdatesSupported(13h:129.4)**通告:- 如果该能力位为 1b,说明模块支持在测量期间周期性更新 DiagnosticsSelector 01h--06h 的实时统计结果。这时 UpdatePeriodSelect 才有意义。
- 如果该能力位为 0b,模块不提供中间更新,主机只能等测量结束读最终结果,UpdatePeriodSelect 设置了也没用。
(7)主机侧 PRBS 码型检查器的时钟源(Byte 178: bit 3-2,HostPRBSCheckerClockSource)
主机侧 PRBS 码型检查器的时钟源可通过该控制寄存器进行配置:
0h:使用来自主机通道/数据路径的恢复时钟
1h:所有通道使用内部时钟
2h:所有通道使用参考时钟
3h:保留
(8)媒体侧 PRBS 码型检查器的时钟源(Byte 178: bit 1-0,MediaPRBSCheckerClockSource)
0h:使用来自媒体通道/数据路径的恢复时钟
1h:所有通道使用内部时钟
2h:所有通道使用参考时钟
3h:保留
8.11.12 环回控制
这一章节的内容可以用三个词来概括:前提、内容、权利。
- 前提 :模块的环回能力由表8-89中的 Page 13h Byte 128 字节通告。主机必须先读这个能力通告,确认模块支持后,再配置。
- 内容 :各个环回控制项如表8-109所示,包括四个字节 Page 13h Byte 180-183 。这四个字节是模块的"环回开关 "。但开关的粒度取决于模块的能力:支持每通道控制就能单独开某一条,不支持就一开全开。能力位在 13h:128.0--3 。
- 权利 :模块有权拒绝主机的命令。如果主机写了模块不支持的模式,模块会拒绝 ,并且寄存器值保持不变。

8.11.13 诊断掩码
表 8-110 为所有诊断标志提供了掩码位。本页上所有掩码位的默认值均为 1(被屏蔽) 。诊断标志位于 Page 14h(见表 8-115)。
诊断掩码分为三类,分别对应诊断过程中可能出现的三种重要事件:
- 门控完成(Gating Complete):当主机设置了一个定时测量(比如"测 10 秒误码"),时间一到,模块就会产生"门控完成"标志,表示这一轮测量结束了,结果已经准备好。这个掩码控制该事件是否触发中断。
- 码型发生器失锁(Pattern Generator LOL):码型发生器是模块内部产生测试数据的小设备。它需要锁定时钟才能正常工作。如果因为某些原因(比如时钟源异常)锁不住了,就会产生"失锁"标志。这个掩码控制该事件是否触发中断。
- 码型检查器失锁(Pattern Checker LOL):码型检查器是模块内部检查测试数据的"质检员"。它同样需要锁定时钟。如果锁不住,就没法正确比对数据,于是产生"检查器失锁"标志。这个掩码控制该事件是否触发中断。

8.11.14 用户自定义码型
- 背景 :
在诊断测试中,除了模块内置的标准测试码型(比如 PRBS31、PRBS13Q),有时主机想要发送一段自己定义的特定数据序列来进行测试。这个"用户自定义码型"就是供应商的"私人定制测试码型"。 - 内容 :
表 8-111 最多可以写 32 个音符(224~255 字节)。主机可以把想测试的数据序列填进去。模块不一定能把 32 个音符全唱出来。有些模块可能只能唱 4 个、8 个或 16 个音符。具体能支持多长,要看模块在表 8-96里广告的能力(之前学过 UserPatternLengthSupported 字段)。 - 工作过程 :
主机在用自定义码型前,先要查一下模块最大支持多长,然后再往表 8-111 里写入相应长度的自定义数据,最后让发生器按这个模式发出去测试。
总结
本文解读了 CMIS V5.0 中 Page 13h 的时钟与测量控制、环回控制、诊断掩码及用户自定义码型等关键寄存器,帮助读者理解诊断测试的全局控制机制与配置要点,为光模块调试提供实用参考。欢迎有疑问的小伙伴在评论区留言讨论。