拿到杰理AC692X这套SDK的第一天,我对着目录树发了十分钟呆。工程源码、上位机工具、配置表、编译脚本堆在一起,文档只交代了个大概,真正要改的东西全靠自己摸索。后来做多了才摸清楚,所谓“基本配置”其实就三条主线路:管脚资源怎么分配、系统时钟和电源怎么开、蓝牙和音频通路怎么连起来。这篇把整个配置流程从头走一遍,写一份可以照着操作的基础指南,适合刚接触AC692X方案的同学,也适合从其他蓝牙方案切过来的开发者参考。
1. 入手AC692X之前,先把这颗芯片的资源边界摸清楚
1.1 定位:它不是普通MCU,而是一套音频方案
AC692X在芯片家族里属于中低端蓝牙音频SoC,市面上大量蓝牙音箱、带麦克风的桌面音响、语音提示设备用的都是类似定位的平台。它最大的特点是单芯片集成度高:CPU核、射频、蓝牙协议栈、音频ADC和DAC、各类外设接口都在一颗芯片里,外围要加的器件很少,BOM成本压得很低。
既然是一套“音频方案”而不仅是MCU,配置的时候思维就要转变。用普通MCU的时候,你关心的是GPIO怎么翻转、定时器怎么中断;用AC692X这类芯片,更多是去理解“哪条数据通路是通的”:音频从哪进来、经过什么处理、从哪出去,蓝牙收发状态怎么通过GPIO表达出来,按键事件怎么上报给协议栈。基本配置的核心,就是把这个框架“对号入座”,让芯片知道你的板子上接了什么。
还有一点要提前建立认知:它的资源相对有限,Flash和RAM都不是拿来跑复杂逻辑的。产品需求一旦超过芯片能力,不是靠代码优化能解决的,得换系列或者加协处理器。所以开始配置前,一定要先确认目标产品的功能会不会超过AC692X的能量边界。
1.2 手头SDK里常见目录与配置文件的角色
很多新手拿到SDK第一反应是翻开源码从main开始看,实际上效率很低。AC692X这类SDK通常把“芯片底层驱动”和“具体产品工程”分开,你平时要动的不是底层驱动,而是板级适配层和配置生成工具。
常见的SDK结构里至少会有这么几块角色:
- 芯片驱动与协议栈源码:一般不需要改,升级SDK版本时整体替换。
- 板级适配目录:存放板子相关的配置文件,比如IO分配、外设初始化参数。
- 工具目录:存放用于生成配置表的PC工具,例如蓝牙参数配置、音频音效调试工具。
- 编译脚本:负责把配置表、驱动、应用层代码打包成固件。
配置这件事,一半发生在源码头文件里的宏开关,另一半发生在配套工具生成的数据表里。很多参数源码里根本看不到,是工具生成的二进制配置块,固件启动时直接加载。这一点必须建立概念,否则你改了源码但工具配置没重新生成,编译出来的固件表现会和预期完全不同。
1.3 拿到新SDK后先确认的“硬件三要素”
打开工程之前,先把硬件原理图看清楚。我每次开始一个新项目,都会花十几分钟确认三件事,后面能省掉大量排查时间。
第一是晶振。AC692X这类芯片一般需要外部提供系统时钟,常见规格是24MHz无源晶振。PCB上晶振两端匹配电容的取值直接决定起振是否稳定,配置工具里也需要对应选择晶振参数。最容易踩的问题是硬件参考设计改了电容或换成有源振荡器,但配置里没改,导致时钟频率偏差,蓝牙连接不稳定。
第二是Flash和RAM。同一系列不同尾缀的型号,内置Flash和RAM容量可能不一样。SDK默认工程是按某个典型型号做的,换成低配型号,开太多功能会编译不过或者运行时死机;换成高配型号倒是没问题,但成本和物料管理不划算。所以开项目前先查这个型号的资源规格,再对照默认工程的宏开关估算空间占用。
第三是封装管脚分配。AC692X不同封装下可用IO数量差别很大,而且不少引脚是多功能复用引脚。硬件设计用什么脚接了按键、LED、UART、功放使能,必须在配置里一一对应。这一步错一个,整个板上就可能有几个功能“静默失败”。
2. 配置文件大盘点:从sys_config到board_config都要改什么
2.1 system_config:全局功能开关与电源策略
SDK里一般会有一个全局配置头文件,名字五花八门,但作用都类似:用一堆宏开关决定把哪些功能模块编进固件。这个文件是“基本配置”的起点,因为它直接决定了固件体积和功能集合。
我刚接触AC692X的时候,犯过一个特别典型的错误:默认工程什么宏都开着,TWS对箱、EQ音效、多种音频输入、按键音、语音提示全部编进去,结果Flash空间不够,编译链接报错。后来学了乖,第一件事先按产品定义把不需要的模块关掉。
举个例子,如果只做一款普通的单喇叭蓝牙音箱,不需要TWS左右配对,不需要LINEIN和USB音频输入,那么对应的宏就可以全部关掉。这样不仅Flash空间宽裕了,代码逻辑也简单,后续排查问题不用面对一堆用不到的状态机。
另一个要关注的是电源策略。AC692X通常支持多种电源模式,比如正常模式、轻睡眠、深度睡眠。配置里会有关键词涉及低功耗唤醒条件。如果做的是插电音箱,完全可以让它不休眠;如果是便携设备,就要仔细配唤醒源。这里我建议初期先把低功耗关掉,让所有功能跑稳定后再打开。因为低功耗会引入大量时序问题,比如唤醒不及时、蓝牙断开未重连,新手阶段很难分清是配置问题还是代码问题。
2.2 board_config:管脚分配是基本配置里最容易翻车的点
板级配置文件的地位非常高。它的作用是把芯片物理引脚映射到“逻辑功能”上。IO1是接按键还是接LED?UART调试串口复用在哪两个引脚?功放使能脚是哪个?这些全在板级配置里定义。
这个文件改起来看起来很简单,就是“点选IO、配置方向、配置上下拉”,但实际上最容易翻车。因为引脚复用的关系通常很复杂,一个引脚可能同时是AD按键检测口、I2C时钟、PWM输出口,配置表里把功能选错,编译不会报错,运行也不会崩溃,就是那个功能没反应。
我的习惯是写配置前先做一个表格,把原理图上的网络名、芯片物理引脚、功能配置、外设类型一一列出来。比如“网络名PA4-芯片引脚12-配置成普通输出-接功放EN”;“网络名KEY2-芯片引脚7-配置成ADC按键输入-检测音量加减”。先对着表在纸上把所有IO都过一遍,再去配置工具里操作,能避免一半以上的低级错误。
还要留意上下拉设置。按键如果是低有效,芯片内部又没有配置上拉,而且硬件也省了上拉电阻,那么按键输入会一直处于浮空状态,轻则误触发,重则整机功耗异常。LED那段也要确认驱动能力,有些IO直接驱动LED可能电流不够,硬件上就要加三极管或者恒流驱动,单纯靠配置改不了。
2.3 外设参数:UART、按键、LED与音频通路的配置入口
板级配置里除了IO定义,还有各类外设的具体参数。UART调试串口要选择复用引脚、设置波特率,常用115200或921600,还要确认日志打印等级是否被打开,否则后续想看运行日志什么都看不到,排查全靠猜。
按键配置要看硬件设计类型。AC692X常见两种按键接法,一种是每个按键独立占用一个普通IO,另一种是ADC按键分压方案,多个按键通过不同电阻分压接到同一个ADC引脚,芯片采集电压值来区分是哪个键。分压式按键省IO,但配置要特别留意电阻分压后电压是否落在芯片识别的阈值区间。我见过一个项目,音量加键和播放键的电压差太小,芯片经常误识别,后来硬件改了电阻才解决。配置工具里一般能看到按键电压阈值,要让每个按键的分压电压尽量靠近识别区间中间点,留出裕量。
LED配置通常是结合蓝牙状态的事件来用的,比如未连接时快闪、连接后慢闪、放歌时常亮或随音乐呼吸。板级配置只管LED引脚和点亮的电平逻辑,真正控制闪烁节奏的逻辑在应用代码的事件回调里。所以LED这里配置的“接入点”要清楚:先保证IO能亮,再谈闪烁逻辑。
音频通路的配置入口要看方案结构。典型的蓝牙音箱通路是:手机蓝牙传输过来->芯片解码->DAC输出模拟信号->功放->喇叭。还有一条常见通路是LINEIN输入->ADC采样->内部处理->DAC输出。配置文件里要选择当前使用的音频输入源、DAC输出增益、是否单片直推喇叭(通常只推耳机,喇叭需要外接功放)。第一次配置我会建议把所有增益调到保守值,能出声了再往大调。
3. 手把手改出一份能出声的基础配置
3.1 第一步:建立工程拷贝与型号确认
不要直接拿默认工程开工。一定先把SDK自带的工程目录完整复制一份,改成自己项目的名字。原因很简单:配置改乱了,还能对照原始工程找回默认值。这个动作成本极低,收益极高。
然后确认当前工程对应的具体型号寄存器配置。部分SDK的芯片型号选择是编译脚本里的参数,有的是代码里的宏定义。选错型号最典型的症状是烧录后芯片能枚举USB但运行日志打印乱码,或者某些外设初始化失败。先看SDK自带的文档或者Makefile里的型号宏,改成你手上的尾缀。
3.2 第二步:核心时钟和关中断配置
系统时钟配置一般在某个初始化模块里,默认值通常是按参考设计调好的。这里我要强调一遍:除非你是老手,否则不要动PLL倍频系数这些参数。起振失败会导致芯片根本跑不起来,而且这种失败在日志里可能只表现为“卡在时钟初始化”或者干脆没日志。
比较值得花时间的是看晶振参数选项。SDK配置工具里一般会有外部晶振频率选项,如果硬件设计用了24MHz,而工具里选了12MHz,系统时钟会偏到离谱,蓝牙都搜不到信号。我遇到过好几次这种低级问题,都是因为工具界面下拉框默认值和实际硬件不一致。
调完晶振和系统时钟,可以顺手确认中断优先级配置是否满足当前应用。不过这一步初期不用管,默认配置已经够跑通基础功能。
3.3 第三步:GPIO复用与外部晶振检查
配置GPIO复用前,把手头原理图再翻出来,画一遍“管脚功能对应表”。比如这个引脚接了什么按键,那个引脚接了功放的使能和静音。然后进入板级IO配置表,把每个引脚用途一一对应填上。
这里有一个很实用的验证方法:先不编译整个固件,只编译一个最小工程,把芯片启动起来,用示波器或者万用表逐个量配置过的IO,看看电平状态是否和配置一致。比如某个引脚配置成输出高电平去拉功放EN,量不到高电平,那说明复用配置没生效,多半是IO功能冲突了。这一步能在硬件焊接前就发现问题。
外部晶振起振检查是整个配置流程里最容易被忽略的。如果开机无反应且无日志,不要急着查固件,先量晶振引脚,正常情况下应该有振荡波形。没有波形的话,查晶振是否焊反、匹配电容是否异常、供电是否正常。我之前调一个新板子,MCU怎么都跑不起来,最后发现是晶振旁边的焊盘虚焊,重新焊接后一切正常,白白浪费了半天排配置。
3.4 第四步:按键与LED的状态反馈配置
按键配置要确定两件事:硬件接法和键值映射。如果一个键是普通IO接法,配置里选普通输入并设置上下拉;如果用的是ADC分压方式,在配置工具里选ADC按键,并填入对应的电压判定范围。
然后处理键值映射。芯片扫描到物理按键后,会上报一个“键值”,比如PLAY、VOL+、VOL-。应用层的逻辑根据键值执行动作。配置文件里要做的是把物理触发映射到逻辑键值。这里建议先做一个最简单的验证程序:只配一个按键,按下后LED亮起来或者控制台打印一个字符。这个小闭环通了,再扩展到多个按键。一次性配完所有按键再调试,很难定位是硬件问题还是键值映射错误。
LED状态反馈先按最简单的来。找一个空闲GPIO,配置成输出模式,在代码里手动拉高拉低,先确认硬件上LED能亮能灭。然后再去蓝牙状态回调里把不同状态对应到不同闪烁模式。我一般还会在状态回调里加日志,这样每次连接或断开时,能从串口看到当前走进了哪个状态分支,LED有没有按预期切换一目了然。
3.5 第五步:音频通路的联通
基础配置的最后一步是把音频通路打通。先检查功放芯片的电源和使能引脚,使能脚通常需要MCU配置成高电平才工作。很多第一次做音箱的同学说“没声音”,排查一圈发现功放EN没拉高,芯片DAC输出其实有信号,就是功放没上电,喇叭自然无声。
然后在配置里把音频模式设置成音箱模式(如果有此选项),选择DAC作为输出通道,并设置一个比较保守的音量初始值。注意,有些SDK默认音量值非常低,比如只有10%左右,听起来像没声音,这时候先调音量再下结论。
首次出声的排查顺序非常重要,按下面这个顺序走,能帮你快速锁定问题:
- 确认芯片DAC引脚有模拟信号输出(用示波器或万用表交流档看)。
- 确认功放使能脚电平正确。
- 确认功放没有进入静音状态(有些功放的静音脚是低有效,没接对就永远静音)。
- 确认喇叭接线和阻抗匹配正常。
- 确认默认音量不是过低。
按这个顺序检查完整套,绝大多数“不出声”问题都能定位。别一上来就去怀疑协议栈,音频通路的基本配置其实很直白,就是信号一路畅通地送到喇叭。
4. 蓝牙相关配置:设备名、广播参数、配对模式藏在哪一层
4.1 设备信息与连接参数
蓝牙相关配置跟普通外设不一样,它主要不在源码头文件里,而是在工具生成的配置块中。比如设备名、MAC地址来源、设备类型等,都是通过上位机配置工具填写,然后生成二进制参数文件,固件启动时加载并注册进协议栈。
这里有个高发坑:很多人想改设备名,直接搜源码里的字符串去改,编译烧录后发现手机里看到的还是旧名字。原因就是设备名存放在工具生成的配置表里,源码字符串可能只是默认值或者占位符。正确的做法是打开配置工具,找到设备信息项,把广播名改掉,重新生成配置表,再完整编译烧录。
连接参数也是在工具里配置的。AC692X作为从机,可配置连接间隔、从机延迟、超时时间等。这些参数直接影响手机连接后的功耗和响应速度。连接间隔越短,数据越实时,但功耗越高;越长则更省电,但容易给人“反应慢”的感觉。建议音频应用选一个适中值,保证蓝牙不卡顿又能兼顾续航。具体数值可参考工具里的推荐档位,不建议随手填极端值。
4.2 广播与配对模式
广播参数决定手机在什么范围内、多长时间能发现设备。广播周期越短,发现越快,广播功耗越高;广播周期长,省电但手机端可能要多搜几秒。在开发调试阶段,建议把广播周期设短,方便快速发现设备;等整机功能稳定后再调回量产值。
配对模式则要分清楚“首次配对”和“回连”。AC692X默认工作流一般是:设备开机后处于可连接可发现状态,手机搜索并配对;配对成功后,下次开机则自动回连上次设备。这些行为在配置里都有对应开关。如果想限制只能连接一个设备,或者每次开机都重新进入配对啊模式,改动点就在这里。
另外,删除配对记录这个操作也要关注。量产的时候,测试机反复配对,设备里存了一堆旧配对信息,有时候会影响新设备的连接。很多平台上电时检测到某个按键组合可以清空配对表,这个功能如果不默认支持,可以在配置工具里打开相关选项。
4.3 调试阶段常用的蓝牙临时配置
开发阶段我习惯把能开的调试项全开。比如日志打印里把蓝牙连接状态、广播事件、配对流程相关日志全部打开,每次操作手机,串口都会打印对应的协议栈事件,这样能直接看到设备名有没有广播出去,手机发起连接时有没有收到事件,配对请求是否被接受。
还有一个经验:调试多设备干扰问题时,临时改一下设备名加个后缀,比如把默认名字改成带项目编号的名字,防止测试时拿错设备。等正式量产前再统一改回来。
蓝牙配置和板级配置有个很大的差异:板级配置错了,现象是某个外设不动;蓝牙配置错了,现象往往是不搜不到、连不上、连上了频繁断。排查这类问题没有捷径,只能把配置参数一项项过,并配合日志确认是哪个阶段出问题。
5. 编译与烧录的全链路注意事项
5.1 编译流程:一键脚本背后的阶段
不要把“编译”两个字想得太简单。AC692X的编译过程通常分好几步,底层驱动编译、配置表生成、应用层代码编译、链接打包固件。工程里一般提供一个build脚本,一键执行,看上去很方便,但脚本执行过程中每一步都有独立日志,要学会看脚本停在哪一步。
常见编译错误有两类。一类是C代码错误,比如头文件路径找不到、宏定义冲突,这类错误报错信息明确,编译器会指出文件和行号,直接修就行。另一类是配置表生成失败,比如配置工具生成的临时文件路径不对,或者工具版本和SDK版本不匹配。这类错误报错比较隐晦,可能会提示“找不到配置文件”或者“二进制参数生成失败”。
有个经验值得分享:改工具配置前先备份旧配置表。因为配置工具生成文件可能是覆盖式写入,改完生成后想回到上一版,如果没备份,只能重新手动填一遍,非常痛苦。我会专门建一个config_backup目录,每次改动前拷贝当前配置。
5.2 烧录失败排查链路
烧录阶段常见的问题比想象中多,尤其是第一次接触这套方案的新手。虽然烧录步骤看似简单,但细节差异会导致各种异常,下面按我实际的排查顺序写下来。
第一步,确认进入烧录模式。AC692X一般不是随便上电就能烧录,需要按住某个按键再上电,或者在工具里选择“烧录后等待设备连接”。不同开发板的进入方式不一定相同,先查SDK文档确认。如果没进入烧录模式,工具会一直显示“等待设备”。
第二步,确认USB或串口连接正常。换一条数据线、换一个USB口,别看这个动作简单,很多问题都是接触不良或线材只支持充电不支持数据传输引起的。如果用串口烧录,还要确认波特率在工具和设备端配置一致。
第三步,看烧录进度卡在哪一步。如果卡在“擦除Flash”,先查芯片是否被其他程序占用,或者Flash型号不匹配;如果卡在“写入固件”,基本是线材质量或供电不稳。开发阶段建议用独立供电,别让烧录器同时给整机供电,大电流瞬间可能导致烧录中断。
第四步,烧录成功后第一时间抓日志。如果上电后完全没日志,别急着认定烧录失败,先查串口波特率、日志开关、串口调试脚复用配置。这些问题跟烧录无关,但会让人误会固件没烧进去。
5.3 日志未输出的常见原因
日志没输出是AC692X开发里最高频的“假故障”之一。绝大多数情况固件已经在跑了,只是日志没出来。排查顺序如下:
先检查串口调试功能是否在配置里被打开,确认日志打印等级宏是否允许输出。某些SDK把日志等级分了好几级,默认等级是ERROR,你打的DEBUG看不到。再检查串口引脚复用配置,如果调试串口复用的两个引脚同时被配成了普通IO,串口肯定不通。
还需要注意一个隐蔽问题:如果配置表的串口波特率和PC端软件不一致,日志会乱码,看起来就像没输出。我用万用表量过串口TX脚,用示波器看波形也正常,最后发现是PC端波特率少打了一个零。
最后,如果日志在某个初始化阶段突然中断,超过几秒没有新输出,多半是芯片跑飞或者进入了异常中断。这时候优先查配置是否开启了低功耗且唤醒源配置不对,导致初始化还没跑完就睡了。这个问题在第五章的避坑案例里会详细展开一次完整的排查过程。
6. 基于实际项目经验的AC692X配置避坑清单
6.1 配置表与代码宏不一致的坑
配置表由工具生成,代码宏由头文件控制,两者如果不同步,固件就会表现怪异。最典型的现象:代码宏已经打开了LINEIN功能,但配置表里的音频输入源还挂在蓝牙上;或者板级配置里把某个脚配置成ADC按键,但代码宏里按键服务根本没有使能。编译不报错,运行也不崩溃,现象就是“这个功能没反应”。
因此,我每次改动配置后都会检查一遍宏开关与配置表之间的一致性,重点核对:音频输入源、功放使能脚、按键模块、LED模块。建议列个清单逐项打勾,别凭感觉省略。配置表重新生成后,必须重新编译整个工程,不能图省事只烧配置块。
6.2 IO电压、电流能力与复用冲突
AC692X的IO电平通常有电压域约束,原理图设计时如果某些外设用了不同电压的逻辑电平,配置里却按默认推挽输出,可能造成信号不识别甚至烧坏IO。这是硬件层面问题,配置层面只能尽量规避:初始化时把相应IO设置成高阻或输入态,等外部上电稳定后再切换成输出。
复用冲突我在前面提过多次,这里再补一个具体案例。某开发板把同一个引脚既配置成按键检测又配置成I2C时钟,结果按键一直误触发。在配置工具里检查IO功能表,发现两处功能都勾选了同一引脚,取消其中一个勾选后恢复正常。这类问题靠肉眼读代码很难发现,必须靠配置工具的“IO占用总览”页面来核对。
6.3 音频底噪与地线处理(从配置角度)
音频底噪问题看起来是硬件的事,但配置层面的影响也不小。DAC输出增益如果设置过高,噪声会一起放大。有些SDK还提供DAC内部滤波选项、防爆音开关,这些都值得逐项确认。
我的建议是先把DAC增益调到偏低档,先听基础底噪。如果底噪依然明显,再检查功放静音脚电平、地线布局、电源滤波。区分“配置噪声”和“硬件噪声”有一个笨办法:把音频信号用示波器在DAC输出引脚看,如果这里波形就不干净,多半是布局或供电问题;如果DAC引脚波形干净但喇叭有噪声,问题出在功放或接线。
6.4 一个典型配置问题的完整排查过程
之前做模拟项目X的时候,遇到一个现象:蓝牙正常回连,播放音乐前几秒正常,十几秒后声音开始断续,随后蓝牙断开,几秒钟后重新连接,如此循环。一开始怀疑是信号干扰,但换到其他板子也一样。
后来抓串口日志,发现断开前打印了一条低功耗唤醒相关的警告。沿着这条线索查配置,发现睡眠模式被打开了,而唤醒条件配置里只留了按键唤醒,没有把蓝牙事件纳入唤醒源。芯片进入轻睡眠后,蓝牙射频部分没有及时被唤醒,导致保持连接失败。关闭低功耗或把蓝牙事件加入唤醒源后,问题消失。
这个案例让我形成习惯:碰到“正常一会又异常”的配置类故障,先翻电源管理和低功耗配置,把睡眠相关项全部关掉再测试。AC692X这类芯片,低功耗是省电但也是复杂度的主要来源,很多时候基础功能没跑通前,别开低功耗。
AC692X的配置体系虽然看起来信息分散,但骨架很清晰:硬件管脚一张表,全局功能开关一张表,蓝牙参数一张表,音频通路一张表,四张表对上了,基本功能就跑起来了。我自己的经验是,改配置前先备份,改完先查一致性,烧录前先看日志。这套流程已经陪伴我跨过好几个项目,希望能给你的AC692X开发少填一些坑。