杰理 SDK 文档中心
首页
首页
  • 概述与快速开始

    • SDK 总览与芯片能力
    • 环境搭建与编译构建
    • 烧录与固件升级
    • 文档与版本资源
  • 应用与示例方案

    • demo 示例工程
    • WiFi 摄像头方案 (wifi_camera)
    • WiFi 音箱方案 (wifi_soundbox)
    • WiFi 婴儿监护方案 (wifi_bbm)
    • 公共应用模块库
    • 示例代码库 (example)
  • 系统架构与平台

    • 总体架构与工程分层
    • 系统启动与运行框架
    • 芯片驱动与板级适配
    • 设备管理与文件系统
    • 系统工具库与算法
  • 音频子系统

    • 音频框架与处理节点
    • 音频编解码与音效
    • 播放器与录音器
    • 语音交互与 AI 唤醒
    • LE Audio 与蓝牙音频
    • 音频调试与歌词
  • 视频与显示子系统

    • 摄像头驱动与 ISP
    • 视频编码与图像处理
    • 显示与 GPU 加速
    • 屏幕镜像 (screen_mirror)
  • 无线连接与网络

    • 蓝牙协议栈 (双模蓝牙)
    • WiFi 协议栈与配网
    • 网络协议栈
    • 云平台与 IoT 协议
  • UI 子系统

    • LVGL 集成与应用
    • UI 工程与工具链
  • 配置系统

    • 功能配置
    • 板级配置
    • 网络与蓝牙配置
    • 音频配置与提示音
  • 工具与测试

    • 产测与射频测试工具
    • 固件升级与更新机制
    • 调试与日志工具
  • 硬件参考设计

    • 原理图参考设计
    • 芯片数据手册

产测与射频测试工具

本文档介绍 AC792N SDK 中面向生产制造环节的产测(Production Test)与射频(RF)测试工具链,涵盖 RF_FCC 测试模式、Wi-Fi/蓝牙射频测试指令、上位机通信协议、第三方产测设备接入以及 JL 自研产测流程(SPK/ANC/ENC/按键)。

Purpose and Scope

本页面覆盖以下内容:

  • RF_FCC 测试工具(sdk/apps/common/rf_fcc_tool 与 sdk/apps/common/ext_rf_fcc_tool):射频测试模式的触发机制、配置宏、上位机串口通信协议、Wi-Fi/蓝牙射频测试接口;
  • 产测配置体系(音频产测、Speaker EQ 校准、ANC 产测、ENC 麦克风阵列校准、按键产测),包括第三方产测设备(兆华/美格信/指南测控)与 JL 自研产测(配合 JL 产测串口板与 JL π-HAT 上位机)。

以下主题属于其他页面,本页只做交叉指引,不展开叙述:

  • 音频流节点(SpeakerEQ、BitWidth Convert、DAC 节点)的详细配置,见音频配置相关页面;
  • 测试盒串口升级流程,见升级配置相关页面;
  • 蓝牙音量同步(经典蓝牙音量同步),见蓝牙配置相关页面。

Overview

AC792N SDK 面向耳机/音箱类产品,产线需要在不运行完整应用逻辑的前提下验证射频指标(Wi-Fi/蓝牙收发功率、信道、速率、晶振校准)与音频声学指标(MIC 频响、Speaker EQ、ANC/ENC 性能)。为此 SDK 提供两条测试链路:

  1. RF_FCC 测试模式:通过 IO 检测、脉冲检测、串口指令或上电自启等方式进入专用射频测试模式,由上位机(通常是 FCC 测试工装/产测盒)通过 UART 下发命令,控制芯片进行 Wi-Fi TX/RX、蓝牙 TX 等射频收发测试,并回传 PASS/FAIL 结果。

  2. 产测流程(音频/声学):产测设备(第三方如兆华、美格信、指南测控,或 JL 自研 π-HAT 上位机)通过蓝牙 SPP 或串口与产品通信,下发音效 bypass、MIC 频响测试、Speaker EQ 校准、ANC/ENC 校准、按键检测等指令,产品端执行对应测试流程并上报结果。

两种链路共享同一思想:产线设备驱动、产品端执行、结果上报,从而把测试逻辑从应用代码中隔离出来,保证量产一致性。

Architecture

下图展示了产测与射频测试工具的整体架构,包括两条主要测试链路(RF_FCC 射频测试链路与音频/声学产测链路)及其共享的底层驱动:

