QSFPER1自动测试功能开发操作文档
文档目的
在现有QSFP自动测试工程内,新增QSFPER1(ER1)模块自动校准流程;基于接口+继承架构扩展,区分普通QSFP与QSFPER1硬件操作,实现Rx VAgc调节、APC调节、BER闭环校准、眼图判定、Flash校准数据保存整套自动化流程。
架构核心规范
ModuleTest:顶层接口,定义所有模块必须具备的功能QSFP:普通QSFP基础实现类QSFPER1 : QSFP:ER1模块扩展子类,实现ER1专属寄存器操作Main_Form:负责测试流程调度、仪器交互(衰减器、BER、眼图仪、光功率计)、界面逻辑- 重要禁忌 :不要直接复制UI按钮
button_Click完整代码;UI代码包含滑块、弹窗MessageBox,只提取纯粹寄存器操作逻辑封装进类。
一、手动操作 → 自动程序方法映射表
| 手动界面操作 | 自动程序对应方法说明 |
|---|---|
| 点击读取 | SetDebugPWD() 进入调试模式 |
| 调节RxVagc | 新增 SetRxVagc(UInt16 value) |
| 读取BER | 复用现有BER仪表调用函数 |
| 关闭/打开Tx | SoftTxDis() / SoftTxCHEn() |
| 调节APC | SetTxApcBias(UInt16 value) |
| 读取Rx ADC | GetRxADC() |
| 读取Tx ADC | GetTxADC() |
| 光功率校准 | 读取光功率计数值,运算后写入模块校准寄存器 |
| 写入Flash | ER1专属Flash保存命令 |
现状说明:工程已有
SetDebugPWD()、SetTxApcBias()、GetRxADC()、GetTxADC(),禁止重复编写,直接复用。
二、开发分步操作步骤
步骤1:在公共接口 ModuleTest 增加ER1专属方法
文件路径:Common.cs → ModuleTest 接口
追加接口定义:
bool SetRxVagc(UInt16 setVal);
bool SaveER1Calibration();
关键原理
Main_Form中全局变量类型为ModuleTest(面向接口编程);
只有接口声明方法,主程序才能通过 test.SetRxVagc(xxx) 调用子类实现;
强制约束:所有实现类(QSFP、QSFPER1)都必须实现这两个方法,编译才不会报错。
普通QSFP类实现方案:直接写占位方法,返回
false,不改动原有业务流程。
步骤2:新建类文件 TestQSFPER1.cs
命名空间:FibertopTest_Common
类定义:继承QSFP基类
namespace FibertopTest_Common
{
public class QSFPER1 : QSFP
{
/// <summary>
/// ER1 设置RxVagc
/// 硬件:ER1 Page06,地址0x9B + 当前通道
/// </summary>
public bool SetRxVagc(UInt16 setVal)
{
// 使用工程现有I2C接口 + 通道选择逻辑
return false; // 先占位调试,寄存器调试完成替换真实逻辑
}
/// <summary>
/// 保存ER1校准数据至Flash
/// 硬件:ER1 Page06,写入0x83 = 0x02
/// </summary>
public bool SaveER1Calibration()
{
return false; // 先占位调试
}
}
}
注意事项
原手动工程TestQSFPER1.cs不能直接拷贝:
手动工程使用独立仪表接口,和自动工程ModuleTest接口不兼容。
若需要访问基类私有成员i2c、SelectTable():
方案A:将私有修饰符改为protected
方案B:直接把ER1底层寄存器读写逻辑下沉到QSFP基类
步骤3:登录窗体增加模块类型实例化分支
文件:Login_Form.cs
找到模块实例化代码,按下拉框文本区分创建对象:
if (type_comboBox.Text == "QSFPER1")
{
GlobalVarFun.mTest = new QSFPER1() as ModuleTest;
}
else if (type_comboBox.Text == "QSFP")
{
GlobalVarFun.mTest = new QSFP() as ModuleTest;
}
配套核查:
- 下拉框Item内确认存在字符串
QSFPER1 - 后台数据库参数配置与ER1模块匹配
步骤4:Main_Form 实现自动测试流程 FirstTestProcess()
仪器调用硬性规则:衰减器、BER仪、眼图仪、光功率计必须复用现有工程封装方法,禁止凭空新建接口 (例如禁止直接手写
IBerAnalyzer.ReadBer())
4.1 Rx接收校准流程
if (!test.SetDebugPWD())
return false;
// 4通道轮询Rx校准
for (int ch = 0; ch < 4; ch++)
{
TestSet.ch = ch;
// 1. RxVagc 从约170起始迭代调节
// 2. 每次修改Vagc后读取BER
// 3. 闭环调节直到 BER < 1e-4
// 4. 设置衰减器 -6dBm,读取光功率计、RxADC
// 5. 设置衰减器 -8dBm,读取光功率计、RxADC
// 6. 两点数据计算Rx校准参数
}
// 循环结束后执行:保存Rx校准数据、写入Flash
4.2 Tx发射校准流程
test.SetDebugPWD();
test.SoftTxDis(true);
test.SoftTxDis(false);
// 4通道轮询Tx校准
for (int ch = 0; ch < 4; ch++)
{
TestSet.ch = ch;
// 1. APC Bias从约160起始调节
// 2. 读取眼图仪 TDECQ、Outer ER
// 3. 闭环判定条件:TDECQ < 3.5 && Outer ER > 4.0
// 4. 读取光功率计、TxADC
// 5. 计算Tx校准参数
}
// 循环结束后执行:保存Tx校准数据、写入Flash
三、推荐迭代开发顺序(分步调试,降低排错难度)
原则:完成一步编译、联调一次,不要一次性写完整套流程
- 实现并基础测试
SetDebugPWD()连通性 - 实现
SetRxVagc(),通过读取寄存器确认硬件值真实变化 - 搭建RxVagc + BER闭环调节循环
- 实现 -6dBm / -8dBm 两点Rx功率校准采集
- 实现APC调节 + 眼图指标判定逻辑
- 调试校准数据运算逻辑
- 最后启用Flash写入功能(Flash频繁擦写有硬件风险,放到最后)
四、分层规范(排错核心准则)
TestQSFPER1.cs → 只负责【模块I2C寄存器读写、硬件指令】
Main_Form.cs → 只负责【测试流程调度、仪表控制、数据运算、判定逻辑】
分层优势:故障快速定位
- 调节数值不生效 → 查I2C寄存器层(QSFPER1类)
- BER/眼图指标不达标 → 查流程、仪表、算法逻辑(Main_Form)
五、常见坑提前规避
- ❌ 不要复制UI按钮内带
MessageBox、滑块控件操作的代码,只提取寄存器操作 - ❌ 不要直接移植旧手动工程的TestQSFPER1(两套仪表接口不互通)
- ❌ 接口新增方法后,忘记给普通QSFP增加占位实现,直接编译报错
- ❌ 先调试Flash写入;Flash调试前置容易造成模块非必要反复擦写
- ❌ 通道切换逻辑遗漏,轮询4通道时忘记更新当前通道选择
如果你需要,我可以把这份文档导出为markdown文本,或者进一步生成可以直接复制进VS的接口、类框架代码。