第4章:蓝牙模块集成与经典调试
4.1 蓝牙协议栈概览:BR/EDR/LE 三兄弟
做蓝牙开发,首先得搞清楚协议栈长什么样。说白了,蓝牙协议栈就是一套软件分层体系,从底层的射频到顶层的应用,一层层封装好,让你不用去折腾那些复杂的无线细节。
蓝牙协议栈主要分三大类:BR(Basic Rate)、EDR(Enhanced Data Rate)和LE(Low Energy)。BR/EDR 就是我们常说的「经典蓝牙」,适合传音频、传文件这种需要持续连接的场景。LE 则是低功耗蓝牙,适合传感器、手环这类电池供电的设备。
我个人习惯把协议栈分成三层来看:
- Controller 层:负责射频收发、基带处理、链路控制。说白了就是硬件干活的部分。
- Host 层:负责逻辑链路控制、安全管理、属性协议等。这是软件协议栈的核心。
- Application 层:你写的业务代码,比如配对逻辑、数据传输处理。
嗯,这里要注意:Host 和 Controller 之间通过 HCI(Host Controller Interface) 通信。这个接口非常关键,调试蓝牙模块时,大部分问题都出在这里。
核心要点:BR/EDR 适合高带宽、持续连接;LE 适合低功耗、间歇通信。选型时别搞混了。
4.2 HCI 接口与 UART 配置
HCI 接口是 Host 和 Controller 之间的桥梁。常见的物理层实现有 USB、SDIO、UART。在嵌入式系统里,UART 是最常用的,因为简单、引脚少、调试方便。
我在项目中遇到过好几次,蓝牙模块死活连不上,最后发现是 UART 波特率没配对。你想想看,两边一个跑 115200,一个跑 9600,能通信才怪。
UART 配置的关键参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 波特率 | 115200 / 921600 | 越高越快,但受限于晶振精度 |
| 数据位 | 8 | 标准配置 |
| 停止位 | 1 | 一般用 1 位 |
| 校验位 | 无 | HCI 协议本身有校验 |
| 流控 | 硬件流控(RTS/CTS) | 强烈建议开启,防止丢包 |
HCI 数据包格式也很简单,就四种类型:
- Command 包:Host 发给 Controller,比如「开始扫描」
- Event 包:Controller 回复 Host,比如「扫描完成」
- ACL 数据包:传输用户数据,比如文件内容
- SCO 数据包:传输音频数据,比如通话语音
调试时,我习惯用逻辑分析仪抓 UART 波形,看看 HCI 包有没有正常收发。曾经有一次,模块一直不回 Event,最后发现是 CTS 引脚没拉低,模块以为 Host 没准备好,就一直憋着不发数据。
调试技巧:用串口助手发 HCI 命令时,记得加上 HCI 包头的长度字段。很多新手漏了这个,导致模块不响应。
4.3 经典蓝牙配对与数据传输调试
经典蓝牙的配对流程,说白了就是两个设备互相确认身份,然后建立加密连接。标准流程分三步:
- Inquiry(查询):主设备发查询请求,从设备回复自己的地址和设备名。
- Paging(寻呼):主设备根据查询到的地址,发起连接请求。
- Pairing(配对):交换 PIN 码或使用 SSP(安全简单配对),生成链路密钥。
配对完成后,就可以进行数据传输了。经典蓝牙的数据传输基于 RFCOMM 协议,它模拟了串口通信,上层应用可以像读写串口一样收发数据。
我曾经调试过一个蓝牙串口模块,配对成功了,但数据就是传不过去。折腾了半天,发现是 RFCOMM 的通道号没对上。主设备用通道 1 发,从设备在通道 2 等,你说能收到吗?
调试步骤我一般这么走:
- 第一步:确认 HCI 接口正常。发一个 HCI_Reset 命令,看模块是否回复 Command Complete 事件。
- 第二步:确认蓝牙地址。用 HCI_Read_BD_ADDR 命令读取模块地址,确保不是全零或全 F。
- 第三步:发起查询。用 HCI_Inquiry 命令,看周围有没有设备响应。
- 第四步:建立连接。用 HCI_Create_Connection 命令,指定目标地址。
- 第五步:配对。根据模块支持的配对方式,输入 PIN 码或触发 SSP。
- 第六步:数据传输。通过 RFCOMM 或 SPP 协议收发数据。
避坑指南:我曾经遇到过模块配对成功后,过几秒就断开的情况。后来发现是蓝牙模块的电源纹波太大,导致射频性能不稳定。给模块单独加一颗 LDO 就解决了。
数据传输调试时,我建议先用简单的数据包测试,比如发一个字节看能不能收到。别一上来就传大文件,出了问题都不知道是协议栈的锅还是你代码的锅。
嗯,最后说一句:蓝牙调试最怕的就是「能配对但传不了数据」。这时候别慌,从 HCI 层开始逐层排查,大概率是 RFCOMM 通道号、MTU 大小或者流控配置的问题。
实战总结:蓝牙模块集成,七分靠硬件,三分靠调试。UART 配置对了,HCI 通信通了,配对和数据传输就是水到渠成的事。