flowchart TD
    subgraph sg_PC["产线设备(上位机)"]
        FCCBox["FCC测试工装/产测盒"]
        PiHat["JL π-HAT 上位机"]
        ThirdParty["第三方设备(兆华/美格信/指南测控)"]
    end

    subgraph sg_Comm["通信通道"]
        UART["UART 串口 (uart0/uart1/uart2)"]
        BT_SPP["蓝牙 SPP"]
    end

    subgraph sg_SDK["AC792N SDK 产品端"]
        subgraph sg_RF["RF_FCC 测试工具"]
            RfFccMain["rf_fcc_main.c<br/>命令解析/执行"]
            RfFccHdr["rf_fcc_main.h<br/>触发模式配置"]
            WifiModule["wifi_moudle.c<br/>MP测试状态管理"]
        end
        subgraph sg_PT["产测流程"]
            AudioPT["音频/通话产测"]
            SpkEQ["Speaker EQ 校准"]
            AncPT["ANC 调试/产测"]
            EncPT["ENC 麦克风阵列校准"]
            KeyPT["按键产测 (app_key_dut.c)"]
        end
        subgraph sg_HW["底层硬件驱动"]
            Gpio["GPIO (IO触发)"]
            Gpcnt["GPCNT 脉冲计数"]
            WifiMac["Wi-Fi MAC/PHY"]
            BtMac["蓝牙控制器"]
            AdcDac["ADC/DAC 音频通路"]
        end
    end

    FCCBox -->|"FCC协议帧"| UART
    PiHat -->|"产测指令"| BT_SPP
    PiHat -->|"产测指令"| UART
    ThirdParty -->|"SPP/串口指令"| BT_SPP
    ThirdParty -->|"SPP/串口指令"| UART

    UART --> RfFccMain
    BT_SPP --> AudioPT
    UART --> AudioPT

    RfFccMain --> RfFccHdr
    RfFccMain --> WifiModule
    RfFccMain --> WifiMac
    RfFccMain --> BtMac
    AudioPT --> SpkEQ
    AudioPT --> AncPT
    AudioPT --> EncPT
    AudioPT --> KeyPT
    AncPT --> AdcDac
    EncPT --> AdcDac
    SpkEQ --> AdcDac

架构要点:

  • RF_FCC 测试链路:rf_fcc_main.c 是命令中枢,解析来自 UART 的 FCC 协议帧,调用 Wi-Fi 射频接口(wf_tx_sine_test、wifi_get_mac 等)与蓝牙接口执行测试;wifi_moudle.c 维护 MP 测试状态(mp_test_status),用于在测试中随时打断 TX 循环。
  • 音频产测链路:蓝牙 SPP/串口接入 AudioPT(音频/通话产测),派生出 Speaker EQ 校准、ANC/ENC 测试与按键产测,全部落到 ADC/DAC 音频通路上。
  • 触发机制:产品端通过 GPIO 电平检测或 GPCNT 脉冲计数(10kHz 附近频率)识别产测工装接入,从而进入 RF_FCC 模式,避免误触。

RF_FCC 测试工具详解

RF_FCC 测试工具位于 sdk/apps/common/rf_fcc_tool/(并存在一套扩展版 sdk/apps/common/ext_rf_fcc_tool/),其编译由以下两个配置宏控制:

#if TCFG_RF_FCC_TEST_ENABLE || TCFG_RF_PRODUCT_TEST_ENABLE

Source: rf_fcc_main.c

即只有工程使能了 TCFG_RF_FCC_TEST_ENABLE(RF FCC 测试)或 TCFG_RF_PRODUCT_TEST_ENABLE(射频产测)时,该模块才被编译进固件,避免在正式出货固件中残留测试代码,减小固件体积并降低误入测试模式的风险。

触发模式(进入 RF_FCC 测试的方式)

rf_fcc_main.h 定义了 5 种触发模式,通过 CONFIG_RF_FCC_TRIGGER_MODE 宏选择:

