接到AIR Module这个项目的时候,我心里想的是:无非就是拿一个BLE模块,配个气压计,把数据通过串口或者GATT传出去。等到把模块焊上转接板,打开WICED Smart的SDK,才发现Broadcom这套东西跟我想象的差距挺大——它不是给你一个“传感器加蓝牙”的拼装Demo,而是在一颗芯片里塞进了一整套嵌入式无线方案。这篇把整个项目从头梳理一遍,从AIR Module的定位、Broadcom WICED Smart平台的能力,到实际开发中踩过的各种硬件接线、低功耗、驱动识别、量产认证的坑,希望能给正在做BLE产品选型,或者刚接触WICED平台的人一点参考。
1. AIR Module不是普通蓝牙透传模块:WICED Smart方案到底装了什么
1.1 从引脚定义理解AIR Module的硬件基础
AIR Module在我手里是一块大约15mm x 20mm的贴片模块,正面是一颗主控,背面是天线区域和少量外围。它不是那种典型的串口透传模块:除了UART,还引出了I2C、SPI、ADC、若干GPIO,以及一组独立的电源管理引脚。为什么一个“蓝牙模块”要留这么多接口?因为Broadcom WICED Smart的定位就是把嵌入式无线做成单芯片方案:主控、BLE射频、协议栈、外设控制器都集成在同一颗SoC上,模块只是把这些接口按产品需求引出来。
拿BCM20737S这种代表型号来说,内部有一颗ARM Cortex-M3内核,集成BLE射频和完整的协议栈,还带一个传感器Hub,可以直接挂气压计、加速度计这类I2C传感器。对AIR Module这种需要读气压、算海拔、定期上报的设备,这意味着整个产品可以不需要外部MCU——传感器挂在模块的I2C上,业务逻辑在模块内部跑,手机通过GATT来读数据。这个架构决定了后续所有开发方式,也决定了它和普通透传模块完全不是一回事。
1.2 WICED Smart平台不只是蓝牙协议栈
很多第一次接触WICED的人误以为SDK就是“把BLE协议栈封装好,给你几个API调用”。实际上,WICED这个词是Wireless Connectivity for Embedded Devices的缩写,它的核心思路是面向嵌入式整机开发,而不只是无线连接。
在SDK里你会看到几类东西:
- 硬件驱动层:GPIO、UART、SPI、I2C、ADC、PWM、看门狗、Flash等基础驱动都有现成实现,不用从寄存器开始抠。
- OS抽象层:任务、队列、软定时器、信号量,内置了一个轻量级运行时,裸机开发者也能比较快上手。
- BLE协议栈层:GAP、GATT、SM、L2CAP这些底层协议栈已经整合好,你要做的是配置回调函数。
- Profile与示例应用:Beacon、HID、Find Me、Health Thermometer等示例工程可以直接拿来改。
换句话说,你用WICED的时候,主要工作是“配置加业务逻辑”,而不是“从零移植协议栈”。AIR Module的固件里,气压计驱动、广播服务、GATT服务都跑在这套框架之上。这种集成度对产品开发很友好,但副作用是,一旦你想做协议栈层面深度定制,会被封装结构限制住。所以选型前要想清楚,你是要做产品,还是要做协议栈本身。
1.3 AIR Module到底要解决什么问题
这个项目的目标比较具体:做一个自带气压和温度感知能力的BLE节点,可以实时把大气压、相对高度、温度数据广播出去,也可以被手机连接后主动读取。应用场景大致覆盖这么几类:
- 环境监测节点,丢在仓库或者机房,手机或者网关定时来取数据。
- 室内定位辅助,通过气压换算楼层高度,帮助定位系统区分不同楼层。
- 便携气象站,配合温湿度传感器,上报给手机App。
- 无人机或者手持设备的辅助高度计,作为GPS高度补盲。
AIR Module这个名字里的“AIR”跟空气有关,但它的核心卖点不是传感器本身,而是“传感器数据加低功耗蓝牙上报”这个完整闭环。这也是为什么选型时我们最终没有走“MCU加蓝牙芯片”的老路,而是选择了Broadcom WICED Smart这套更集成的方案。
2. 选型那会儿:Broadcom WICED和Nordic、TI的方案放在一张桌子上比较
2.1 三个方案的核心差异
项目选型时,我们在Broadcom WICED、Nordic nRF52、TI CC26xx三家里转了一圈。这里说的WICED,具体指Broadcom收购后以BCM207xx系列为基础的Smart Bluetooth方案,也就是现在大家常说的BLE低功耗蓝牙方案之一。
| 方案 | 代表芯片 | 内核 | 协议栈形态 | 上手难度 | 社区与资料 |
|---|---|---|---|---|---|
| Broadcom WICED | BCM20737S等 | Cortex-M3 | 闭源SDK加完整协议栈 | 中等 | 官方文档为主,中文资料少 |
| Nordic | nRF52832/52840 | Cortex-M4 | SoftDevice/SDK开源 | 较低 | 社区活跃,例程极多 |
| TI | CC2640/CC2642 | Cortex-M3/M4 | 协议栈集成在SDK内 | 中等偏高 | 官方资料全,工具链偏重 |
这个表只是方向性的,不要当成绝对结论。真正决定选择的,是你产品的形态和团队的技术栈。每个平台都有自己的“脾气”:Nordic的例程多到你翻不完,但如果你一上来就照着nRF52840的板子设计,模块体积和功耗和你预期的不一定一致;TI的工程资料严谨,但学习曲线陡峭,工程师会花不少时间在IDE和编译器上。
2.2 为什么AIR Module押在WICED Smart上
我们的选择逻辑有这么几条:
- 模块自包含:AIR Module要做成一个单芯片节点,传感器直接挂在SoC上,不希望产品里再塞一颗MCU。WICED的传感器Hub对这种“内置传感器加逻辑加BLE”的一体化设计支持很好。
- 协议栈工作完整:WICED里的BLE协议栈经过大量产品验证,很多模块厂已经在上面跑量产设备,不用我们重新做大量蓝牙兼容性测试。
- 供货和集成:WICED模块方案有多个成熟渠道,模块尺寸小,适合外壳设计。
- 不足之处也很明显:WICED的开源社区氛围没有Nordic那么浓,遇到问题很多时候要啃官方文档和示例代码。我们团队有嵌入式Linux背景,对“在框架里填业务代码”这种方式比较适应,所以这个缺点对我们影响不大。
给还在纠结的人一个参考:如果你准备做的是原型的快速验证,或者产品形态是“一颗BLE芯片加外部MCU”,优先考虑Nordic,因为它例程多、出问题很容易搜到答案。但如果你要做模块级、自包含的传感器节点,并且高度依赖“协议栈加驱动加业务”一体化,那WICED这类方案能省很多事。
2.3 选型时别只看数据手册上的功耗数字
选型阶段最容易犯的错,是拿三个芯片数据手册上的功耗表格横向比较,然后得出“A比B低0.5mA所以选A”的结论。实际上,数据手册给出的数字都是在理想条件下测出来的,和你的天线设计、供电电路、固件写法、外壳材质都有关系。
举个实际例子,同样一颗BCM20737S,在开发板上的实测功耗和在我们自己画的AIR Module最小系统板上实测功耗差了接近30%。原因就是开发板上多了LDO、LED、电阻网络这些额外负载。所以选型阶段别纠结那零点几毫安的差异,把精力花在验证“这个平台的协议栈能不能满足你的业务需求”上,更值得。
3. 跑通第一个Demo的完整链路:SDK安装、工程骨架与广播代码实操
3.1 环境准备:第一个坑是版本匹配
WICED SDK通常以压缩包形式分发,初次安装时很多人会卡在编译环境的配置上。最典型的问题是:模块厂家的SDK补丁和Broadcom原版SDK版本不匹配,导致编译到一半报找不到某个头文件,或者出现API冲突。这个坑几乎每个接触WICED的人都会遇到,我一开始也以为是自己工具链装错了,排查了半天才发现是补丁版本太老,跟新版SDK不兼容。
我们项目的做法是:
- 先装Broadcom官方WICED SDK原包,记录版本号。
- 再装模块厂家针对AIR Module的补丁包或平台配置文件。
- 编译工具链用SDK自带的GCC或厂家指定的版本,不要手痒升级到最新版。
- 工程路径不要带中文和空格,这一点在不同Linux/Windows环境上踩过多次。
另外,SDK解压后最好保持目录结构不变,有些脚本会按相对路径查找库文件,手动移动目录会导致一堆莫名其妙的编译问题。
3.2 工程结构拆解:第一次打开别懵
SDK解压后的目录通常会包含apps、libraries、platform等。apps里是各类示例工程,你可以在里面找到beacon、health_thermometer、sensor等;platform下是你的模块平台定义;libraries里是协议栈和驱动库。
AIR Module的工程创建一般是从一个现成的传感器例程复制一份出来,然后改平台配置。需要检查三处:
- 引脚配置:I2C接的是哪两个引脚,气压计中断脚接哪个GPIO。
- 时钟配置:内部时钟还是外部晶振,外部晶振的频率是26MHz还是别的值。
- 串口与日志:调试log默认走UART,是哪一组TX/RX。
很多人第一次打开工程就急着写业务代码,结果连log都看不到。我建议第一件事是把开发板和模块的连接方式核对一遍,确认log输出正常,再动代码。这个过程看起来枯燥,但能帮你把“板子有没有跑起来”这个基础问题先解决掉,后面排查问题会轻松很多。
3.3 发出第一条广播:代码实现与验证
工程模板跑起来之后,核心改动基本围绕两个地方:一个协议栈管理回调,一个广播或连接参数。代码里会有类似这样的结构:
wiced_result_t bt_management_callback(wiced_bt_management_evt_t event, wiced_bt_management_evt_data_t *p_event_data) { switch (event) { case BTM_ENABLED_EVT: /* 协议栈启动完成,开始广播 */ wiced_bt_start_advertisements(BTM_BLE_ADVERT_UNDIRECTED_HIGH, 0, NULL); break; default: break; } return WICED_SUCCESS; }配好之后用nRF Connect或者LightBlue扫描,如果能看到广播名,比如“AIR_Demo”,说明协议栈已经跑通。这一步的关键不在于代码本身,而在于理解:WICED的协议栈是事件驱动型,器件启动后先进入管理回调,拿到BTM_ENABLED_EVT才代表BLE协议栈Ready,此时才能启动广播。
很多人不知道为什么广播要在callback里做,随手写在main函数开头,结果协议栈还没起来就调用,广播一直发不出去,最后怀疑是硬件问题。其实顺序错了。
3.4 log输出与板上调试的技巧
WICED工程里打开log很简单,但要注意log的波特率默认不一定是你常用的115200,有些例程默认是921600,需要用串口工具对应调整。还有一个比较隐蔽的坑:log输出本身会占用UART引脚,如果你正好把UART引脚复用成别的功能,log会乱码或者完全没输出。
调试阶段我习惯把协议栈事件都打印出来,尤其是GATT连接、断开、MTU更新这些事件。这样手机端一连接,串口就能看到事件流,比在手机上猜状态方便得多。AIR Module的压力值和高度值也在这个阶段验证,先串口打印,确认传感器数据链路正确,再考虑走BLE通道。
4. 摸清低功耗底牌:从实测数据到广播/连接参数的取舍
4.1 功耗实测:不能只信数据手册
WICED平台的低功耗能力不差,但具体能低到什么程度,取决于你的工程配置。我们用功耗分析仪测过AIR Module的三种典型状态。
| 状态 | 实测电流 | 说明 |
|---|---|---|
| 深度睡眠 | 约2μA左右 | 外设都关闭,传感器不供电 |
| 1秒广播间隔 | 平均约15-20μA | 一次广播事件电量约20μA·s级别 |
| 连接态上报 | 平均约40-80μA | 取决于连接间隔和发送数据量 |
实测时一定要在模块电源输入端测,而不是开发板的USB端,因为开发板上的LDO、指示灯会吃掉很多电流,测出来偏大。我当时第一次测,在开发板USB端测出一个“200μA”的睡眠电流,吓一跳,后来直接在模块的VCC引脚处飞线测量,才回到正常值。
4.2 广播间隔与连接参数怎么调
对AIR Module这类周期性上报的传感器节点,最关键的参数是广播间隔、连接间隔和从机延迟。
- 广播间隔:决定手机或网关多久能发现你。间隔越短,发现越快,但功耗越高。AIR Module如果只是周期性广播,100ms到500ms都可以,需要功耗优先就把间隔调大。
- 连接间隔:建立连接后,两端每隔这个时间交换一次数据。AIR Module上报一次气压约20字节,连接间隔设到30ms以上足够。
- 从机延迟:允许从机跳过若干次连接事件,是BLE低功耗里非常实用的参数。比如连接间隔30ms、从机延迟等于9,意味着主机每次连接事件,从机最多可以每隔10个事件才醒来一次,功耗立刻降下来。
可以给出一个简化的估算方法:平均电流约等于单次事件消耗电量乘以每秒事件数,再加休眠电流。拿一次广播事件约20μA·s来说,1秒广播间隔的额外平均电流就是20μA,加上休眠的2μA,大约22μA左右。如果换成200ms广播,平均额外电流就变成约100μA。这个估算不精确,但足够帮助早期选参数。
4.3 天线和射频对功耗与稳定性的隐形影响
这类模块对天线附近的环境极其敏感。我们在原型阶段遇到过一个问题:板子在桌面上广播距离二三十米,装进金属喷漆外壳之后,距离直接缩到三四米,而且连接不稳定。
排查了很久,最后发现是外壳内壁的金属喷漆严重吸收了天线辐射,把天线区域周边净空留出来之后,距离才恢复正常。这个现象在做量产结构件时很常见,如果你在设计结构,一定要给天线区域留出足够的净空区,不要在模块天线附近走地线或者放金属支架。
低功耗的另一个隐形杀手是电源纹波。如果模块供电端纹波过大,射频前端会频繁重试,导致发射功耗大幅上升。在AIR Module原型板上,我发现广播状态的平均电流比理论值高了约30%,后来在电源输入端加了一个LC滤波,电流立刻降下来。这类问题用示波器一看就能明白,但如果不测,可能整个开发周期都在跟“神秘的高功耗”较劲。
5. 最折磨人的排障经历:PC端网络适配器里消失的Broadcom设备
5.1 现象:设备管理器里没有Broadcom
AIR Module做到PC配套调试工具时,我们遇到一个很奇怪的坑。模块通过USB转接板插到Windows电脑,设备管理器里的网络适配器分类下找不到任何Broadcom选项,蓝牙分类里也没有正常设备,只有一个未知USB设备或者干脆什么都没出现。当时同事第一反应是模块坏了,换了一块还是同样现象。
这个问题的关键词就是“网络适配器里没有broadcom网络适配器选项”。在Windows系统里,Broadcom蓝牙适配器除了以蓝牙设备形式存在,还会在网络适配器里枚举出蓝牙相关网络接口,比如Bluetooth Device (PAN)。如果驱动加载失败、设备被系统隐藏,或者相关服务没启动,网络适配器里就看不到Broadcom条目。
5.2 完整排查链路,按顺序走
不要一上来就重装系统,按下面这个顺序排查:
- 先看USB枚举。设备管理器里展开“通用串行总线控制器”,看有没有未知USB设备或带感叹号的Broadcom设备。如果这里都看不到,问题多半在USB线、供电、接触不良,或者USB转接板本身。
- 展开“蓝牙”分类,看有没有带黄色感叹号的设备。很多驱动安装一半失败时,设备会停留在这里。
- 在设备管理器菜单栏点“查看-显示隐藏的设备”,把灰色条目全部展开。有些残留驱动会在设备卸载后仍以隐藏状态存在,干扰新驱动枚举。
- 右键删掉所有带感叹号的Broadcom或USB相关设备,勾选“删除此设备的驱动程序软件”,然后重新扫描硬件改动。
- 安装官方原厂驱动。优先去芯片原厂官网下载对应型号的驱动,不要直接用Windows自动更新给的通用驱动。
- 检查Windows服务。运行services.msc,确认Bluetooth Support Service(蓝牙支持服务)处于启动状态。这个服务被禁用或者停止,蓝牙功能看起来就是“设备没装好”。
- 最后才考虑系统级清理工具或重装,实测中前六步基本能解决九成问题。
5.3 这个坑给BLE开发者的启示
这个问题的根子其实不在模块本身,而在PC端蓝牙驱动和系统服务的配合。但它给我们的教训是:如果AIR Module要面向PC做配套工具,驱动的交付测试不能省。后来我们写了一个自检脚本,自动检测USB设备、蓝牙设备、网络适配器里的Broadcom枚举状态、相关服务状态,一次性输出排查结果,内部调试效率提高了很多。
也提醒一句:遇到这种问题,先确认是设备层面还是驱动层面,不要急着怀疑硬件。很多工程师一看到“没有Broadcom选项”就以为是模块坏了,实际上USB枚举正常、蓝牙分类有感叹号,多半是驱动问题。
6. 从模块到产品:天线净空、认证准备和固件升级的注意事项
6.1 硬件集成最容易翻车的三件事
模块开发完成后,真正集成到产品里还会遇到几类问题。第一是天线的净空区,第二是模块底部的铺地,第三是电源纹波。
天线净空区前面提过了。模块底部铺地的问题容易被忽略:有些PCB设计为了散热,在模块背面大面积铺铜,结果改变了天线附近的地平面,影响驻波比。电源纹波的典型表现是传感器读取时数据跳动,用示波器看模块供电端发现毛刺,加一个LC滤波或合适的电容就稳定了。
如果你的集成环境和我类似,建议在画板前就把模块厂家提供的参考设计拿过来对照,尤其是天线区域、晶振和电源引脚这一块,不要自己发挥。这块出问题最难排查,因为它不会直接报错,而是表现为“距离变短”“数据偶尔跳”“连接时好时坏”。
6.2 认证准备:尽量沿用模块原设计
模块级产品通常会先做蓝牙认证,集成到整机时如果还沿用同样的天线和输出功率配置,可以省去重新进行无线认证的大量工作。所以在AIR Module的设计里,天线部分我们基本不动,要改也只改外壳和结构件。如果天线发生变化,射频性能、谐波、杂散都需要重新测试,这笔额外投入很可能比重新选型还大。
另一个实际建议是不要为了“信号更好”去动模块固件里的发射功率。把输出功率调高不只会带来功耗和发热问题,还会让谐波超标,给认证增加不必要的麻烦。很多模块标明的工作参数已经是性能