第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 经典蓝牙配对与数据传输调试

经典蓝牙的配对流程,说白了就是两个设备互相确认身份,然后建立加密连接。标准流程分三步:

  1. Inquiry(查询):主设备发查询请求,从设备回复自己的地址和设备名。
  2. Paging(寻呼):主设备根据查询到的地址,发起连接请求。
  3. 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 通信通了,配对和数据传输就是水到渠成的事。