宏值含义
IO_TRIGGER_MODE0IO 检测触发:产测工装拉高/拉低指定 IO
GPCNT_TRIGGER_MODE1脉冲检测触发:GPCNT 计数检测指定频率脉冲
UART_CMD_MODE2串口指令触发:上位机发指令进入
USER_DEF_MODE3用户定义触发:重写 fcc_enter_user_def() 定制
AUTO_STARTUP_MODE4上电自动进入 RF_FCC 测试模式
#define IO_TRIGGER_MODE      (0) //"IO检测"方式触发进入RF_FCC测试模式
#define GPCNT_TRIGGER_MODE   (1) //"脉冲检测"方式触发进入RF_FCC测试模式
#define UART_CMD_MODE        (2) //"串口指令"方式触发进入RF_FCC测试模式
#define USER_DEF_MODE        (3) //"用户定义"方式触发进入RF_FCC测试模式
#define AUTO_STARTUP_MODE    (4) //上电进入RF_FCC测试模式

#define CONFIG_RF_FCC_TRIGGER_MODE   AUTO_STARTUP_MODE //RF_FCC触发方式配置
#define CONFIG_RF_FCC_TRIGGER_IO_PORT   IO_PORTC_01    //RF_FCC"IO检测"IO配置
#define CONFIG_RF_FCC_TRIGGER_IO_STATE  (1)            //RF_FCC"IO检测"IO的状态配置,0:低电平触发,1:高电平触发
#define CONFIG_RF_FCC_TRIGGER_IO_CNT    (10)           //RF_FCC"IO检测"IO的检测次数
#define CONFIG_RF_FCC_GPCNT_TRIGGER_FREQ_H  (11000)    //RF_FCC"脉冲检测"频率上限,单位Hz
#define CONFIG_RF_FCC_GPCNT_TRIGGER_FREQ_L  (9000)     //RF_FCC"脉冲检测"频率下限,单位Hz
#define CONFIG_RF_FCC_GPCNT_TRIGGER_CNT     (10)       //RF_FCC"脉冲检测"次数
#define CONFIG_RF_FCC_TRIGGER_GPCNT_PORT    IO_PORTC_01//RF_FCC"脉冲检测"IO

Source: rf_fcc_main.h

设计意图:

  • IO 检测:产线工装通过排针直接拉高/拉低某个 IO,连续检测 CONFIG_RF_FCC_TRIGGER_IO_CNT(10)次有效才进入,用多次采样防止抖动误触发。
  • GPCNT 脉冲检测:工装输出 10kHz 附近的脉冲信号(频率上下限 9k~11kHz),利用 GPCNT 硬件计数器检测,频率匹配且计数满 10 次才进入——这是为了防止音频播放等随机信号误触发,只有特定工装才产生该特征频率。
  • AUTO_STARTUP_MODE:上电直接进入测试模式,适合把测试固件单独烧录的场景,简化产线操作。

当选择 GPCNT_TRIGGER_MODE 时还会自动打开 TCFG_GPCNT_ENABLE:

#if (CONFIG_RF_FCC_TRIGGER_MODE == GPCNT_TRIGGER_MODE)
#define TCFG_GPCNT_ENABLE
#endif

Source: rf_fcc_main.h

与上位机的通信协议

RF_FCC 测试通过 UART 与上位机(FCC 测试工装)通信,通信串口由 rf_fcc_get_uart() 返回(默认实现可被外部同名函数覆盖,返回 "uart0"/"uart1"/"uart2")。协议帧为定长数组,帧头 0x04 0x0E 为 HCI 风格的事件包,0x01 0xA1 为自定义命令包,最后一个字节为子命令码:

static const u8 FCC_RSP_ARRAY[7]       = {0x04, 0x0E, 0x01, 0x01, 0xA1, 0xA2, 0x00};
static const u8 FCC_RSP_FAIL_ARRAY[7]  = {0x04, 0x0E, 0x01, 0x01, 0xA1, 0xA2, 0x01};
static const u8 FCC_READY_RSP_ARRAY[7] = {0x04, 0x0E, 0x01, 0x01, 0xA1, 0xA2, 0x02};
static u8 FCC_HEART_RSP_ARRAY[10] = {0x04, 0x0E, 0x04, 0x01, 0xA1, 0xA3, 0x00, 0x00, 0x00, 0x00};
static const u8 FCC_WIFI_ARRAY[10]      = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x01};
static const u8 FCC_BT_ARRAY[10]        = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x02};
static const u8 FCC_RESET_ARRAY[10]     = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x03};
static const u8 FCC_RES_SUCC_ARRAY[10]  = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x04};
static const u8 FCC_RES_FAIL_ARRAY[10]  = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x05};
static const u8 FCC_BT_DUT_ARRAY[10]    = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
static const u8 FCC_BT_BQB_ARRAY[10]    = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07};
static const u8 FCC_EXIT_ARRAY[10]      = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08};
static const u8 FCC_SET_BT_WIFI_MAC_ARRAY[10] = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x09};
static const u8 FCC_GET_BT_WIFI_MAC_ARRAY[10] = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0A};
static const u8 FCC_SET_BLE_MAC_ARRAY[10]     = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0B};
static const u8 FCC_GET_BLE_MAC_ARRAY[10]     = {0x01, 0xA1, 0xA2, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0C};

