资讯动态

AIR模块+Broadcom WICED Smart:低功耗BLE开发全攻略

发布时间:2026/8/27 3:37:41 来源:尧图企业网站定制
搞嵌入式这几年我见过不少团队为了低功耗无线方案把系统越做越复杂最后反而被功耗和稳定性拖垮。最近被拉去评估一款AIR模块主控用的是Broadcom的WICED Smart蓝牙方案折腾了几天从硬件接线到固件开发再到Windows端驱动适配踩的坑比预想的多。把整个过程捋一捋顺便聊聊那些手册上不会写、但实际开发一定会撞上的问题。AIR Module本质上是一颗把Broadcom WICED Smart蓝牙芯片、晶振、天线和匹配电路全部做好的模组对外提供UART、GPIO和电源接口。它解决的问题很直接如果BLE协议栈和射频调匹配的能力不成熟直接用芯片做产品光天线调试就能耗掉两三个月用AIR Module这类模组等于把最难的射频部分打包好应用工程师只需要关心怎么通过串口或者SDK控制它。这篇东西适合三类人看正在选型BLE模组的硬件工程师、准备用WICED SDK做低功耗产品的嵌入式开发以及被Windows下蓝牙驱动搞得头皮发麻的项目交付人员。我不讲虚的全是实际操作过程中验证过的细节。1. AIR模块与Broadcom WICED Smart为什么选这个组合1.1 AIR模块到底是做什么的AIR模块的定位是小尺寸、低功耗、快速集成。它把Broadcom的WICED Smart蓝牙控制器和完整协议栈封装在一起对外暴露的接口非常简单。大多数AIR模块支持两种使用方式一种是透传模式MCU通过UART发AT指令控制模组这种适合快速验证另一种是内置应用模式直接在模组上用WICED SDK开发自己的固件模组自己跑应用逻辑。实际项目里我建议优先考虑第二种。虽然AT指令上手很快但一旦遇到广播间隔需要动态调整、GATT服务需要按业务变化这类需求AT指令就非常局促。WICED SDK把蓝牙协议栈、板级支持包和常用外设驱动都集成在一个工程里改起来自由度大得多。AIR模块的核心竞争力在功耗。Broadcom WICED Smart系列芯片的睡眠电流能做到微安级别配合DC-DC供电一颗纽扣电池跑几个月不是问题。这对做可穿戴、传感器节点、信标这类产品来说是决定性的优势。1.2 为什么选WICED Smart而不是其他BLE方案BLE方案现在不少nRF52、CC2640这些都是常规选择但Broadcom的WICED Smart有自己的特点。首先是协议栈成熟度高WICED这个名字就是“Wireless Internet Connectivity for Embedded Devices”它早期是为了物联网场景设计后面把蓝牙、Wi-Fi都纳入进来协议栈的健壮性在大量量产设备上验证过。其次是SDK的工程结构非常适合老派MCU开发者。WICED SDK基于GNU Make的构建系统没有复杂的IDE依赖编译脚本透明出问题可以直接翻构建日志。对比某些芯片厂商的IDE式开发环境WICED这种反而在批量编译和持续集成上更省心。还有一个被很多人忽略的点Broadcom的蓝牙共存技术。如果你的产品同时用Wi-Fi和蓝牙博通芯片在射频共存上有专门的硬件机制。AIR模块虽然只是BLE但同系列的方案在处理2.4G干扰时的经验积累会让协议栈在复杂电磁环境下的表现更稳定。1.3 方案整体架构一个典型的AIR模块项目分三层底层是Broadcom WICED Smart蓝牙芯片中间是AIR模块的硬件设计上层是你的应用代码。如果使用SDK开发应用代码直接跑在模组内部的MCU上如果使用透传模式那么你的主MCU通过UART控制模组。我这次用的是SDK内置应用模式理由很简单模块自带MCU足够跑业务逻辑可以减少一颗主控芯片成本、面积、功耗都更优。AIR模块配置了足够的Flash和RAM跑一些简单的数据采集、按键处理、状态机完全够用。架构上我把传感器数据读取放在模组GPIO上把处理后的数据通过BLE GATT通知通道发给手机整个系统只有一颗芯片在工作调试起来也清爽。2. 硬件准备模块选型、引脚与供电细节2.1 拿到AIR模块后先看什么AIR模块虽然厂家不同但引脚定义大同小异。拿到模块之后第一件事不是接电而是把原理图和数据手册对照看一遍。重点看三处电源引脚VCC、VDDIO、UART引脚TX、RX、复位和启动模式引脚。有一个特别容易踩的坑模块的VDDIO电平。很多AIR模块为了低功耗VDDIO是独立供电的并不和VCC绑死。如果你用3.3V的单片机给模块的VDDIO供电而模块VCC接的是3.0V电平阈值就可能不匹配导致UART通信偶尔乱码。我的习惯是VCC和VDDIO直接短接都用3.3V只要模块手册支持这样最省事。启动模式引脚也要留意。有的AIR模块有DOWNLOAD或者BOOT引脚上电时拉高进入固件下载模式拉低正常运行。如果这个引脚悬空内部可能有下拉但也可能因为外部干扰导致上电进入错误状态。量产设计最好接一个10kΩ电阻明确电平。2.2 最小系统搭建AIR模块的最小系统相当简单电源、地、UART TTL转接板再加一个按键做复位。如果要用到GPIO控制外设需要把相应引脚引出来。这里建议把模块的所有GPIO都通过测试点或者排针引出不要只引自己当前用到的。因为BLE开发过程中调试工具有时候需要占用UART你可能会临时把某个GPIO重映射为日志输出。如果硬件上没引出来就只能飞线非常痛苦。供电方面AIR模块的峰值电流在广播时会瞬间拉高如果使用LDO要注意LDO的响应速度。建议在模块电源引脚附近放一个4.7μF和一个0.1μF的电容靠近引脚放置这在数据手册里一般有要求但实际画板时经常被忽略。2.3 下载与供电注意事项AIR模块通常支持串口下载固件。连接方式就是模块TX接USB转串口的RX模块RX接USB转串口的TX共地。注意很多USB转串口芯片的TX默认电平是3.3V如果模块是1.8V电平需要加电平转换。老老实实看手册。供电顺序也重要先给模块供VCC再给VDDIO或者同时上电但不能只给VDDIO而不给VCC。否则芯片内部ESD保护二极管可能会通过VDDIO反向漏电长期会有损坏风险。另外下载固件时最好把外部外设先断开避免下载过程GPIO状态变化对外设造成误动作。3. 开发环境搭建WICED SDK的安装与工程创建3.1 安装SDK与工具链WICED SDK在博通收购后经历了几次版本变化。AIR模块对应的SDK一般是WICED Smart SDK里面包含了芯片的BLE协议栈、示例代码和构建脚本。安装路径不要带中文和空格否则GNU Make的解析很容易出问题。工具链需要安装arm-none-eabi交叉编译器版本要跟SDK要求匹配。太新的编译器可能会因为默认的链接脚本不兼容而导致奇怪的编译错误。我习惯在SDK的Makefile里加上CROSS_COMPILEarm-none-eabi-并把编译器路径加到环境变量里。Linux和Windows都可以编译但Windows上需要装一个GNU Make环境例如MinGW或者cygwin。实测MinGW64配合WICED SDK工作良好但注意要把Make和编译器都加入PATH并且要用make命令而不是mingw32-make否则会找不到内置规则。3.2 创建第一个BLE工程WICED SDK的目录结构是按apps、platforms、libraries划分的。最简单的方式是复制一个示例工程改成自己的名字。目录名称不要用驼峰全部小写加下划线避免Make的隐式规则误判。例如复制apps/hello_sensor为apps/air_sensor然后修改air_sensor.mk文件里的TARGETSensor_Tag? 实际上WICED中通过TARGET变量指定平台。AIR模块对应的平台在SDK里可能有如果没有需要自定义平台文件。这里要特别提醒定制平台文件是WICED开发里最容易被忽略的环节。你要在platforms目录下新建一个文件夹包含platform.h、platform.c和*.mk定义好GPIO映射、时钟配置、UART引脚。这一步如果做错了编译能过但跑起来就莫名其妙死机。3.3 编译下载和日志输出编译命令一般是这样make air_sensor-BCM9WICED_Smart具体target名称要参考SDK里TARGETS列表。编译通过后会生成.hex或.bin文件通过串口工具下载。日志输出是调试BLE最好的朋友。WICED SDK提供了WPRINT_APP_INFO这类宏内部会把调试信息重定向到UART。建议在工程一开始就把UART日志打开。很多“跑不起来”的问题其实只要看日志就知道了。但注意日志输出会占用UART口如果你只有一路UART就要在调试模式和业务模式之间切换。我通常做一个编译开关#define APP_LOG_ENABLE 1 #if APP_LOG_ENABLE #define APP_LOG(fmt, ...) WPRINT_APP_INFO(([AIR] fmt \n, ##__VA_ARGS__)) #else #define APP_LOG(fmt, ...) #endif这样量产固件直接关掉日志不影响运行。4. 固件核心逻辑实现广播、连接与GATT服务4.1 初始化流程WICED Smart SDK的初始化流程很固定先启动协议栈然后注册事件回调再设置广播或连接参数。一个典型的初始化代码如下void app_init(void) { wiced_bt_stack_init(app_management_cback); } void app_management_cback(wiced_bt_management_evt_t event, wiced_bt_management_evt_data_t *p_event_data) { switch (event) { case BTM_ENABLED_EVT: APP_LOG(Bluetooth enabled); start_ble_advertising(); break; default: break; } }这段代码的意思很明确在协议栈启动成功后开始广播。注意事件回调是在协议栈上下文中执行的不要在回调里做耗时操作比如延时、长循环。所有业务逻辑应该放在单独的任务或者通过定时器触发。4.2 广播参数配置广播是BLE设备被发现的第一步参数配置会直接影响功耗和连接体验。AIR模块在WICED SDK里配置广播参数是通过wiced_bt_start_advertisements函数实现的static void start_ble_advertising(void) { wiced_bt_ble_advert_data_t adv_data; uint8_t adv_data_buf[31]; memset(adv_data, 0, sizeof(adv_data)); memset(adv_data_buf, 0, sizeof(adv_data_buf)); adv_data.adv_data_len sizeof(adv_data_buf); adv_data.p_adv_data adv_data_buf; wiced_bt_ble_advert_elem_t elem; elem.advert_type BTM_BLE_ADVERT_TYPE_NAME_COMPLETE; elem.len 4; memcpy(elem.data, AIR1, 4); wiced_bt_ble_add_advert_elem(adv_data, elem); wiced_bt_ble_advert_params_t params; memset(params, 0, sizeof(params)); params.adv_int_min 160; params.adv_int_max 240; params.adv_mode BTM_BLE_ADVERT_ENABLE; params.adv_chn_map BTM_BLE_ADVERT_CHNL_37 | BTM_BLE_ADVERT_CHNL_38 | BTM_BLE_ADVERT_CHNL_39; params.adv_filter_policy BTM_BLE_ADVERT_FILTER_ALLOW_ALL; params.p_advert_data adv_data; wiced_bt_start_advertisements(params); }这里adv_int_min和adv_int_max的单位是625μs。160到240对应100ms到150ms的广播间隔。对低功耗设备来说广播间隔越大越省电但手机扫描发现就越慢。我实测下来100ms广播间隔在10米范围内手机大概1-2秒内能发现如果是寻物类应用最好用100ms如果是长时间广播的信标可以放到500ms以上。4.3 GATT服务与通知AIR模块的另一个核心工作是提供GATT服务。如果你要推送温湿度数据给手机最常用的方式是自定义一个Service然后用Notify通知。GATT服务的定义在WICED SDK里有几个关键结构体static const gatt_data_t gatt_database[] { { GATT_UUID_SERVICE, GATT_UUID_SIZE_16, my_service_uuid_128 }, { GATT_UUID_CHARACTERISTIC, GATT_UUID_SIZE_16, my_char_uuid_128, GATT_PROP_NOTIFY, 0, NULL, NULL }, { GATT_UUID_CHAR_DESCRIPTOR, GATT_UUID_SIZE_16, gatt_char_user_desc_uuid, GATT_PROP_NONE, 0, NULL, NULL } };这只是示意。实际在WICED Smart SDK中GATT数据库通常通过wiced_bt_gatt_db_init注册回调函数pfn_gatt_cback会处理各种GATT事件比如客户端订阅、读写请求。做完配置后发送通知是你的应用主动调用的wiced_bt_gatt_status_t send_notification(uint16_t conn_id, uint16_t handle, uint8_t *data, uint16_t len) { wiced_bt_gatt_value_t value; memset(value, 0, sizeof(value)); value.conn_id conn_id; value.handle handle; value.len len; memcpy(value.value, data, len); return wiced_bt_gatt_send_notification(value); }这里有个容易出问题的地方handle必须和GATT数据库里定义的属性句柄一致如果查表查错了客户端会收不到通知。调试时可以通过手机端的BLE调试工具看服务详情确认自己的handle是否正确。5. Windows下的设备适配蓝牙设备不识别或网络适配器里没有Broadcom选项5.1 现象描述用AIR模块做测试时经常需要把模块作为BLE外设接到PC上用Windows自带的蓝牙功能或者第三方工具抓数据。这个时候有概率出现一个很经典的故障在PC的“设备管理器”里找蓝牙设备发现网络适配器列表里没有Broadcom相关的选项而实际硬件是存在的。这个现象特别容易让新手以为是模块坏了。实际上大多数情况不是硬件问题而是Windows蓝牙协议栈没有正确加载对应驱动或者蓝牙相关的服务没有启动。AIR模块本身作为BLE外设只是被主机搜索的对象和PC端是否有Broadcom驱动没有直接因果关系。我遇到过一种更隐蔽的情况USB蓝牙适配器插在前置USB口时供电不稳系统会间歇性识别不到设备。这时候不是驱动问题而是供电问题。5.2 排查步骤先确认硬件是否被系统识别。打开设备管理器点击“查看-显示隐藏的设备”在“蓝牙”节点下看有没有带感叹号的设备。如果完全没有要么是USB驱动没装好要么是无线网卡/蓝牙一体卡被禁用了。然后在服务列表里检查三个服务Bluetooth Support Service、Bluetooth Audio Gateway Service和Bluetooth User Support Service。很多精简版系统会把这几个服务禁用导致设备管理器里看不到Bluetooth选项更看不到Broadcom的条目。右键把这三个服务的启动类型改成“自动”并启动。如果服务启动失败多半是依赖的驱动没有正确安装需要重新安装蓝牙驱动。另外一个高频坑是在“网络适配器”里找蓝牙网络适配器。Windows会把PANU和NAP服务虚拟成一个网络适配器但这个适配器只有在蓝牙无线电正常初始化后才会出现。如果你在网络适配器里看不到Broadcom蓝牙网络适配器不代表蓝牙模块失效只说明Radio层没有启动。可以尝试在设备管理器里禁用再启用蓝牙设备然后重新扫描。如果还是没有打开powershell运行Get-PnpDevice -Class Bluetooth看是否能看到设备实例。如果看不到基本可以断定是驱动没装到位。5.3 为什么驱动、服务、供电都可能影响驱动、服务、供电分别对应的是Windows的驱动栈、系统服务依赖和能力管理。蓝牙适配器需要驱动提供HCI层接口服务负责L2CAP以上的协议供电则决定了USB设备是否可以正确枚举。任何一个环节断了都会表现为设备管理器无Broadcom选项。实际项目里我强烈建议准备一个USB蓝牙4.0/5.0适配器并下载好官方驱动备用。开发期不要过度依赖系统自带驱动Windows Update的驱动经常停留在旧版本对新的BLE特性支持不够好。AIR模块测试时很多时候换一个驱动版本连接就稳定了。6. 调试心得与常见问题速查6.1 用日志和AirSnort? 用BLE调试工具WICED SDK的日志输出能覆盖协议栈状态、GATT回调、错误码这是第一排查手段。建议在每次状态切换时打日志例如广播启动、连接建立、断开连接、收到写请求等。这样即使出现偶发问题日志也能帮我们把时间线还原出来。手机端建议常备“nRF Connect”和“LightBlue”这类BLE调试工具。它们可以扫描设备、查看广播包、连接服务、读写特征值。用它们能快速验证AIR模块的GATT数据库设计是否正确。6.2 功耗测量AIR模块低功耗是卖点但低功耗不是默认就有的。测量功耗时要在广播状态和连接状态分别测量而且要把模块上不必要的GPIO拉低否则浮空引脚会产生额外漏电流。用万用表或者电流探头测量时注意电源纹波。很多“假功耗高”是因为供电电路没加去耦电容。测量电池供电的设备还要注意电池内阻会造成电压跌落导致模块复位。6.3 常见问题速查表问题现象可能原因解决办法模块不广播启动模式引脚拉高检查BOOT/CFG引脚电平手机扫描不到设备广播间隔过大或信道被禁用调整adv_int_min/max使能37/38/39信道连接后秒断从机连接参数过于激进调大connection interval或者做参数协商接收不到通知GATT handle不匹配用BLE调试工具查看实际handleWindows没有Broadcom选项驱动/服务未启动检查服务、重装驱动、换USB口串口日志乱码VDDIO电平不匹配确认VDDIO和主控电平一致功耗偏高外部GPIO浮空将未使用引脚配置为下拉输出低最后再分享一个小技巧AIR模块量产前一定要做至少48小时的高低温断电重启测试。蓝牙芯片的晶振起振条件受温度影响很大低温下晶振起振慢如果代码里上电后等协议栈就绪时间太短很容易偶发性启动失败。WICED SDK里有一个wiced_bt_stack_init的返回状态一定要检查如果失败要尝试重新初始化。这个坑我栽过一次当时就是代码里没判断返回状态结果设备在零下10度的环境里大概有2%的概率起不来。加一个重试机制后问题就消失了。做低功耗蓝牙产品往往不是死在方案上而是死在细节上。AIR Module方案本身成熟剩下的就看你的认真程度了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价