做可穿戴追踪器这个方向,圈子里聊到BLE芯片时大概率绕不开Nordic。不管是运动手环、老人防走丢胸牌、宠物追踪器,还是工牌式考勤终端,几乎都能看到nRF系列SoC的身影。最初我接触这个领域时也有点疑惑:市面上能跑BLE的方案并不少,为什么偏偏Nordic被选中得这么频繁?真到自己完整走了一遍从选型到量产适配的全流程后,这个问题的答案就非常清晰了——不是因为它性能最猛,而是它在功耗、体积、协议栈成熟度上取得了一个对可穿戴设备最友好的平衡点。这篇东西我会围绕"Nordic BLE SoC如何撑起一个可穿戴追踪器"这个主线,把芯片选型逻辑、硬件设计要点、BLE连接参数调优、DFU升级和实测排障这些环节挨个拆开讲,适合刚接手BLE可穿戴项目的硬件工程师、固件开发,以及被应用层蓝牙通信折腾到头秃的同学参考。
1. 为什么可穿戴追踪器会优先看中Nordic的BLE SoC
1.1 可穿戴追踪器的真实需求优先级
在做任何选型之前,必须先把可穿戴追踪器的需求优先级摆清楚。这种设备的核心属性决定了它的约束条件:体积小、电池容量有限、长期佩戴、不需要高频交互。这意味着芯片选型的第一指标不是算力而是功耗,第二指标是集成度,第三才是协议栈和生态。
追踪器不是手机,用户不会每天给它充电两次。一颗CR2032纽扣电池容量大概在220mAh左右,一个典型的小型追踪器如果目标是续航半年以上,平均工作电流需要被压在100uA甚至50uA以下。这个数字单靠降低主频是做不到的,必须在各个工作状态之间做精细切换。而Nordic的BLE SoC在睡眠电流和射频收发峰值电流上的数据一直处于行业前列,例如nRF52832的关断模式电流可以做到0.3uA级别,RX峰值电流在5.1mA左右,TX 0dBm时约5.3mA。这些数字放在整个BLE SoC市场里都属于"很能打"的水平。
另外穿戴设备普遍只有一个很小的PCB空间,紧凑的WLCSP封装、足够多的GPIO、内置DC-DC和LDO,这些特性直接影响硬件设计能不能把整个蓝牙子系统塞进一个拇指大小的空间里。所以说,选Nordic不一定是因为它某个单项最出色,而是因为它最清楚可穿戴设备需要什么。
1.2 Nordic BLE SoC的几代产品边界
很多人刚接触Nordic时会被型号搞晕:nRF52810、nRF52811、nRF52820、nRF52832、nRF52833、nRF52840、nRF5340、nRF54系列,到底有什么区别?简单梳理一下。
- nRF52810是nRF52832的低配版,Flash减半到192KB,少了NFC等外设,适合那些功能非常固定的简单追踪器。
- nRF52811在52810基础上加了AOA/AOD定位支持,适合做室内定位信标。
- nRF52832是出货量极大的一颗经典芯片,64MHz M4F内核,512KB Flash/64KB RAM,支持BLE 5.0,很多成熟的可穿戴方案都基于它。
- nRF52833可以理解为nRF52840的精简版,去掉USB和QSPI,但保留了更多GPIO和更大的Flash,适合需要较多IO的追踪器。
- nRF52840是上一代旗舰,1MB Flash/256KB RAM,带USB、QSPI、最多20个连接,如果要跑复杂的应用程序或者做中心设备,这个是比较稳妥的选择。
- nRF5340是双核架构,Cortex-M33应用核加Cortex-M33网络核,应用和协议栈物理隔离,适合需要同时跑复杂算法和BLE协议栈的高端产品。
- nRF54系列是最新产品,更低功耗、更高的安全特性,不过生态和参考案例还在快速积累期,投入量产时建议先充分验证。
从可穿戴追踪器的角度看,如果产品功能比较简单,比如只做步数统计、位置轨迹记录、防丢提醒、震动反馈,nRF52832依然够用;如果预算和空间允许,直接用nRF52840或者nRF5340能获得更大冗余,方便后续OTA升级和功能叠加。
1.3 和竞品对比时真正的差异点
选了Nordic并不是因为"别人都用我也用",而是有几个竞品在可穿戴场景下很难替代的优势。
第一是功耗模型的可控性。BLE协议栈负责射频事件,应用代码负责业务逻辑,两者在不同睡眠模式下可以灵活切换。nRF5 SDK时期的SoftDevice就提供了非常清晰的API,告诉开发者在某个时间段内可以申请多少协议栈事件,从而精确规划功耗。到了nRF Connect SDK阶段,基于Zephyr的电源管理框架让睡眠和唤醒路径变得更统一。
第二是协议栈和射频前端的高度集成。天线匹配、多协议共存、广播和扫描的并发处理,这些已经由Nordic的驱动和协议栈封装得很好。对于很多中小团队来说,没有专门的射频工程师也能在参考设计基础上快速改出一版可用的硬件。
第三是生态工具链。nRF Connect for Desktop、nRF Connect SDK、nRF Util、在线功率估算工具等一系列工具让开发效率提升明显。比如你在做功耗规划时,Nordic官方提供了Power Profiler Kit(PPK2),可以在代码运行的同时直接测量电流曲线,定位到具体哪个任务在耗电。这种"工具链闭环"在BLE方案里非常难得。
2. 硬件设计里容易翻车的射频、电源和传感器坑
2.1 天线净空和阻抗匹配
用Nordic的BLE SoC做追踪器,硬件上第一个容易忽视的是天线区域。芯片本身可以参考官方参考设计,但天线匹配和板层布局需要根据你的实际PCB结构调整。不要以为"把芯片画对了就能通",射频部分如果处理不好,传输距离会从标称的几十米掉到几米。
天线底部净空区必须留够。我见过有工程师为了缩小板子,在天线下方铺了完整的地铜皮和走线,结果谐振频率偏了一大截,实测灵敏度掉了接近10dB。净空的具体大小取决于天线类型,比如陶瓷天线的净空区相对小一点,PCB天线对净空就比较敏感。调试时如果条件允许,最好用网络分析仪看S11曲线,通过调整π型匹配网络的电容电感参数把谐振点拉到2.44GHz附近。没有网分的情况下,可以在环境中固定一台蓝牙接收设备,对比不同匹配参数下的RSSI,虽然粗糙一点,但也能大致判断趋势。
另一个细节是电池和金属结构件对天线的影响。追踪器往往要放进金属外壳或者紧贴人体,这些都会导致天线失谐。建议在结构设计阶段就预留天线区域的空间,不能等模具开好了才发现信号起不来。
2.2 电源纹波对射频和ADC的双重影响
可穿戴设备通常用锂电池或纽扣电池供电,系统中还可能有DC-DC升压、充电管理、振动马达这些负载变化剧烈的器件。如果这些后端电源串扰到射频供电轨,直接表现是射频灵敏度的瞬时恶化,严重时会在连接状态下经常出现丢包。更隐蔽的问题是,很多追踪器用ADC去采集电池电压来估算剩余电量,如果基准电压本身纹波很大,采集结果就会忽高忽低,给用户呈现一个跳变的电量百分比。
实际处理时建议在电池端到SoC电源之间做一个简单的π型滤波。小电流场景下,串联一个几十欧姆的电阻加两个10uF左右的电容就能起到不错的效果。需要仔细权衡的是:滤波电容过大会延长电压爬升时间,影响上电复位的稳定性;串联电阻过大在射频发射瞬间会造成供电电压跌落,同样影响发射功率。所以这个位置需要根据整机的峰值电流去算压降,不能盲抄参考设计。
还要留意ADC参考电压的选择。有些工程师默认用VDD作为ADC参考,而VDD又跟着电池电压一直变化,那么百分比计算就永远不准。正确的做法是使用内部参考电压,再用外部精密电阻分压网络把电池电压按比例降到ADC输入范围内,并定期用已知电压源做一点校准。这样测出来的电压曲线才平滑可信。
2.3 运动传感器、心率等外设的功耗联动
可穿戴追踪器几乎一定会带加速度计,有些还带光学心率传感器。这些外设本身有各自的低功耗模式,但如果固件里没有把它们和主控的睡眠状态联动起来,整体功耗还是压不下去。
运动传感器通常通过I2C或者SPI连接。I2C只需要两根线,省IO,但速率低,读取大块FIFO数据时会拖时间。SPI速度更快,但需要额外片选引脚。对追踪器这种大量依赖中断唤醒的场景,我更推荐给传感器分配独立中断脚,并且把中断脚配置为高精度GPIO唤醒源。传感器数据在片上FIFO积攒一段时间后再一次性读取,主控大部分时间都待在睡眠状态。
心率传感器这类光学器件功耗更大,一般都需要单独控制电源。这里有个容易踩的坑:直接用GPIO给传感器供电时,要注意GPIO拉电流能力。很多MCU的GPIO在输出高电平时的驱动能力有限,如果传感器瞬时电流比较大,电压会被拉垮,导致传感器复位或者采集异常。稳妥的做法是加一个负载开关或者用MOS管控制供电。
2.4 漏电流这个隐形杀手
硬件设计的功耗不光是芯片本身的功耗,整个系统的漏电流会偷偷吃掉续航。蜂鸣器、马达驱动、LED指示灯、电平转换芯片,甚至PCB表面的助焊剂残留,在潮湿环境下都可能造成微安级的漏电。
LED推电流至少要选择百k欧姆级的下拉电阻,避免在待机时电平不确定导致微亮。马达驱动要注意续流二极管的位置,否则关断瞬间的感应电动势会通过地线干扰复位。充电管理芯片需要特别留意静态电流,有些充电IC在电池充满后会有一个持续的待机消耗,虽然只有几微安,但对超低功耗的追踪器来说是不可接受的。这些漏电流靠计算很难完全评估,只能在做整机功耗测试时用高精度的电流仪去逐项排查。
3. BLE连接、广播与功耗参数的一套组合拳
3.1 广播参数决定设备被发现的方式
追踪器的"存在感"完全依赖广播。广播间隔决定了数据包的发送频率,广播间隔越短,手机扫到设备越快,但功耗也越高。一个100ms广播间隔的报文平均功耗大概在几十微安到一两百微安之间,具体取决于广播信道数量和TX功率。
如果设备需要被iOS的后台扫描能力发现,还需要考虑iBeacon格式。Nordic的协议栈支持自定义广播数据和扫描响应数据,iBeacon本质上就是一组特定格式的广播帧,指定UUID、Major、Minor字段。在nRF Connect SDK中,可以在广播数据中直接拼装iBeacon数据,没有额外难度。
BLE 5.0之后引入了扩展广播,可在广播数据中承载更长的Payload。对于需要广播传感器数据、设备名称、厂商自定义数据一堆内容的追踪器,扩展广播会比较实用,但速率更高的编码方式在实际环境中抗干扰能力略差。普通追踪器如果广播数据不超过20字节,用传统广播即可,不必为了追求新特性引入不必要的兼容性风险。
3.2 连接参数才是低功耗的关键杠杆
一旦手机连接到追踪器,功耗的主要来源就变成连接事件。连接间隔(Connection Interval)和从机延迟(Slave Latency)这两个参数决定了功耗的大小。
连接间隔是主设备和从设备每隔多久进行一次数据交换。间隔越短,双向通信的实时性越高,但射频收发越频繁。从机延迟允许从设备跳过若干个连接事件而不必醒来监听,这是低功耗从设备的精髓。比如设置连接间隔为30ms,从机延迟为4,意味着从设备最多可以连续跳过4个连接事件,即大约120ms才必须醒来监听一次。只要没有上行数据要发,就可以长时间待在睡眠状态。
但有个问题:从机延迟只影响从设备,主机永远不会跳过事件,如果主机通过频繁的连接事件来维持链路状态,那从设备即使跳过了事件,也需要在相邻事件之间保持正确的时序。实际调参时我一般建议,如果产品不需要低延迟数据交互,连接间隔设置在50ms以上,从机延迟设为4或更高,配合supervision timeout设置为连接间隔的6倍以上,这样既省电又不容易触发链路超时。
3.3 数据通知触发时机的功耗控制
除了连接参数,数据通知(Notification)的使用方式也会影响功耗。BLE协议单次通知的最大Payload通常只有20字节,除非协商了更大的ATT MTU。可穿戴追踪器如果频繁发送周期性的通知,比如每秒发一次传感器数据,功耗会明显上升。
更好的做法是在设备端缓存数据,每累计到一定量再批量发送,或者等手机主动请求时再上传。这样不仅减少射频收发次数,还能配合连接事件完成数据的搬运。比如可以通过Notification发送数据时,先检查当前是否有有效连接,如果连接参数还没有协商好,暂时不要发送,避免数据堆积在协议栈缓存里造成不必要的唤醒。
3.4 PAwR和iBeacon什么时候该用
热词里有人问过PAwR,这也是Nordic近期支持的新特性。PAwR的全称是Periodic Advertising with Responses,它让广播网络支持双向通信:多个从设备共享同一条周期广播信道,以时分方式应答。这种模式适合超大规模的信标网络,比如仓库里上千个标签的定位,或者在展馆内做大量节点的信息下发。普通可穿戴追踪器如果只是手机APP一对一连接,PAwR并不是必需品,强行使用反而会增加复杂度。
对追踪器更有实用价值的是iBeacon和Eddystone这类固定广播格式。iBeacon主要用于iOS后台定位和区域监控,Eddystone则包含URL、TLM等类型。如果你的场景是"手机靠近设备自动弹出通知"或者"室内定位导览",那么直接把iBeacon数据作为广播内容发出来,配合手机端的蓝牙扫描,就能实现非常流畅的近场交互体验。
3.5 功耗测量方法和工具
测量BLE低功耗设备,最理想的设备是Nordic官方的Power Profiler Kit 2(PPK2)。它可以连接在电池和被测设备之间,以很高的采样率记录电流曲线。实测中能清晰看到广播事件、连接事件、外设读取、Flash擦写这些操作分别贡献了多少电流。
我自己测量追踪器功耗的习惯是:先测整机睡眠电流,再测单次广播事件的平均电流,然后测连接状态下的电流,最后把各个状态的时间占比代入到日常使用模型中估算续航。很多"看似很省电"的代码,在电流曲线上会暴露问题,比如SPI Flash擦除时的电流尖峰、传感器读取时I2C时钟线反复翻转的电流、甚至GPIO配置错误导致的额外电流。没有PPK2的话,用万用表测到的只是平均电流,很难定位到具体是哪一行代码引起的问题。
4. 固件开发、DFU升级与连接可靠性的实战备忘
4.1 用nRF5 SDK还是nRF Connect SDK
这是一个新项目必须做的选择。nRF5 SDK用的SoftDevice方案,把BLE协议栈编译成二进制固件,Flash分区和调用方式都很固定,上手相对简单,资料也多,很多老工程师的习惯都在这里。nRF Connect SDK基于Zephyr RTOS,驱动模型和调度方式更现代,支持全系列最新芯片,并且官方推广大趋势明显,新项目基本建议直接用NCS。
虽然NCS的学习曲线更陡峭,比如设备树(Devicetree)、Kconfig配置、线程模型等概念要花时间掌握,但换来的是代码可移植性和长期维护的便利。如果已经在nRF5 SDK上开发过产品,迁移时也不用害怕,大部分BLE逻辑是相通的。我个人的意见是:只要供应商没有强制要求,面向新项目就直接用NCS,别在旧SDK里投入太多。
4.2 小程序DFU、Android和C#接入的常见误区
可穿戴追踪器几乎都逃不掉手机端联调。热词里有人问"只安装Shiny.BluetoothLE可以实现BLE蓝牙通信吗",还问Android BLE工程怎么建,这些问题的本质是对BLE通讯模型的理解不够。
BLE通信不是简单的"连上就发数据",而是需要经过扫描、连接、发现服务、发现特征、订阅通知、读写特征等多个步骤。任何一步没做对,手机端就会表现成"连接成功但没有拿到数据"。在小程序端做DFU尤其典型:微信小程序的BLE接口相比原生App更受限,不同机型对MTU、写入分包大小、通知速率的支持也不一样。如果不采用分包写入策略并做好错误重传,很容易出现刷到一半就断开或者固件校验失败的场景。
C#做BLE也很常见。桌面端Windows下可以使用WinRT的Windows.Devices.Bluetooth命名空间,不需要额外第三方库;如果要跨平台,可以考虑Shiny.BluetoothLE,但它并不是"装了就能用",还是需要自行处理平台权限申请、生命周期管理、GATT队列等细节。所以更稳妥的路线是:先用Nordic官方的nRF Connect手机App把设备和云端服务调试通,再用自己的App复现同一套流程。
4.3 Secure DFU的分区策略和回滚
DFU是追踪器的刚需,因为产品出货后还要修复Bug、增加新功能。Nordic的DFU支持双Bank升级:应用固件先下载到空闲的Bank区域,校验成功后一次性搬移到活动区域。这种方式占用Flash空间较大,但安全可靠,升级过程中即使断电也不会变砖。
固件分区的规划在工程一开始就要想好:Bootloader一个区域、应用一个区域、DFU备用区域一个区域,可能还要给Flash存储预留一小块。如果Flash容量紧张,可以考虑单Bank升级,但风险是写入中途断电后系统只剩一个不完整的固件。对于量产设备,双Bank通常更值得,配合Bootloader里的签名校验,可以防止非法固件被刷入。
在实际操作中,有一部分"DFU失败"的根因是手机和设备的MTU协商不一致。默认MTU较小,如果DFU包超过MTU长度,需要做分包发送。Android和微信小程序的BLE库对分包支持参差不齐,建议在固件端就把每次接收的数据长度判断好,不完整的数据包先缓存,等收齐后再做校验。
4.4 连接不稳定的常见根因
追踪器被抱怨"连不上、老断连"的情况很常见,但不一定都是芯片或协议栈的问题。首先是MAC地址随机化:如果设备重启后使用新的随机地址,手机端之前已经缓存的绑定信息就失效了,App需要重新扫描并发现新地址。其次是连接参数协商:手机连接后可能主动请求修改连接参数,如果设备端拒绝了请求,双方参数不一致就会导致连接不稳定。在Nordic的协议栈里,通过配置可以允许或拒绝连接参数更新请求。
多设备同时连接的场景也要注意。一个典型的追踪器可能同时要连接手机、门禁终端、车站闸机等,如果它们是轮询式地操作同一个GATT服务,固件需要做好并发访问保护。用Nordic的协议栈做多个中央连接时,回调函数里要区分实例ID,避免在全局缓冲区上互相踩踏。遇到"一连接就崩"的问题,优先看协议栈事件回调里是否有访问了非线程安全的缓冲区。
5. 实测中的坑:从电流曲线到连接距离
5.1 一次连接不稳定的完整排查链路
分享一个真实案例。手里一款追踪器,用户在手机解锁、靠近时能连上,但亮屏几秒后就提示蓝牙设备断开。一开始怀疑是协议栈版本问题,升级最新SDK后问题依旧。后来用电流分析仪抓电流曲线,发现连接成功后设备每隔几百毫秒就有一个大电流尖峰。追代码发现是在连接事件里额外开启了一个定时器去做ADC采样,采样期间又去读取了加速度计FIFO,导致每次连接事件的处理时间被拉长到几毫秒,超过了连接间隔的可用窗口,链路层判断设备响应超时,于是被动断开。
解决方式很简单:把ADC采样和传感器FIFO读取移到独立的工作队列里,在BLE事件之间处理,或者干脆降低采样频率,不要在连接事件回调里做任何耗时操作。这个案例说明,排查BLE连接稳定性问题时,不要一上来就怀疑射频硬件,先用协议栈日志和电流曲线确认软件时序是否合理。
5.2 电池电量检测不准的调优
电量百分比跳变在可穿戴产品里容易引发客诉。问题的根源往往在于电池开路电压和负载电压的差别。追踪器在广播或连接时电流较大,电池端电压会出现明显的压降,如果ADC正好在射频发射时采样,采到的电压就会偏低;两次采样之间如果都在睡眠状态,电压又会回升。由此产生的结果就是电量百分比反复跳动。
处理方法是:规定只有进入睡眠后固定延时一段时间才允许采样,或者在一个固定的连接事件空闲窗口采样。另一个更实际的办法是取最近多次采样值的滑动平均值,避免单次采样波动影响展示。还可以利用Nordic的SAADC内部校准功能,配合低温度漂移的参考电阻,把电压测量的误差控制在能接受的范围。
5.3 射频距离和天线匹配的实测对照
射频距离不达标是项目后期比较挠头的问题。可穿戴追踪器因为体积小,天线往往是贴片天线或者PCB天线,天线效率本身就不高,再加上人体遮挡,实测距离和芯片数据手册上的理论值差距很大。做实测时建议固定一个标准测试位置,比如设备放在桌上、手机拿在耳边,这样可以统一对比不同天线参数和匹配方案的远近。
如果发现距离太差,优先检查天线净空区是否合格,然后是匹配网络是否为最合理。通过调整匹配电容,也许能把灵敏度提升几个dB。其次是检查晶振。蓝牙对时钟精度要求较高,32.768kHz的RTC晶振和HFXO晶振如果选型不当或因焊接不良导致频偏,连接距离同样会明显缩短。用频谱仪看发射频谱是最直接的,如果看到明显的频偏或杂散,先查晶振。
5.4 从能跑到能出货的必做测试项
很多项目在实验室里一切正常,一到量产出问题,就是因为没有建立基本的测试清单。我建议至少包含以下几项:
- 不同电池电压下的上电复位测试,确认低压下不出现程序跑飞。
- 长时间连续运行的压力测试,观察是否有内存泄漏、任务堆栈溢出、Flash写入异常。
- 多台手机兼容性测试,至少覆盖iOS和主流Android机型的连接、扫描、DFU流程。
- 高低温环境下的电流和射频指标测试,关注休眠电流是否会因为漏电流增大而恶化。
- ESD干扰测试,模拟用户日常穿戴时产生的静电,观察设备是否死机或者蓝牙断开。
- 批量烧录与产测流程,每台设备都需要验证蓝牙MAC地址、射频校准参数写入是否正常。
在这个清单里,最容易被小团队忽视的是产测的射频校准。BLE芯片在出厂时有设备自身的晶体频率误差,需要在产测时通过软件校准并写入Flash,否则批量生产的每一台设备射频指标都会漂移。Nordic提供了相关的校准库和参考流程,照着落地,能避免很多"为什么这台连得上,那台连不上"的玄学问题。
上面这些内容基本覆盖了用Nordic BLE SoC做可穿戴追踪器过程中最核心的环节。从芯片选型、硬件设计到BLE参数调优、固件DFU、乃至量产测试,每一步都有大量容易被经验不足的工程师忽略的细节。我在实际项目里最深的一点体会是:可穿戴追踪器开发的重心往往不是让设备"能跑",而是让它在极小的电池容量下"跑得久、连得稳、升级不失败"。围绕这个目标,所有技术决策都应该以功耗和可靠性为优先,而不是以功能丰富度或开发速度为先。希望这篇梳理对准备入坑或正在调试的同学有实际帮助。