Source: rf_fcc_main.c

协议子命令码含义:

子命令码命令方向
0x00测试 PASS 应答产品 → 上位机
0x01测试 FAIL 应答产品 → 上位机
0x02READY(就绪)应答产品 → 上位机
0x03RESET 复位上位机 → 产品
0x04结果成功上报产品 → 上位机
0x05结果失败上报产品 → 上位机
0x06进入 BT DUT 模式上位机 → 产品
0x07进入 BT BQB 模式上位机 → 产品
0x08EXIT 退出测试模式上位机 → 产品
0x09/0x0A设置/读取 BT+Wi-Fi MAC上位机 → 产品
0x0B/0x0C设置/读取 BLE MAC上位机 → 产品

此外 FCC_HEART_ARRAY/FCC_READY_ARRAY 构成心跳/就绪握手:0x01 0xA1 0xA3 ... 0x00 为心跳命令,... 0x01 为 READY,用于上位机确认产品端测试固件已就绪。

核心数据结构

struct ctl_params 是 RF_FCC 测试的全局控制块,集中管理通信句柄、发送/接收参数、信号信息和并发同步原语:

struct ctl_params {
    int usb_id;
    int tx_pid;
    u32 rand_num;
    u32 total_rx_cnt;
    void *uart_hdl;
    struct FCC_TX tx_params;
    struct FCC_RX rx_params;
    struct list_head head;
    OS_SEM conn_sem;
    OS_SEM cdc_sem;
    OS_MUTEX list_mutex;
    struct WIFI_SIGN_INFO g_sign_info;
    struct rate_info tx_rate_tab[20];
    u8 online_flag;
    u8 tx_stop_flag;
    char sign_ssid[33], sign_pwd[65];
    u8 wifi_send_pkg[1564] __attribute__((aligned(4)));
    u8 uart_circlebuf[1024] __attribute__((aligned(4)));
    char fcc_str[3][8];
    s8 ana_pw;
    u8 test_mode;
    u8 signalling_mode;
} *__THIS;

Source: rf_fcc_main.c

关键字段设计意图:

  • tx_params/rx_params(FCC_TX/FCC_RX):封装信道、功率、速率、发包数等射频参数,供 Wi-Fi TX/RX 测试使用;
  • conn_sem/cdc_sem/list_mutex:并发原语。conn_sem 用于等待连接建立,list_mutex 保护发送任务链表,tx_stop_flag 用于停止持续发送(npackets=0 时);
  • wifi_send_pkg[1564]:预分配的对齐发送缓冲区,最大支持 1513 字节数据 + 头部,避免测试中动态内存分配导致的不确定时序;
  • uart_circlebuf[1024]:UART 环形缓冲区,用于异步接收上位机命令;
  • signalling_mode:信令模式标志,配合 WIFI_SIGN_INFO 结构实现 Wi-Fi 信令测试(连接 SSID 后测吞吐)。

rate_info 结构将速率字符串映射为 PHY/MCS 编码,用于 tx_rate_tab[20] 速率表:

struct rate_info {
    const char string[6];
    u8 phy;
    u8 mcs;
};

Source: rf_fcc_main.c

MP 测试状态管理(wifi_moudle.c)

扩展版工具 ext_rf_fcc_tool/wifi_moudle.c 维护一个全局 mp_test_status 状态,Wi-Fi 事件回调通过 WIFI_EVENT_MP_TEST_START/WIFI_EVENT_MP_TEST_STOP 感知 MP 测试的启停:

static u8 mp_test_status;
static void *wifi_dev = NULL;

Source: wifi_moudle.c

case WIFI_EVENT_MP_TEST_START:
    puts("|network_user_callback->WIFI_EVENT_MP_TEST_START\n");
case WIFI_EVENT_MP_TEST_STOP:
    puts("|network_user_callback->WIFI_EVENT_MP_TEST_STOP\n");

Source: wifi_moudle.c

