1. 项目概述:从零构建一个蓝牙无线耳机原型
十年前,当我第一次拆开一个蓝牙耳机,看到里面密密麻麻的芯片和走线时,就在想,这玩意儿到底是怎么把声音“凭空”传过去的?后来自己动手,用BRF6150和TLV320AIC23B这两颗经典的芯片,完整地走了一遍蓝牙耳机的设计流程,才真正搞明白其中的门道。这不仅仅是一个简单的“无线化”过程,它涉及到射频通信、音频编解码、嵌入式实时系统、低功耗设计等多个领域的交叉。今天,我就把自己当年从原理到PCB,从驱动到协议栈调试的完整经验,毫无保留地分享出来。无论你是刚入行的嵌入式工程师,还是对无线音频系统感兴趣的学生,这篇文章都能给你提供一个清晰、可复现的实现路径。我们会从最核心的蓝牙协议栈讲起,深入到BRF6150这颗SoC的硬件设计,再剖析TLV320AIC23B如何带来高保真音质,最后用VxWorks把它们“粘合”成一个能跑起来的完整系统。你会发现,设计一个能用的蓝牙耳机,远不止是画个电路图那么简单。
2. 核心硬件平台选型与设计思路
2.1 主控芯片BRF6150:为何选择这颗“古董”级SoC?
在项目启动时,市面上可供选择的蓝牙芯片方案已经不少。最终锁定TI的BRF6150,是基于几个非常现实的考量。首先,它是一颗高度集成的单芯片解决方案,把射频前端、蓝牙基带处理器、ARM7TDMI内核以及足够用的SRAM都塞进了一个封装里。这对于我们这种资源有限、追求小型化的消费电子项目来说,意味着外围电路可以极大简化,BOM成本和PCB面积都能得到有效控制。其次,它的功耗表现非常出色。官方数据是语音链接时仅需12mA,这对于依赖小容量电池的耳机来说是生死攸关的指标。我们在实测中发现,在典型的间歇性工作模式下,平均电流可以做到15mA以下,配合一块100mAh的电池,实现4-5小时的通话时间是完全可行的。
注意:选择BRF6150这类老牌芯片的一个巨大优势是资料齐全、坑都被踩得差不多了。它的数据手册、应用笔记甚至一些参考设计,在TI的官网上都能找到。这对于降低学习成本和项目风险至关重要。新手切忌盲目追求最新、最高端的芯片,老芯片的稳定性和生态支持往往是快速出成果的保障。
BRF6150的ARM7内核虽然主频不高,但处理蓝牙协议栈和简单的音频数据流调度绰绰有余。它的内存映射、外设接口(如GPIO、UART、I2C、I2S)都相对标准,便于我们进行软件移植和驱动开发。芯片内部还集成了用于语音编码的硬件模块,支持CVSD和A-law/μ-law编解码,这能进一步减轻CPU的负担。在硬件设计上,需要特别关注的是它的射频部分。BRF6150采用了直接变频架构,外围只需要匹配网络、巴伦和天线,无需昂贵的中频SAW滤波器,这再次简化了设计。天线部分我们选择了经典的倒F天线(IFA),直接布局在PCB板上,通过仔细的阻抗匹配和净空区设计,实现了接近10米的稳定传输距离。
2.2 音频编解码器TLV320AIC23B:高保真音质的基石
声音质量是耳机的灵魂。我们放弃了使用BRF6150内部集成的简单音频接口,而外挂了TLV320AIC23B这颗专业的音频编解码器,目标就是追求更好的音质。AIC23B在当时是一颗明星芯片,它集成了高性能的ADC和DAC,信噪比分别高达90dB和100dB。这是什么概念?简单来说,它能把背景噪音压得非常低,让音乐细节更清晰地呈现出来。它支持从8kHz到96kHz的采样率,以及16/20/24/32位的采样精度,给了我们很大的灵活性。对于蓝牙音频常用的SBC编码,44.1kHz或48kHz的采样率配合16位深度,已经能提供接近CD的音质体验。
这颗芯片的接口非常友好。它与主控之间通过I2S总线传输音频数据,通过I2C总线进行配置(如音量控制、输入输出选择、功耗模式设置)。这种分离的设计让数据流和控制流清晰独立。在电路设计上,AIC23B需要模拟和数字两路电源供电(通常为3.3V),并且要求高质量的退耦电容,尤其是给模拟部分供电的LDO输出端,电容的ESR要足够低,否则可能会引入可闻的底噪。麦克风输入电路需要设计偏置和增益,我们使用了单端输入方式,通过芯片内部的PGA进行放大。耳机输出部分,AIC23B可以直接驱动16Ω到32Ω的耳塞,输出功率足够,但要注意布局时音频走线要远离数字和射频部分,最好用地线包裹,以防止高频噪声串扰。
2.3 系统架构与核心总线设计
整个系统的硬件架构可以看作一个以BRF6150为核心的小型嵌入式系统。BRF6150作为主处理器,负责运行蓝牙协议栈、控制音频流、管理电源以及处理用户按键等输入。TLV320AIC23B作为专用的音频协处理器,负责高质量的数模/模数转换。两者之间通过两条重要的串行总线连接:I2S和I2C。
I2S总线专门用于传输数字音频数据。它是一个同步串行接口,包含三个主要信号线:
- BCLK (位时钟):由主设备(BRF6150)产生,用于同步每一位数据的传输。
- LRCK (左右声道时钟/字选择):用于指示当前传输的是左声道数据还是右声道数据。频率等于音频采样率。
- SDIN/SDOUT (数据线):用于传输实际的音频数据。
在我们的设计中,BRF6150配置为I2S主设备,负责产生BCLK和LRCK,并将从蓝牙链路接收到的音频数据通过SDOUT发送给AIC23B的DAC进行播放;同时,从AIC23B的ADC采集到的麦克风数据通过SDIN接收,并打包发送给蓝牙射频。时序的精准性至关重要,任何时钟抖动都可能造成音频的爆音或失真。因此,在软件上,我们通常使用BRF6150的SSP(同步串行端口)模块来硬件实现I2S,而不是用GPIO模拟,以确保时序稳定。
I2C总线则用于配置AIC23B的各种参数。BRF6150作为I2C主设备,AIC23B作为从设备(地址可通过硬件引脚配置)。上电后,BRF6150需要首先通过I2C向AIC23B写入一系列寄存器值,来设置其工作模式、采样率、增益、电源管理等。这是一个典型的“写寄存器”操作。I2C的速率不需要很快(通常用100kHz标准模式即可),但通信必须可靠。需要在PCB上为I2C信号线(SCL和SDA)配置上拉电阻(通常为4.7kΩ),并注意走线长度,避免信号完整性出现问题。
3. 嵌入式软件架构与VxWorks系统移植
3.1 为何选择VxWorks作为实时操作系统?
在2000年代初期,嵌入式实时操作系统的选择并不多。VxWorks以其卓越的实时性、可靠的微内核和丰富的中间件支持,在通信、工业控制等领域占据了主导地位。对于蓝牙耳机这种对响应时间有严格要求的设备,实时性至关重要。例如,在建立语音链路时,从按下接听键到音频通路建立,必须在数百毫秒内完成,任何任务调度延迟都可能导致呼叫失败。VxWorks的Wind内核采用优先级驱动的抢占式调度,能够保证高优先级任务(如音频数据处理、射频中断响应)立即得到执行。
此外,VxWorks的高度可裁剪性非常适合资源受限的嵌入式设备。BRF6150内部的ARM7内核,其SRAM和可外扩的Flash资源都有限。我们可以通过Tornado或Workbench开发环境,将不需要的组件(如文件系统、部分网络协议)从内核中移除,只保留任务管理、内存管理、中断处理和必要的通信机制(如消息队列、信号量),从而生成一个极其精简的系统镜像,满足存储空间和运行内存的限制。Wind River公司提供的BSP(板级支持包)框架,也使得针对BRF6150这块新板卡的移植工作有章可循。
3.2 BSP移植与硬件抽象层驱动开发
移植VxWorks到BRF6150平台,核心工作是创建或修改BSP。BSP是连接操作系统内核与具体硬件板的桥梁。我们的工作主要围绕以下几个文件展开:
- config.h:这是系统配置的“总开关”。我们需要在这里定义CPU类型(ARM7TDMI)、时钟频率、内存映射(BRF6150内部SRAM的起始地址和大小、外部Flash的地址)。最关键的是设置
LOCAL_MEM_LOCAL_ADRS和LOCAL_MEM_SIZE,告诉内核可用的RAM在哪里。还需要定义包含哪些组件,例如INCLUDE_I2C、INCLUDE_SSP(用于I2S)等。 - makefile:用于指导编译系统。需要指定正确的编译器(如
gnu或diab)、编译选项,并列出需要编译的源文件列表,特别是我们新增的驱动文件。 - bspname.h:定义板卡特有的常量,如各功能模块的基地址。对于BRF6150,我们需要查阅数据手册,找到GPIO控制器、SSP控制器、I2C控制器等外设在内存空间中的寄存器基地址,并在这里定义成宏,方便驱动代码访问。
驱动开发是另一块硬骨头。我们需要为几个关键外设编写驱动:
- GPIO驱动:用于控制LED指示灯、检测按键状态。需要实现初始化、设置输入/输出方向、读写引脚电平的函数。
- I2C驱动:用于配置AIC23B。VxWorks通常有标准的I2C驱动框架,我们需要实现
i2cLib中的底层传输函数,使其能够操作BRF6150的I2C控制器寄存器。 - SSP驱动(用于I2S):这是音频数据流的生命线。我们需要配置SSP控制器工作在I2S模式,设置时钟分频以得到正确的采样率(如44.1kHz的BCLK和LRCK),并实现DMA或中断方式的数据收发。数据流的稳定和低延迟直接取决于这里的实现质量。
实操心得:在调试BSP和驱动时,最有效的工具是串口打印和示波器。我们在初始化代码的各个关键阶段加入
printf语句,通过串口输出到PC,可以清晰地看到启动流程卡在了哪里。用示波器测量I2C和I2S的波形,可以直观地判断时序是否正确、数据有无异常。例如,I2S的LRCK频率是否精确等于44.1kHz,数据是否在BCLK的上升沿或下降沿保持稳定。
3.3 协议栈任务划分与消息队列通信
蓝牙协议栈是一个典型的分层、多任务的复杂软件系统。在VxWorks上,我们为每一层(或几个相关的层)创建一个独立的任务(Task)。例如:
- LMP任务:负责链路管理,如寻呼、鉴权、加密。
- L2CAP任务:负责逻辑链路控制,数据包的分割与重组。
- SDP任务:负责服务发现。
- RFCOMM任务:实现串口仿真,传输AT命令和音频控制信号。
- HCI任务:处理与BRF6150内部蓝牙硬件模块的通信(通过内置的HCI接口)。
- 应用层任务:例如耳机应用(Headset Application),处理用户事件(按键)、控制音频通路、管理连接状态。
这些任务之间需要频繁地交换数据和事件。VxWorks提供了多种进程间通信(IPC)机制,我们选择了消息队列(Message Queue)作为主要的通信方式。消息队列是异步的,发送方不必等待接收方,这符合协议栈各层解耦、高效处理的需求。我们定义了一个全局的消息队列ID结构体,就像项目中给出的MSG_QUEUE_ID,里面包含了每两个相邻层之间通信队列的ID。
例如,当RFCOMM层收到来自手机(AG)的AT命令(如AT+CKPD,模拟按键)时,RFCOMM任务会解析这个命令,然后封装成一个消息,投递到RfToHA这个消息队列中。耳机应用(HA)任务一直在等待这个消息队列,一旦收到消息,便知道有来电接听请求,于是它开始执行一系列操作:控制GPIO点亮接听指示灯、通过I2C命令打开AIC23B的音频通路、最后触发HCI建立SCO语音链路。整个流程通过消息队列串联起来,清晰且高效。
4. 蓝牙协议栈关键层详解与实现
4.1 基带(BaseBand)与链路管理协议(LMP):连接的基石
蓝牙设备间的物理连接是由基带层建立的。BRF6150的硬件已经实现了基带的大部分功能,包括跳频序列生成、数据包组装/拆分、CRC校验、加密等。我们的软件主要通过HCI命令与基带硬件交互。LMP则运行在ARM处理器上,它利用基带提供的物理连接,来管理逻辑层面的链路状态。
LMP的工作流程可以概括为“握手”和“维护”。当我们的耳机(HS)被手机(AG)搜索时,AG会发起“查询”(Inquiry)过程,HS在查询扫描状态下会回应自己的地址和设备类别。随后,AG发起“寻呼”(Page)过程,试图与HS的地址同步。一旦同步成功,ACL(异步无连接)链路就建立了。这时,LMP开始工作,双方交换LMP协议数据单元(PDU),进行一系列协商:
- 鉴权(Authentication):交换密钥,确认对方身份。常用的是PIN码配对方式。
- 加密(Encryption):协商加密模式和密钥,为后续数据传输提供安全保障。
- 角色切换(Role Switch):决定谁是主设备(Master),谁是从设备(Slave)。通常AG是Master。
- 功耗模式协商:协商呼吸(Sniff)、保持(Hold)、停泊(Park)等模式参数,以节省电量。
在我们的代码中,vLmpDealFromBB()函数就是处理来自基带硬件(通过邮箱中断)的LMP消息。它需要解析消息中的操作码(OpCode),然后调用相应的处理函数。例如,收到一个LMP_authentication_req,就需要启动鉴权流程;收到LMP_encryption_mode_req,就需要协商加密参数。这部分代码逻辑性强,但非常繁琐,需要严格遵循蓝牙核心规范。
4.2 逻辑链路控制与适配协议(L2CAP):数据的交通警察
L2CAP层可以看作是蓝牙协议栈中的“数据路由器”。它向上层(如RFCOMM、SDP)提供面向连接或无连接的数据服务,并负责将上层的大数据包分割成适合基带传输的小包(反之亦然),这个过程称为分段与重组(SAR)。
在我们的设计中,L2CAP层创建了两个重要的信道:
- 信令信道(CID 0x0001):这是一个固定信道,用于传输L2CAP自身的控制信令,例如建立或配置其他逻辑信道。它是在ACL链路建立后自动存在的。
- 动态分配的数据信道:例如,为RFCOMM分配CID 0x0040,为SDP分配CID 0x0041(项目中原描述有误,SDP通常也使用一个动态信道)。这些信道是在需要时动态建立和释放的。
tL2capDealMsgFromSdp()和tL2capDealMsgFromRf()这两个任务函数,就是L2CAP层的数据入口。它们收到来自上层的数据后,会加上L2CAP头(包含长度和信道ID),然后调用vL2capDealMsgFromBB()(或在中断上下文中)将数据包传递给基带层发送。反过来,当从基带层收到数据包时,vL2capDealMsgFromBB()会根据CID将数据包分发给对应的上层任务。L2CAP还负责流量控制和错误重传(通过增强型重传模式或流模式),确保数据的可靠传输。
4.3 服务发现协议(SDP)与串口仿真协议(RFCOMM)
SDP是蓝牙设备“自我介绍”的协议。我们的耳机上运行着一个SDP服务器。当手机(AG)搜索附近的蓝牙服务时,它会发送SDP查询请求。我们的tSdpDealMsgFromL2cap()函数会处理这个请求,从本地的服务记录数据库中查找匹配的服务。对于耳机来说,最重要的服务记录就是“蓝牙耳机服务”(Headset Audio Gateway, HS-AG)。这个记录里包含了服务句柄、协议描述符列表(指明该服务使用RFCOMM信道号)、服务名称等信息。找到后,SDP任务会将这些信息封装成响应包,通过L2CAP发回给AG。AG收到后,就知道这个设备是耳机,并且知道通过哪个RFCOMM信道(比如Channel 1)可以和它通信。
RFCOMM在蓝牙上模拟了一个RS-232串口。几乎所有传统的串口应用(如AT命令集)都可以不经修改地运行在RFCOMM之上。在耳机应用中,RFCOMM主要用来传输AT命令。例如,手机来电时,它会通过RFCOMM信道发送一个RING的AT命令。我们的tRfDealMsgFromL2cap()函数会解析这个命令,然后生成一个RfToHA消息通知应用层“有来电”。同样,当用户按下耳机上的接听键时,应用层会通过HAToRf消息通知RFCOMM任务,RFCOMM任务则通过RFCOMM信道向手机发送AT+CKPD命令,模拟按下接听键。
RFCOMM层本身也负责建立和管理数据链路连接(DLCI)。在逻辑信道建立后,首先建立的是控制信道(DLCI 0),用于传递建立、拆除数据链路的命令。然后才建立用于传输用户数据(AT命令)的数据信道(DLCI 1)。项目描述中提到的SABM帧、UA帧,就是RFCOMM层用于建立链路的链路建立命令。
5. 音频数据流与I2S接口的深度实现
5.1 I2S时序配置与音频数据缓冲区管理
要让TLV320AIC23B发出声音,正确配置I2S时序是第一步。BRF6150的SSP控制器需要被设置为I2S Philips标准模式、主机模式、数据长度16位(或根据AIC23B配置调整)。时钟的计算是关键。假设我们需要44.1kHz的音频采样率(LRCLK频率),I2S模式下每个数据帧包含左右两个声道,每个声道16位数据,所以位时钟BCLK的频率 = 采样率 × 位数 × 声道数 = 44.1kHz × 16 × 2 = 1.4112 MHz。我们需要根据BRF6150的系统主频,通过SSP的时钟分频器来精确产生这个BCLK。
在软件上,我们通常开辟两个乒乓缓冲区(Ping-Pong Buffer)用于音频数据流。每个缓冲区的大小足以存放几十毫秒的音频数据(例如,44.1kHz × 2字节/采样 × 2声道 × 0.02秒 ≈ 3.5KB)。DMA控制器被配置为:当缓冲区A被DMA填满(从BRF6150内存到SSP发送寄存器)或取空(从SSP接收寄存器到内存)时,自动切换到缓冲区B,并产生一个中断。在这个中断服务程序(ISR)中,我们进行缓冲区指针的交换,并通知上层任务(如音频处理任务)去处理刚刚满的缓冲区(如编码、发送)或准备新的空缓冲区数据(如解码、播放)。
这种双缓冲区机制确保了音频流的连续性,避免了因数据处理不及时导致的卡顿或爆音。对于麦克风采集的数据流,流程是反向的:AIC23B的ADC将模拟语音转换为数字数据,通过I2S的SDIN线传给BRF6150的SSP接收端,DMA将其存入缓冲区,再由任务取出并进行蓝牙音频编码(如SBC或CVSD),最后通过协议栈发送出去。
5.2 TLV320AIC23B的精细控制与音质调优
通过I2C配置AIC23B是系统初始化的重要一环。上电后,BRF6150需要发送一系列I2C写命令来唤醒并设置AIC23B。关键的寄存器配置包括:
- 电源管理:逐步打开模拟部分(ADC, DAC, 麦克风偏置)和数字部分(数字接口)的电源,避免浪涌电流。
- 采样率设置:根据所需采样率(如44.1kHz)设置时钟分频器和过采样率。
- 音频接口格式:设置为I2S格式,数据对齐方式,字长(16/20/24位)。
- 输入路径选择与增益:选择使用LINE IN还是麦克风输入,并设置麦克风前置放大器(PGA)的增益。增益设置需要小心,太小则录音音量低、信噪比差;太大则容易导致输入过载、产生削波失真。通常需要通过实际测试来调整到一个最佳值。
- 输出路径与音量:启用DAC输出到耳机放大器,并设置初始音量。音量控制建议采用对数曲线,使人耳感知到的音量变化更线性。
音质调优是一个经验性很强的工作。除了正确的配置,硬件布局和供电质量影响巨大。我们曾遇到一个典型的“底噪”问题:在无声时,耳机里有轻微的“嘶嘶”声。排查后发现是给AIC23B模拟部分供电的LDO输出纹波过大。解决方案是在LDO的输出端增加了一个π型滤波电路(电容-电感-电容),并确保模拟地(AGND)和数字地(DGND)在芯片下方通过一个磁珠或0欧电阻单点连接,有效隔离了数字噪声。另一个常见问题是“噗噗”声,即在音频通路打开或关闭的瞬间产生的冲击噪声。这可以通过软件实现“软静音”来解决:在打开通路前先将音量设置为最小(静音),通路稳定后再缓慢提升音量;关闭通路时则相反。
6. 语音连接建立全流程与实战调试
6.1 从搜索到通话:一次完整的握手
结合协议栈各层的工作,我们可以梳理出手机(AG)与耳机(HS)建立语音连接的全链路过程。这个过程是分层自下而上建立的:
- 物理连接(基带/LMP层):AG广播查询,HS响应。AG发起寻呼,与HS同步跳频序列和时钟,建立ACL链路。随后LMP进行鉴权、加密协商。
- 逻辑连接(L2CAP层):在ACL链路上,AG发起建立第一个L2CAP信道(CID=0x0040),用于SDP查询。
- 服务发现(SDP层):AG通过CID 0x0040信道发送SDP查询请求。HS的SDP服务器回复,告知自己支持“蓝牙耳机服务”及对应的RFCOMM信道号(假设为Channel 1)。
- 串口仿真连接(RFCOMM层):AG断开CID 0x0040信道,新建一个CID 0x0041的信道。在此信道上,AG发送SABM帧请求建立RFCOMM控制信道(DLCI 0),成功后协商并建立数据信道(DLCI 1,对应Channel 1)。
- 应用层交互:AG通过RFCOMM数据信道(DLCI 1)发送AT命令,如
RING振铃。HS的应用层收到后,点亮指示灯并响铃。用户按接听键后,HS通过同一信道发送AT+CKPD命令。 - 语音链路建立(HCI/SCO层):AG收到接听命令后,通过HCI命令
Write_Voice_Setting设置语音编码参数(如CVSD),然后发送Setup_Synchronous_Connection命令请求建立SCO链路。HS同意后,SCO链路建立。此时,音频数据流不再经过L2CAP/RFCOMM,而是通过基带的SCO逻辑通道直接传输。
6.2 实战调试中的常见问题与排查技巧
在实际开发中,几乎每一步都可能遇到问题。下面是一个常见问题排查速查表:
| 问题现象 | 可能原因 | 排查思路与工具 |
|---|---|---|
| 手机搜索不到耳机 | 1. 耳机未进入可发现模式。 2. 射频电路故障,天线匹配不佳。 3. 蓝牙协议栈未正常启动。 | 1. 确认按键长按进入了配对模式(LED快闪)。 2. 用频谱仪或近场探头检查天线端是否有2.4GHz信号辐射。 3. 通过串口打印,检查VxWorks及协议栈初始化流程是否完成。 |
| 配对频繁失败 | 1. PIN码不匹配。 2. 鉴权过程中数据包丢失。 3. LMP层状态机异常。 | 1. 确认双方输入的PIN码一致(如0000)。 2. 使用蓝牙协议分析仪(如Frontline, Ellisys)抓取空中包,查看LMP交互过程在哪一步出错。 3. 检查BRF6150的射频接收灵敏度,信号太弱也会导致丢包。 |
| 配对成功但无法连接音频 | 1. SDP服务记录配置错误。 2. RFCOMM信道建立失败。 3. 耳机应用(HA)任务未响应AT命令。 | 1. 用手机上的蓝牙调试APP或电脑的蓝牙工具查看耳机的SDP记录是否完整。 2. 协议分析仪查看RFCOMM的SABM/UA帧交换是否成功。 3. 在 tHADealMsgFromRf()函数中加打印,看是否收到AT+CKPD等命令。 |
| 连接后无声或单边有声 | 1. I2S时序配置错误。 2. AIC23B未正确初始化或音频通路未打开。 3. SCO链路参数(如编码格式)不匹配。 4. 硬件连接问题(耳机插座、音频走线)。 | 1. 用示波器测量I2S的BCLK, LRCLK, SDATA波形,检查频率、相位和数据是否正常。 2. 通过I2C读取AIC23B的寄存器,确认配置已写入且电源已打开。 3. 检查HCI的 Write_Voice_Setting命令参数,确保AG和HS使用相同的语音编码(如都使用CVSD)。4. 用万用表检查音频通路是否连通。 |
| 音频有严重杂音或断续 | 1. 电源噪声大。 2. I2S时钟抖动(Jitter)大。 3. 音频缓冲区大小不合适,导致上溢或下溢。 4. 蓝牙射频受到干扰(如Wi-Fi)。 | 1. 用示波器检查AIC23B的模拟电源引脚,看纹波是否在mV级别以下。 2. 测量BCLK的时钟质量,检查时钟源是否稳定。 3. 调整音频DMA缓冲区大小,并监控缓冲区空满状态。 4. 更换环境测试,或调整蓝牙跳频适配机制。 |
| 耳机耗电极快 | 1. 未进入低功耗模式。 2. 射频发射功率设置过高。 3. 软件中有忙等待(Busy Loop)。 | 1. 确认在无连接时,协议栈是否进入了Sniff或Park模式,CPU是否进入空闲(Idle)状态。 2. 通过HCI命令调整发射功率到能满足连接的最低水平。 3. 使用VxWorks的系统监视工具查看各任务CPU占用率,优化代码。 |
调试心法:分层隔离,逐层验证。先确保硬件供电、时钟、复位正常;然后让CPU跑起来,点亮LED,打印串口信息;接着逐个验证外设驱动(I2C配置AIC23B成功,I2S能输出测试音);再让蓝牙协议栈跑起来,能完成搜索和配对;最后再调试复杂的音频流和通话控制。善用工具,协议分析仪和示波器是射频和音频调试的“眼睛”,而printf日志则是软件逻辑调试的“地图”。