当前文档版本为 NDK-v1.1.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

量产测试

1 概述

量产测试是产品在批量生产阶段,为保证每颗芯片及其模组的功能和性能满足设计指标而进行的一系列测试。PAN107x 芯片的量产测试主要分为以下两个部分:

  • 射频模块测试:验证芯片的射频收发性能(发射功率、频偏、EVM、接收灵敏度等)是否符合产品规格。

  • 模拟模块测试:针对某些受 PCB 板级因素影响的模拟功能(如晶振内部电容 Trim)进行校准与补偿。

注:芯片的数字逻辑功能及大部分模拟模块已在芯片出厂前的 CP(Chip Probe,晶圆探针测试)和 FT(Final Test,成品测试)阶段完成全面测试,量产阶段仅需关注以上板级相关的功能验证与校准。

2 射频模块测试

射频模块测试的目的是验证 PAN107x 芯片在实际 PCB 板上的射频性能是否满足产品设计指标,主要测试项包括:

  • 发射功率(TX Power)

  • 频率偏差(Frequency Offset)

  • 误差矢量幅度(EVM,Error Vector Magnitude)

  • 接收灵敏度(RX Sensitivity)

  • 收包率(PER,Packet Error Rate)

  • RSSI 信号采集

2.1 测试方案

射频测试支持两种方案:

方案

说明

适用场景

标准仪器

使用 CMW500 / 频谱仪等标准射频仪器进行精确测量

实验室验证、精确校准

Tool Box

使用 PAN107x ToolBox 配合两台 PAN107x 设备进行对测

产线快速测试、批量验证

2.2 详细操作

射频测试的详细环境搭建、固件下载、操作步骤等,请参考 RF Test

3 模拟模块测试

3.1 背景说明

PAN107x 芯片的模拟模块(包括 ADC、电源管理、时钟系统等)已在芯片出厂前的 CP/FT 阶段通过 ATE(Automatic Test Equipment)完成了全面的参数测试与 Trim 校准,客户通常无需在量产阶段重复测试。

但是,某些特殊的模拟功能由于受到 PCB 板级寄生参数(如寄生电容、寄生电感等)的影响,其芯片内部的默认 Trim 值可能无法在所有客户 PCB 板上达到最佳性能。对于此类功能,需要在客户的产测阶段进行板级校准。

3.2 XTH/XTL 内部电容 Trim 校准

3.2.1 问题描述

当客户使用 XTH(外部高速晶振)/ XTL(外部低速晶振)内部电容模式 时,晶振的频率精度会受到 PCB 板寄生电容的影响。不同的 PCB 布局、走线长度、板材参数都会导致寄生电容的差异,进而造成晶振频率偏移(频偏),影响:

  • 无线通信的射频频率精度(可能导致 BLE 连接不稳定或无法通信)

  • 系统时钟的准确性(影响 UART 波特率、Timer 定时精度等)

因此,需要在量产阶段为每块 PCB 板单独校准 XTH/XTL 的内部电容 Trim 值,以补偿板级寄生电容的差异。

3.2.2 校准原理

芯片内部集成了可调电容阵列,通过 XTH/XTL 内部电容 Trim 寄存器(6-bit,取值范围 0~63)可以调节内部负载电容的大小,从而微调晶振的振荡频率。

校准的基本流程如下:

┌─────────────────────┐
│ 产测设备发送测试命令  │
└──────────┬──────────┘
           ▼
┌─────────────────────┐
│ 芯片配置 XTH/XTL    │
│ 内部电容模式         │
└──────────┬──────────┘
           ▼
┌─────────────────────┐
│ 设置初始 Trim 值     │
└──────────┬──────────┘
           ▼
┌─────────────────────┐
│ 频偏测试设备测量频偏  │
└──────────┬──────────┘
           ▼
    ┌─────────────┐
    │ 频偏是否在   │
    │ 目标范围内? │
    └──┬──────┬───┘
       │ 否   │ 是
       ▼      ▼
┌───────────┐  ┌─────────────────────┐
│ 调整Trim值│   │ 将 Trim 值写入 Flash │
└─────┬─────┘  └──────────┬──────────┘
      │                    ▼
      └─────────────────→ ┌──────────┐
           (循环)         │ 校准完成  │
                          └──────────┘