设计意图:mp_test_status 被 Wi-Fi 发送循环(TX 测试)周期检查,一旦上位机下发停止(wifi_set_mp_test_status(0))就立即退出发送循环;同样地,进入 MP 测试(wifi_set_mp_test_status(1))时 Wi-Fi 驱动会暂停正常的连接管理逻辑,保证射频测试不被协议栈打断——这是量产射频测试稳定性的关键:

void wifi_set_mp_test_status(u8 status)
{
    mp_test_status = status;
}

Source: wifi_moudle.c

产测流程(音频/声学)

通用产测(第三方设备)

SDK 支持市面主流第三方产测设备:兆华、美格信、指南测控,通过蓝牙 SPP 或产测串口板接入。产测配置入口位于 SDK 的产测配置页(音频配置 -> 产测配置):

  • 音频/通话产测:测试 MIC 频响、算法输出频响等,支持蓝牙 SPP 产测(需要产测设备支持对应指令);
  • 音频 bypass 模式:bypass 蓝牙音乐各类音效处理,用于 SpeakerEQ 校准(需要产测设备支持对应指令);
  • 麦克风阵列校准:校准双麦 ENC MIC 幅度一致性,需配合音频/通话产测配置使用。

Speaker EQ 校准

由于生产样机喇叭存在一致性差异,需要通过 Speaker EQ 校准喇叭频响。节点添加规则:在 BitWidth Convert 节点之前添加 SpeakerEQ 节点;若流程中没有 BitWidth Convert 节点,则在 DAC 节点之前添加。

注意:自研产测通常会下发音效 bypass 指令,因此需要在产测模式下也添加 SpeakerEQ 节点,否则 SpeakerEQ 测试无效。

ANC 调试/产测

  • 蓝牙调试/产测(音频配置 -> ANC配置 -> 蓝牙调试/产测):支持 ANC_DESIGNER、第三方设备蓝牙 SPP 调试/产测;
  • 串口调试/产测(音频配置 -> ANC配置 -> 串口调试/产测):支持 ANC_DESIGNER、第三方产测串口板调试/产测。

自研产测(JL π-HAT)

JL 自主研发的产测流程需配合 JL 产测串口板 以及 JL π-HAT 上位机,已支持:SPK 测试及校准(Speaker EQ)、ANC 测试及校准、ENC 测试及校准(麦克风阵列校准)、按键产测。

自研产测必选配置(当前仅支持有 ANC 功能的方案):

  1. 音频配置 -> ANC配置 -> 串口调试/产测:用于基础通讯;
  2. 音频配置 -> 产测配置 -> 音频/通话产测:用于部分命令交互;
  3. 升级配置 -> 升级选择 -> 测试盒串口升级:复用测试盒相关命令交互;
  4. 蓝牙配置 -> 经典蓝牙 -> 音量同步:用于控制小机音量。

ENC 产测:支持 ANC MIC 频响测试、双/三麦通话(MIC 频响 + 通话算法输出)、单麦通话(仅 MIC 频响,暂不支持通话算法)。麦克风阵列校准用于校准麦克风与金机的幅度差,支持单/双/三麦校准。

ANC 产测:支持 FF/FB/HYBRID ANC 性能测试及校准,目前与 Speaker EQ 绑定测试。AC700N 仅支持 FF 方案;JL701N 支持 FF、FB、HYBRID 方案。

按键产测:检测逻辑为——获取小机按键表获取产品按键信息,再检测待测样机的按键事件响应来判断按键功能是否正常。按键配置路径为 apps/earphone/tools/app_key_dut.c,可自定义产测按键值与按键表。

核心流程

RF_FCC 射频测试时序

以下序列图展示上位机与产品端在 RF_FCC 测试模式下的典型交互:

sequenceDiagram
    participant U as 上位机(产测盒)
    participant D as 产品端(rf_fcc_main.c)
    participant W as Wi-Fi/蓝牙控制器

    Note over U,D: 触发阶段(IO/脉冲/上电)
    D->>D: 触发条件满足,进入RF_FCC模式
    D-->>U: FCC_READY_RSP (0x04 0x0E ... 0x02)

    loop 心跳保持
        U->>D: FCC_HEART (0x01 0xA1 0xA3 ...)
        D-->>U: FCC_HEART_RSP
    end

    U->>D: FCC_WIFI (子命令0x01) 进入WiFi测试
    D->>W: wifi_fcc_moudle_init / wifi_set_mp_test_status(1)
    U->>D: 下发信道/功率/速率参数
    D->>W: wifi_tx_data_test(channel, power, rate, ...)
    W-->>D: 持续/定次发送完成
    D-->>U: FCC_RES_SUCC (0x01 ... 0x04) 或 FCC_RES_FAIL (0x05)

    U->>D: FCC_EXIT (子命令0x08) 退出测试
    D->>W: wifi_set_mp_test_status(0)
    D-->>U: FCC_RSP (PASS)

