尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

RISC-V MCU双无线方案:Wi-Fi与BLE共存设计与实践

RISC-V MCU双无线方案:Wi-Fi与BLE共存设计与实践 最近在做一个智能家居网关的小项目选型的时候被一颗RISC-V内核、同时集成Wi-Fi和BLE的MCU吸引住了。以前这种双无线方案要么是ESP8266那种Wi-Fi单模再外挂一颗蓝牙芯片要么是Cortex-M4配一个独立的射频收发器板子空间和成本都不太好看。现在RISC-V架构的MCU直接把Wi-Fi和BLE揉进一颗芯片里整体方案一下子精简了很多。这篇文章就把我这段时间选型、搭建开发环境、调试协议栈、处理共存干扰的完整过程梳理一遍里面有一些实测数据和踩坑记录希望对正在做同样评估的朋友有帮助。1. 为什么是“RISC-V Wi-Fi BLE”这个组合1.1 从选型说起外挂方案 vs 单芯片集成先说选型背景。我做的这个项目需要设备同时具备两种通信能力Wi-Fi负责跟路由器、云平台之间的高带宽数据交互比如固件升级、日志上报BLE负责跟手机App的低功耗近场交互比如配网辅助、设备状态广播、现场调试。按照以前的做法方案大概是这样的主控MCU选一颗Cortex-M4或者M0负责应用逻辑和协议栈Wi-Fi部分用一颗AT指令的Wi-Fi模组比如ESP8266、W600之类BLE部分再挂一颗BLE SoC比如nRF52832或者DA14531这个方案的成熟度确实高资料多几乎每个模块都有现成的参考设计。但问题也明显板级BOM成本高三颗芯片加上外围器件和天线匹配电路面积和成本都不占优势功耗管理复杂三颗芯片分别有各自的sleep和wakeup逻辑协同调度非常麻烦调试链路长Wi-Fi链路出问题要抓串口日志BLE链路出问题又要抓另一路日志有时候还得用协议分析仪排查效率很低。而单芯片集成方案也就是标题里说的“RISC-V MCU Blends Wi-Fi and BLE Connectivity”把应用处理器、Wi-Fi MAC/基带、BLE基带、射频前端收发器都放到一颗芯片里。这样一颗芯片完成所有工作成本低、面积小而且协议栈跑在同一个CPU上上下层交互不用走AT指令数据路径可以直接共享内存延迟和功耗都下来了。1.2 RISC-V内核给MCU带来了什么很多朋友问我为什么这个组合偏偏用RISC-V内核而不是继续用ARM Cortex-M这里面的理由有几个层面。首先是开源指令集带来的灵活性和自主可控。RISC-V的指令集架构是开放标准芯片厂商可以基于标准指令集扩展自定义指令比如针对Wi-Fi协议栈的CRC计算、位操作、网络字节序转换就可以用自定义指令加速这在ARM上做不到因为ARM是不允许你改指令集的。其次是生态的快速成熟。以前RISC-V被诟病软件生态差IDE不好用、调试器支持不完善、RTOS移植麻烦。但这两年情况明显好转我这次用的开发环境、SDK、调试工具链都已经相当成熟了跟ARM的开发体验几乎没有差距。GCC工具链、OpenOCD、Zephyr、RT-Thread这些基础软件都已经对RISC-V做了很好的支持。再者是成本和供应链的考量。RISC-V IP授权费比ARM低这颗芯片的终端价格就比同定位的Cortex-M系列有优势。对于物联网这种对成本极度敏感的领域这个优势很关键。不过也得客观说一句RISC-V在某些细分工具上还是有差距的比如低功耗调试的生态、功耗分析工具、部分中间件对架构的适配程度这些只能在实践过程中慢慢踩坑解决。2. 芯片级硬件方案拆解2.1 无线子系统Wi-Fi和BLE怎么塞进一颗芯片这是我最关心的部分也是这颗芯片最核心的技术点。Wi-Fi和BLE虽然都工作在2.4GHz频段但它们的物理层机制完全不同Wi-Fi 802.11n用的是OFDM调制带宽20MHz支持MCS0到MCS7编码BLE用的是GFSK调制信道带宽只有2MHz二者对射频前端的要求、信号处理路径、MAC层调度逻辑都不一样。在一颗芯片里同时实现这两套系统不是简单地把两个die封装在一起而是需要共享射频前端的一部分组件。从芯片内部架构上看典型的方案是这样的射频前端共用一套PA/LNA和天线开关通过时分复用切换Wi-Fi和BLE的收发路径Wi-Fi路径有独立的I/Q调制解调器支持802.11b/g/n标准最高速率一般是72.2Mbps20MHz、MCS7、短GIBLE路径有独立的GFSK调制解调器支持BLE 4.2或者BLE 5.0包括所有广播信道和数据信道的编解码两套基带共用同一个MAC调度器由固件中的共存机制统一管理收发窗口这套架构的好处是外设只需要一根天线和一个匹配网络不需要两个射频前端分开放置天线间距和隔离度的问题也就不存在了。共享天线的切换由芯片内部的RF switch完成切换时间在几微秒级别基本不影响协议时序。2.2 射频前端与天线设计要点硬件设计上天线和匹配电路是第一个容易翻车的点。这颗芯片的RF引脚输出的是差分信号需要经过一个差分转单端的匹配网络再接天线匹配网络通常会用到LC元件。这个匹配网络的目标阻抗是50欧姆元件的取值参考芯片参考设计给的值就行但要特别注意PCB走线。我实测中发现几个关键点从RF引脚到匹配网络的走线要尽量短而且要严格控制阻抗最好做50欧姆单端阻抗控制差分对要做100欧姆差分阻抗匹配网络的元件要靠近RF引脚摆放不要为了布线美观把元件拉得太远天线净空区一定要留够我踩过坑天线下方走了地线导致信号强度直接掉了8dBm如果参考设计用的是陶瓷天线要严格遵守数据手册里说的净空区域和铺设要求如果要用PCB天线建议第一次做板就在天线区域预留π型匹配焊盘方便后期调频偏天线匹配调不下来的时候用矢量网络分析仪看S11参数目标是在2.4GHz到2.5GHz整个频段内S11低于-10dB。如果没有网分也可以先用频谱仪看频谱发射功率再根据RSSI值间接判断匹配好坏但精度不高适合粗调。2.3 电源与低功耗设计这颗芯片集成了两套射频收发前端瞬态功耗比纯BLE芯片高不少。Wi-Fi发射时峰值电流可以达到300mA左右BLE发射时大约是20到40mA如果电源设计不够稳很容易出现Wi-Fi一发射就复位或者BLE连接断开的诡异问题。我在电源设计上用了这样的方案主供电用一颗3.3V LDO输入5V的USB或锂电池升压LDO的压降要留足建议选dropout voltage在300mV以内的LDO芯片的射频电源引脚一般是VDDA_RF、VDD_PA之类的引脚要单独加10uF陶瓷电容100nF陶瓷电容的组合而且要尽量靠近引脚放置如果做电池供电的便携设备建议用DC-DC加LDO的两级电源架构DC-DC负责降压LDO负责纹波抑制这样既保证效率又保证射频供电的纯净度还有一点经常被忽略芯片的电源引脚焊盘和PCB铺铜之间的过孔数量要够特别是在大电流路径上两个过孔根本不够用我用的是四个以上的过孔阵列低功耗方面芯片一般支持多种sleep模式Wi-Fi Modem Sleep、BLE Sleep、Deep Sleep、Power Off等。Modem Sleep模式一般是Wi-Fi和BLE都保持在可唤醒状态定时醒来收beacon或广播包Deep Sleep模式下电流可以做到几十微安级别但唤醒后需要应用重新初始化部分外设。实际项目里我一般是这么做的设备在空闲状态进入Modem Sleep通过BLE广播告诉手机“我还在线”需要上报数据时Wi-Fi才真正起来连路由器发完数据再回去睡觉。这样一个电池供电的传感器节点平均电流可以控制在几百微安级别。3. 开发环境与软件栈搭建3.1 SDK选型与开发环境准备软件部分不同厂商的SDK差异较大但整体思路接近。我用的这颗芯片官方提供了基于FreeRTOS的SDK集成好了Wi-Fi协议栈、BLE协议栈GAP/GATT、以及应用层示例代码。开发环境是基于GCC和Makefile的也可以导入到VS Code里。工具链搭建我按照官方文档来走安装交叉编译工具链也就是riscv32-unknown-elf-gcc系列的二进制工具下载SDK压缩包解压到工作目录配置SDK中的路径变量让编译脚本能找到工具链的位置执行make menuconfig或者编辑board.h配置芯片型号、主频、外设初始化参数编译官方示例工程验证工具链是否正常工作用调试器连接开发板烧录固件并确认运行日志正常输出这一步容易出问题的主要是工具链版本和SDK版本不匹配。建议直接使用官方SDK文档里指定的工具链版本不要用最新版GCC我试过用更新版GCC编译出现了一些很奇怪的编译告警虽然最终能跑但后续调试和SDK更新时容易出兼容性问题。调试方面一般开发板都带板载调试器支持OpenOCD和GDB。命令行调试用OpenOCDGDB日常开发用VS Code的Cortex-Debug插件可以设置断点、单步、看寄存器基本够用。RISC-V的调试体验跟ARM差别不大毕竟调试协议都是标准化的只是GDB的target名称换成了riscv32-unknown-elf-gdb这种。3.2 从点灯到跑通Wi-Fi配网SDK环境跑通之后我建议先做最简单的GPIO点灯确认基础外设没有问题然后再碰无线。点灯的目的是验证系统主频、时钟树、GPIO驱动、日志输出链路全部正常。点灯跑通后的下一步是Wi-Fi配网。SDK一般会有两种配网方式一是传统配网把SSID和密码编译进固件开机自动连接路由器。这种方式适合调试缺点是每次换网络都要重新编译烧录。二是BLE配网手机App通过BLE连接设备把Wi-Fi SSID和密码发过去设备接收后自动去连接路由器。这种方式才是真正发挥双无线方案优势的场景。我实现的流程是这样设备上电后BLE以GATT Server的角色广播广播包里带上设备名称和一个配网服务UUID手机App扫描到设备发起BLE连接App找到配网服务的特征值写入SSID和密码格式是JSON或简单的字符串拼接设备通过BLE收到配网信息后写入Flash保存设备保存完调用Wi-Fi连接API开始连接路由器连接成功后通过BLE通知App“配网成功”然后断开BLE连接或者保持连接这个流程里关键技术点是把Wi-Fi连接状态实时反馈给手机。我第一次做的时候没加状态反馈手机上只看到配网数据发出去了但不知道设备到底连上没有体验很不好。后来在配网服务的特征值里加了一个状态字段设备在Wi-Fi连接过程中上报“连接中”“成功”“密码错误”“找不到路由器”等状态手机端就能一步步提示用户了。这里补充一个实际经验Wi-Fi密码存在Flash里建议用简单的异或加密或者按SDK提供的安全存储API保存不要明文裸存不然产品被拆解后焊下Flash就能看到Wi-Fi密码这个在客户那里不太好交代。3.3 BLE通信链路搭建BLE协议栈部分SDK一般会封装好GAP和GATT的API你只需要理解几个核心概念就行GAP负责设备的广播、扫描、连接管理GATT负责连接建立后的数据业务通过Service和Characteristic的层级结构组织数据。对刚接触BLE的人来说我建议先跑通一个最简单的数据透传demo设备作为Peripheral手机作为Central建立连接后手机写一个Characteristic设备收到数据并把原样回写。这个demo跑通后你对BLE数据通路就有了直观理解。然后再去改Service的UUID、加密等级、MTU大小、连接参数这些细节。连接参数的设置是BLE开发里影响体验很关键的地方。默认的connection interval一般是30ms到50ms这个值决定了一次数据交互的延迟。如果做控制类设备需要把connection interval调到7.5ms到15ms延迟会改善很多但功耗也会相应上升。如果做数据采集类设备可以把interval调到100ms以上能显著省电。SDK里一般有对应的API可以设置要不就是在工程配置里定义。MTU大小也要注意。BLE 4.2以前默认MTU是23字节实际有效数据只有20字节。BLE 5.0普及后支持通过MTU Exchange把MTU扩展到247字节甚至更大一次能传的数据量就大多了。如果设备有OTA固件升级需求建议把MTU调大不然升级速度会让人崩溃。4. Wi-Fi与BLE共存的工程问题4.1 2.4GHz频段互相干扰的原因这是双无线方案里最值得聊的话题。Wi-Fi和BLE都工作在2.4GHz ISM频段而且Wi-Fi的信道是20MHz宽BLE的信道是2MHz宽。Wi-Fi信道1的中心频率是2412MHz覆盖2402到2422MHzBLE的40个信道里面有37个数据信道分布在2402到2480MHz之间广播信道是2402MHz、2426MHz、2480MHz这三个。可以看到BLE的2402MHz信道正好落在Wi-Fi信道1的覆盖范围内2426MHz落在Wi-Fi信道4到5之间2480MHz落在Wi-Fi信道11到13之间。也就是说只要Wi-Fi在工作BLE的某些信道一定会被Wi-Fi信号覆盖。如果两者同时收发射频前端就会收到两部分信号对BLE来说Wi-Fi就是一个强干扰源反之亦然。实际项目中最常见的问题设备连接着Wi-Fi高速传输数据时BLE的广播包或者响应包可能会丢失表现为手机扫描不到设备或者连接后马上断开。4.2 共存策略时分片和硬件协同针对这个干扰问题芯片层面的解决办法是时分复用机制核心思想是让Wi-Fi和BLE不要同时收发。这个机制通常有两种实现方式一种是纯软件层面的时分调度。SDK的协议栈会维护一个系统级的调度器Wi-Fi active的时候BLE的射频事件会被延后或者跳过BLE active的时候Wi-Fi的数据收发会被暂缓。这个方式实现简单但效率不高会损失一部分双工吞吐量。另一种是硬件协同机制。芯片的Wi-Fi和BLE基带共享同一个MAC调度器Wi-Fi和BLE的射频事件由硬件统一仲裁支持优先级抢占和动态时隙分配。比如BLE的广播事件优先级较高当BLE广播时间到了硬件会强制暂停Wi-Fi的传输等BLE广播完成后再恢复Wi-Fi。这是更高级的实现也是真正能发挥“单芯片集成”优势的机制。实测下来这种硬件协同机制对BLE连接稳定性的提升非常明显。我用同样的测试场景纯软件调度下BLE连接失败率大约是3%硬件协同下基本是零失败。4.3 实测数据与调优记录我在项目测试阶段专门做了一组共存场景的对比实验数据很有参考价值。测试环境是这样的设备放在路由器旁边约1米处手机作为BLE Central在距离设备2米处。Wi-Fi侧让设备持续向云平台上传数据带宽跑满BLE侧每200ms做一次连接事件每次更新一个Notify值。通过连续跑一小时来统计掉包率。结果是纯软件调度方案的BLE掉包率约1.8%主要表现为偶尔的connect event丢失硬件协同方案下掉包率约0.1%基本可以忽略。但注意Wi-Fi吞吐量在两种方案下有明显差异硬件协同方案下Wi-Fi吞吐量降低了约12%这是为了保障BLE实时性付出的代价。如果要进一步调优有几个方向调低BLE的connection intervalWi-Fi吞吐量会下降更多需要根据业务需求权衡用BLE的connection event prediction机制让Wi-Fi在BLE事件到来前主动让出信道减少BLE的重传在应用层做数据缓冲Wi-Fi传输大数据包时把BLE数据缓存在内存里避免同时收发调整Wi-Fi的DTIM interval让Wi-Fi在Modem Sleep期间把射频让给BLE根据我的实际经验如果设备的BLE业务只是低频率的状态同步比如每秒钟几个字节完全没必要追求极低的connection interval。把interval放宽到50ms级别对Wi-Fi吞吐量的影响可以控制在3%以内。5. 常见问题与排查技巧实录5.1 配网不上、老掉线的排查项目开发过程中我最常被问到的问题就是“Wi-Fi配不上网”和“老是掉线”。这类问题的排查思路是有固定路径的。第一步确认设备和路由器之间的物理层连接是否正常。看设备Wi-Fi驱动里的RSSI值如果低于-75dBm说明信号太弱检查天线的净空区、匹配网络、天线位置。如果天线设计没问题但信号依然弱考虑是不是板子上有金属结构遮挡了天线。第二步确认认证和加密参数配置是否正确。芯片SDK里一般要配置Wi-Fi的security type比如WPA2-PSK、WPA3-SAE。某些老路由器用的加密方式是WEP或者WPA不是WPA2很多新的Wi-Fi协议栈对这些旧加密方式支持不太完整会导致连接失败。第三步抓Wi-Fi驱动日志和协议栈日志。查看连接失败的中间状态是扫描不到路由器还是扫描到了但认证失败还是认证通过但DHCP拿不到IP。这三个阶段对应的日志关键字各不相同能快速定位问题。掉线问题也一样要区分是链路层掉线还是IP层掉线。如果是链路层掉线通常伴随“disconnect event”日志要检查是不是共存机制导致Wi-Fi长时间没有收发数据被路由器判定超时踢出了。如果是IP层掉线通常是DHCP租约到期或者路由器开启了AP隔离这种要在应用层做心跳保活机制处理。5.2 BLE连接不稳的排查BLE连接不稳定的排查我建议先从射频参数看起。首先看发射功率。SDK里BLE发射功率一般可以配置从-20dBm到10dBm不等。如果发射功率太低手机稍微离远一点就连接不上。但也不是越高越好——发射功率高了功耗跟着涨还可能因为射频前端非线性导致信号质量下降。我的做法是先用默认功率跑测试根据实际场景中的RSSI余量来调整。其次看BLE天线和Wi-Fi天线的隔离度。虽然是单天线共享方案但有些参考设计会支持双天线接口比如一个Wi-Fi天线一个BLE天线。如果是双天线方案两个天线之间的隔离度就很重要了距离太近或者朝向不好会互相耦合接收灵敏度会下降。然后是看连接参数。如果设置了非常激进的连接参数比如connection interval是7.5ms、slave latency是0BLE芯片就会进入高密度收发模式。如果射频环境稍有波动就可能导致连接事件被跳过一旦连续跳过几个事件连接就会超时断开。所以连接保活参数要留出足够余量一般设置slave latency为2到4能容忍连续几个连接事件丢失而不断开。最后是检查协议栈的错误计数器。SDK暴露了BLE协议栈的统计信息包括CRC错误、MIC错误、连接事件超次数等这些数据能直观反映无线链路质量。通过串口日志定期导出这些数据能帮助定位是环境干扰还是芯片本身的问题。5.3 实测心得和避坑清单最后分享几条这几个月实操下来比较有价值的体会。第一双无线方案的调试日志一定要早做分层。Wi-Fi日志、BLE日志、应用日志分别打不同前缀方便快速过滤。我一开始所有日志混在一起出了问题就像大海捞针后来把日志模块统一加上模块标记排查效率提升了一个数量级。第二RF相关的改动每次只改一个变量。调整匹配网络、天线摆放、电源滤波不要同时改好几处否则出了问题根本不知道是哪处改动导致的。每次改动后都要固定测试环境和测试步骤记录数据再做下一次改动。听起来笨但这是射频调试最靠谱的方法。第三电源质量对无线性能的影响经常被低估。我遇到过一种情况设备单独测Wi-Fi和BLE都正常但两个同时工作时偶尔复位。排查了很久最终发现是DC-DC的输出纹波在负载突变时超过了芯片的电源规格导致射频模块异常复位。换了一颗低纹波的LDO后问题彻底消失。第四OTA升级功能要早做不要放到最后才加。双无线方案的OTA要同时考虑Wi-Fi下载固件和BLE传输固件两条链路而且固件升级期间很可能需要暂停正常的业务通信。如果没有提前设计好升级过程中的设备状态管理很容易出现升级失败后设备变砖、还必须拆机烧录的尴尬情况。关于RISC-V MCU集成Wi-Fi和BLE这个话题我目前能分享的实操经验就是这些。这类芯片现在还处于快速迭代的阶段各家SDK的API设计、协议栈稳定性、调试工具完善度都在持续变化使用过程中一定要以官方最新文档为准。如果你正在评估类似方案建议先从一个具体的产品功能需求出发把Wi-Fi和BLE各自的通信模型梳理清楚再去对比不同芯片的实现方式会比自己盲目啃数据手册高效得多。
返回列表