3.2.3 产测流程

  1. 连接频偏测试设备:将 PCB 板的射频输出或时钟输出连接到频偏测试设备(如 CMW500、频谱仪或专用频率计)。

  2. 进入测试模式:通过串口或专用产测固件使芯片进入 XTH/XTL Trim 校准模式。

  3. 扫描 Trim 值:通过 API 接口遍历 Trim 值(0~63),同时由频偏测试设备测量对应的频率偏差。

  4. 确定最佳 Trim 值:选择使频偏最小的 Trim 值作为当前 PCB 板的最佳校准值。

  5. 存储校准值:将最佳 Trim 值写入芯片 Flash 的指定位置(如 NVDS 区域或 Info Page),供后续启动时读取。

3.2.4 启动时载入校准值

芯片在每次上电启动时,需要从 Flash 中读取已存储的 XTH/XTL Trim 校准值,并通过驱动 API 将其写入芯片相关寄存器,从而完成频偏校准。建议在系统时钟初始化阶段(SystemClock_Config 或等效函数)完成此操作。

3.2.5 相关 API 接口

芯片底层驱动(panplat\pan1070\bsp\device\Include\pan_clk.h)提供了以下 API 用于 XTH/XTL 内部电容 Trim 的配置与读取:

XTH(外部高速晶振)相关 API:

API 函数

功能描述

参数说明

CLK_SetXthIntCapTrim(val)

设置 XTH 内部电容 Trim 值

val: 6-bit, 取值范围 0~63

CLK_GetXthIntCapTrim(void)

获取当前 XTH 内部电容 Trim 值

返回当前 Trim 值 (0~63)

CLK_XthStartupConfig(void)

配置 XTH 启动参数

XTL(外部低速晶振)相关 API:

API 函数

功能描述

参数说明

CLK_EnableXtlIntCap(void)

使能 XTL 内部电容

CLK_DisableXtlIntCap(void)

禁用 XTL 内部电容

CLK_SetXtlIntCapTrim(val)

设置 XTL 内部电容 Trim 值

val: 6-bit, 取值范围 0~63

CLK_GetXtlIntCapTrim(void)

获取当前 XTL 内部电容 Trim 值

返回当前 Trim 值 (0~63)

使用示例 — 产测阶段设置 Trim:

#include "pan_clk.h"

// 产测阶段:设置 XTH 内部电容 Trim 值为 32
CLK_SetXthIntCapTrim(32);

// 产测阶段:使能 XTL 内部电容并设置 Trim 值为 20
CLK_EnableXtlIntCap();
CLK_SetXtlIntCapTrim(20);

使用示例 — 启动阶段从 Flash 载入校准值:

启动阶段载入校准值的逻辑应写入一个名为 SystemHwParamLoaderHook() 的函数中。该函数在 system_PANSeries.c 中默认为 __WEAK 空实现,位于 SystemHwParamLoader() 加载完芯片出厂校准参数之后调用,用户可通过覆盖该弱函数,在此处读取产测阶段存入 Flash 的 XTH/XTL Trim 值并写入芯片寄存器:

#include "pan_clk.h"

/**
 * @brief  Override the weak SystemHwParamLoaderHook to load board-level
 *         XTH/XTL internal capacitor trim values from Flash.
 * @param  otp: Pointer to the OTP data structure (calibration data loaded by
 *              SystemHwParamLoader).
 */
void SystemHwParamLoaderHook(OTP_STRUCT_T *otp)
{
    // 从 Flash 中读取产测时保存的 XTH 内部电容 Trim 值
    uint32_t xth_trim;
    FMC_ReadStream(FLCTL, XTH_TRIM_FLASH_ADDR, CMD_DREAD,
                   (uint8_t *)&xth_trim, sizeof(xth_trim));

    // 从 Flash 中读取产测时保存的 XTL 内部电容 Trim 值
    uint32_t xtl_trim;
    FMC_ReadStream(FLCTL, XTL_TRIM_FLASH_ADDR, CMD_DREAD,
                   (uint8_t *)&xtl_trim, sizeof(xtl_trim));

    // 载入 Trim 值到芯片寄存器
    if (xth_trim <= 63) {
        CLK_SetXthIntCapTrim(xth_trim);
    }

    if (xtl_trim <= 63) {
        CLK_EnableXtlIntCap();
        CLK_SetXtlIntCapTrim(xtl_trim);
    }
}

说明:XTH_TRIM_FLASH_ADDR / XTL_TRIM_FLASH_ADDR 为产测阶段将 Trim 值写入 Flash 时所用的地址,用户需根据实际存储布局定义;若使用 KVStore 键值存储方案,也可用对应的读取 API 替代 FMC_ReadStream