产测设备交互流程

flowchart TD
    Start([产线开始]) --> Trigger{"进入产测模式?"}
    Trigger -->|"蓝牙SPP"| SPP["产测设备连SPP"]
    Trigger -->|"串口板"| UART["JL产测串口板连接"]
    SPP --> Init["初始化产测会话<br/>音量同步/命令交互"]
    UART --> Init

    Init --> Case{"产测类型?"}
    Case -->|"SPK"| SPK["下发音效bypass指令<br/>SpeakerEQ节点生效"]
    Case -->|"ANC"| ANC["ANC性能测试及校准<br/>FF/FB/HYBRID"]
    Case -->|"ENC"| ENC["MIC频响测试<br/>麦克风阵列校准"]
    Case -->|"按键"| Key["读取按键表<br/>检测按键事件响应"]

    SPK --> Res{"测试结果?"}
    ANC --> Res
    ENC --> Res
    Key --> Res
    Res -->|"PASS"| Pass["记录良品数据"]
    Res -->|"FAIL"| Fail["标记不良品"]
    Pass --> End([产线下一台])
    Fail --> End

使用示例

示例一:Wi-Fi TX 数据测试接口

wifi_tx_data_test() 是 RF_FCC 最核心的发送测试接口,支持指定信道、数字增益、速率、数据内容、发送次数与间隔;npackets=0 表示持续发送直到被停止:

/**
 * @brief wifi_tx_data_test,WIFI发送数据测试
 *
 * @param
 *          u8 channel     :信道(1-13)
 *          u8 power       :数字增益(0-128)
 *          u8 rate        :速率
 *          u8 *packet     :需发送的数据
 *          u32 packet_len :需发送的数据长度(1-1513)
 *          u32 npackets   :发送次数;设为0,则一直发送
 *          u32 tx_interval:发送间隔
 *
 * @note
 */
void wifi_tx_data_test(u8 channel, u8 power, u8 rate, u8 *packet, u32 packet_len, u32 npackets, u32 tx_interval);

Source: rf_fcc_main.h

设计意图:该接口设计为纯参数化调用,上位机只需下发 7 个参数即可完成任意配置的发射测试;npackets=0 的持续发送模式配合 tx_stop_flag/mp_test_status 形成"发-停"机制,用于频谱仪长时间观测或产线快速停止。

示例二:RF_FCC 初始化接口

rf_fcc_test_init() 为测试模块入口,返回初始化结果:

/**
 * @brief rf_fcc_test_init,RF_FCC测试初始化
 *
 * @param
 *
 * @note
 */
u8 rf_fcc_test_init(void);

Source: rf_fcc_main.h

示例三:自定义扩展钩子

RF_FCC 模块提供三个可被外部同名函数覆盖的钩子,用于适配不同产品的产测流程:

/**
 * @brief rf_fcc_get_uart,获取RF_FCC测试的上位机通信串口号
 * @note 可在外部定义同名函数,修改返回的通信串口号("uart0"/"uart1"/"uart2")
 */
const char *rf_fcc_get_uart(void);

/**
 * @brief fcc_enter_user_def,开机检测是否进入RF_FCC测试
 * @note 可在外部定义同名函数,修改触发方式
 */
u8 fcc_enter_user_def(void);

/**
 * @brief fcc_res_handler,RF_FCC测试结果处理
 * @param res == true, 测试PASS;res == false, 测试FAIL
 * @note 可在外部定义同名函数,根据测试结果添加自定义操作
 */
void fcc_res_handler(u8 res);

Source: rf_fcc_main.h

示例四:MP 测试状态查询

Wi-Fi 驱动层通过状态查询接口在发送循环中响应停止指令:

u8 wifi_get_mp_test_status(void)
{
    return mp_test_status;
}

Source: wifi_moudle.c

配置选项

RF_FCC 测试配置(rf_fcc_main.h)

选项类型默认值描述
TCFG_RF_FCC_TEST_ENABLEbool工程配置RF_FCC 测试功能总开关
TCFG_RF_PRODUCT_TEST_ENABLEbool工程配置射频产测功能总开关
CONFIG_RF_FCC_TRIGGER_MODEenumAUTO_STARTUP_MODE(4)进入测试模式的触发方式(IO/脉冲/串口/用户/上电)
CONFIG_RF_FCC_TRIGGER_IO_PORTIOIO_PORTC_01IO 触发方式使用的 IO 口
CONFIG_RF_FCC_TRIGGER_IO_STATEu81IO 触发电平(0:低电平,1:高电平)
CONFIG_RF_FCC_TRIGGER_IO_CNTu810IO 触发连续检测次数(防抖动)
CONFIG_RF_FCC_GPCNT_TRIGGER_FREQ_Hu3211000脉冲触发频率上限(Hz)
CONFIG_RF_FCC_GPCNT_TRIGGER_FREQ_Lu329000脉冲触发频率下限(Hz)
CONFIG_RF_FCC_GPCNT_TRIGGER_CNTu810脉冲触发检测次数
CONFIG_RF_FCC_TRIGGER_GPCNT_PORTIOIO_PORTC_01脉冲检测 IO
TCFG_GPCNT_ENABLEbool随模式自动使能GPCNT 硬件计数使能(仅脉冲模式)
CONFIG_FCC_BT_ADJ_ENABLEbool开蓝牙功率校准使能
RF_FCC_IN_NORNAL_WORKmacro开允许在正常工作模式下进行 RF_FCC 测试
RF_FCC_MODE_KEEPmacro关保持 RF_FCC 模式(注释掉则关闭)
FCC_USB_COMMmacro关使用 USB 与上位机通信(注释掉则关闭)

产测流程配置

配置项入口说明
音频/通话产测音频配置 -> 产测配置MIC 频响、算法输出频响测试,支持蓝牙 SPP
麦克风阵列校准音频配置 -> 产测配置双麦 ENC MIC 幅度一致性校准
ANC 蓝牙调试/产测音频配置 -> ANC配置ANC_DESIGNER/第三方蓝牙 SPP
ANC 串口调试/产测音频配置 -> ANC配置ANC_DESIGNER/产测串口板
JL 自研 ANC 产测音频配置 -> 产测配置FF/FB/HYBRID 性能测试及校准(与 Speaker EQ 绑定)
JL 自研 ENC 产测音频配置 -> 产测配置ANC MIC/双三麦/单麦频响测试
按键产测音频配置 -> 产测配置按键表 + 按键事件响应检测
测试盒串口升级升级配置 -> 升级选择复用测试盒命令交互(自研产测必选)
音量同步蓝牙配置 -> 经典蓝牙控制小机音量(自研产测必选)

API 参考

u8 rf_fcc_test_init(void)

RF_FCC 测试初始化入口,在测试模式触发后调用,完成 UART 通信、FCC 协议帧注册与射频模块初始化。

Returns: u8 初始化结果(0 成功/非 0 失败)。

void wifi_tx_data_test(u8 channel, u8 power, u8 rate, u8 *packet, u32 packet_len, u32 npackets, u32 tx_interval)

Wi-Fi 发射测试接口。

Parameters:

  • channel (u8): 信道,范围 1-13;
  • power (u8): 数字增益,范围 0-128(MAX_DGAIN=128/MIN_DGAIN=0);
  • rate (u8): 发送速率(对应 tx_rate_tab[20] 速率表索引);
  • packet (u8*): 待发送数据缓冲;
  • packet_len (u32): 数据长度,1-1513;
  • npackets (u32): 发送次数,0 表示持续发送;
  • tx_interval (u32): 发送间隔。

注意: 晶振微调参数 xosc 范围为 0-15(MAX_XOSC/MIN_XOSC),通过 wf_read_xosc/wf_write_xosc 读写。

const char *rf_fcc_get_uart(void)

获取上位机通信串口号。可在外部定义同名函数覆盖,返回 "uart0"/"uart1"/"uart2"。

u8 fcc_enter_user_def(void)

开机检测是否进入 RF_FCC 测试。可在外部定义同名函数修改触发逻辑(USER_DEF_MODE 时使用)。

void fcc_res_handler(u8 res)

测试结果处理回调。res==true 表示 PASS,res==false 表示 FAIL;可在外部定义同名函数添加自定义操作(如点亮产测指示灯、上报产测盒)。

void wifi_set_mp_test_status(u8 status) / u8 wifi_get_mp_test_status(void)

设置/获取 MP 测试状态。进入测试置 1,退出清 0;Wi-Fi 发送循环据此决定是否停止。

失败模式与边界情况

  • 触发误判:IO 触发使用 10 次连续采样防抖;脉冲触发用 9k~11kHz 频带 + 10 次计数双重约束,避免音乐播放等随机信号误入测试模式。若现场频繁误触发,应检查 CONFIG_RF_FCC_TRIGGER_IO_STATE 电平极性是否与工装一致。
  • 持续发送无法停止:npackets=0 持续发送模式下,上位机必须通过 FCC_EXIT 命令(子命令 0x08)或 Wi-Fi 事件 WIFI_EVENT_MP_TEST_STOP 置位 mp_test_status 来打断;若发送循环未检查该标志(如阻塞在硬件发送),需要复位芯片。
  • 通信串口不一致:rf_fcc_get_uart() 返回的串口与工装接线必须匹配;不同方案默认串口可能不同,需在外部覆盖实现。
  • 协议帧校验:FCC 帧为固定长度定长数组,若上位机发送的帧长度/子命令码不匹配,模块无法识别,不会响应。struct fcc_info 中保留了 crc 字段(配合 asm/crc16.h),用于结果上报时的 CRC 校验。
  • 自研产测限制:当前自研产测仅支持有 ANC 功能的方案;单麦通话仅支持 MIC 频响测试,不支持通话算法测试;AC700N 仅支持 FF ANC 方案。
  • SpeakerEQ 测试失效:若产测模式下音频流未添加 SpeakerEQ 节点(需在产测模式而非仅音乐模式添加),下发音效 bypass 指令后 SpeakerEQ 测试无效。

并发与一致性考虑

  • struct ctl_params 通过 OS_SEM conn_sem、OS_SEM cdc_sem 与 OS_MUTEX list_mutex 协调测试任务与命令解析任务,避免并发访问发送任务链表;
  • tx_stop_flag 与 mp_test_status 为跨任务共享标志,发送循环在每个发送间隔内轮询,保证停止命令的响应延迟不超过一个发送间隔;
  • 发送缓冲区 wifi_send_pkg[1564] 静态预分配且 4 字节对齐,避免运行期 malloc 带来的时序抖动,保证射频测试的频谱纯净度。

性能与运维注意事项

  • 测试速度:IO/脉冲触发在开机阶段即判定,不阻塞正常启动流程(除 AUTO_STARTUP_MODE);测试帧为定长 7~13 字节,UART 9600/115200 波特率下握手开销极小;
  • 固件体积:整个 RF_FCC 模块受 TCFG_RF_FCC_TEST_ENABLE || TCFG_RF_PRODUCT_TEST_ENABLE 编译开关保护,量产固件关闭后不占用代码空间;
  • 产线维护:测试结果通过 FCC_RES_SUCC/FCC_RES_FAIL 与 fcc_res_handler() 双重上报,产线系统可据此统计直通率;晶振(xosc)与功率(dgain)校准值建议每台写入 syscfg(syscfg_id.h),保证一致性。

扩展点

  1. 自定义触发方式:实现 fcc_enter_user_def() 并选择 USER_DEF_MODE,可接入产线 MES 系统的特定信号;
  2. 自定义通信串口:覆盖 rf_fcc_get_uart() 适配不同硬件排线;
  3. 自定义结果处理:覆盖 fcc_res_handler() 接入条码打印、不良品标记等产线动作;
  4. 自定义按键产测:编辑 apps/earphone/tools/app_key_dut.c 的按键表定义产测按键值与按键名(字符串不超过 14 字符);
  5. 新增射频测试命令:参照 FCC_*_ARRAY 协议帧模式扩展子命令码(当前已用到 0x0C,后续子命令从 0x0D 起)。

Related Links

  • 产测配置文档(SDK 内置)
  • RF_FCC 主实现 rf_fcc_main.c
  • RF_FCC 配置与接口 rf_fcc_main.h
  • 扩展版 RF_FCC 工具(Wi-Fi 模块)
  • 扩展版 RF_FCC 主实现
  • 音频 DUT 测试流程(ADC→I2S、I2S→DAC、ADDA 回环):见音频流程相关页面
  • 测试盒串口升级:见升级配置相关页面
  • 经典蓝牙音量同步:见蓝牙配置相关页面
Next
固件升级与更新机制