ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

E104-BT02 BLE透传模块详解:从快速上手到驱动与电路设计

E104-BT02 BLE透传模块详解:从快速上手到驱动与电路设计 先说个真实感受我第一次把E104-BT02这块BLE蓝牙通信模块焊到转接板上时确实有种“模块这么小上手指日可待”的错觉。可真跑起来才发现麻烦根本不在这颗模块本身而在BLE协议栈、广播参数、GATT服务和MTU这些看不见的东西上。网上关于E104-BT02的资料其实不少但多数停留在“接线-发AT-透传”这一步再往深走就没人讲了。我这篇就把“5分钟上手”这件事拆开揉碎既说清楚哪些步骤真的能5分钟搞定也把那些快不了一一讲透顺便把我整理的这套开源电路和驱动代码的设计思路、踩坑记录也一并放出来。这块模块能做什么一句话说它就是一个低功耗蓝牙BLE透传桥单片机通过串口把数据交给它手机或PC端用BLE调试助手就能收反过来手机发下来的数据它通过串口送给单片机。典型场景包括传感器数据上报、仪表面板显示、遥控器类应用、设备配网甚至Modbus RTU的无线化改造。适合三类人看一是刚入门BLE想做个小项目的玩家二是被“扫描不到设备”“连上就断”这类问题折磨的嵌入式工程师三是正准备画板子集成BLE模块、但心里没底怎么处理天线区域和电源的硬件朋友。1. E104-BT02到底是一块什么样的模块1.1 硬件底子主控、射频和接口E104-BT02从公开资料看主控是nRF52832Cortex-M4F内核512KB Flash搭配64KB RAM支持BLE 5.0。这个配置放在低功耗模块里属于很能打的级别因为nRF52832本身支持2M PHY、多角色同时运行而且射频性能相对稳定接收灵敏度能到-96dBm左右。模块把晶振、电感、匹配网络、PCB天线全集成好了用户看到的只是几个引脚和一路串口。这和用ESP32自组BLE不同模块方案的目标是把射频链路黑盒化让你把注意力放在产品逻辑上。接口上E104-BT02一般引出VCC、GND、TXD、RXD、STATE、AUX、RST、SWDIO、SWCLK等引脚。VCC支持1.8V到3.6V我习惯用3.3V串口默认波特率通常是115200、8N1部分固件可以用AT指令改。STATE引脚在模块处于连接状态时会拉高或拉低这是做状态指示的关键信号。SWDIO和SWCLK是给nRF52832烧录用的如果你只想拿它当AT指令透传模块这两个引脚可以不接。有一点要明确E104-BT02本质上是“从机Peripheral”定位的透传模块它默认工作在广播-等待连接-透传的模式不支持主动去扫描其他设备。想做Central主机采集多个外设的得换E104-BT10或直接用nRF52832原厂方案。很多新手拿到模块后先问“我能不能让它去连别的传感器”这就是一开始角色定位没搞清楚。1.2 选型对比为什么选它而不是BT05、JDY-10市面上十几块钱的BLE模块非常多老牌的有BT05、JDY-08、JDY-10新的有E104-BT02、E104-BT01等。我整理了一张对比表方便你按项目需求选型。维度E104-BT02BT05CC2541JDY-08nRF51822BLE版本5.04.04.0/4.1主控nRF52832CC2541nRF51822最高透传吞吐较高可协商MTU至247低受20字节包局限较低广播/连接灵活性广播类型可配、支持2M PHY基本固定基本固定开发资料开放度开源电路驱动较好资料老但多一般典型价格区间中上低低选模块不能只看价格。BT05这类老模块虽然便宜BLE 4.0时代的设计思路是“低速小数据”做灯控、按键遥控可以但一旦遇到一包几十字节的数据、或者要求低延迟上报就非常吃力。JDY-08是nRF51822方案软件上有所改进但同样卡在BLE 4.x的旧框架里。E104-BT02最大的优势是固件默认就支持更灵活的广播参数和MTU协商配合nRF52832的硬件底子在透传速度上限上明显高出一截。顺带聊一下“蓝牙BR/BLE区别”这个经典问题。BR/EDR就是我们常说的经典蓝牙适合音频、文件传输这种持续高带宽场景代价是功耗和连接建立时间都偏大BLE走的是“广播-快速连接-短数据包”路线省电是核心诉求代价是单次吞吐有限。做传感器、遥控、仪表这类小数据交互BLE天然更合适。E104-BT02这类模块面世其实就是把BLE这一套复杂协议封装成了串口透传让你不用理解Link Layer细节也能用上BLE 5.0。2. 5分钟快速上手从拆封到手机收到第一条数据2.1 接线与供电先别急着怼单片机我能做到5分钟让一个新手把E104-BT02跑起来靠的就是先把模块放到USB转TTL工具上而不是直接焊到单片机。准备一个3.3V输出的USB转TTL比如CP2102、CH340小板把模块的VCC、GND、TXD、RXD对应接好注意是交叉连接模块TXD接USB转TTL的RXD模块RXD接USB转TTL的TXD。注意模块供电一定不能直接接5V。nRF52832正常工作范围是1.8V到3.6V超过就有烧毁风险。如果你手上的USB转TTL小板是5V供电的要先确认有没有3.3V输出引脚没有的话得单独加一颗LDO。接好线后打开串口助手选对COM口波特率设115200发送一个“AT”加回车换行。如果模块返回“OK”说明模块已经活了串口链路通。这一步是整个上手过程中最关键的验证点很多问题都能在这时候暴露线接错了、波特率不对、模块供电不稳、甚至是模块本身出厂测试模式没有复位都会导致没有任何应答。2.2 AT指令配置让模块按你的规则广播模块默认广播名一般是“EBYTE”或类似名称想改成自己的设备名需要发AT指令。我用的这套固件常用指令是这样的格式具体以你手中模块的手册为准AT // 测试串口通信 OK ATNAMEBLE-TEST // 设置广播名称 OK ATMAC? // 查询模块MAC地址 MACxxxxxxxxxxxx ATADVINTV100 // 设置广播间隔单位ms OK ATRST // 复位使配置生效 OK广播间隔这个参数要注意它直接决定设备被发现的速度和功耗。间隔越小手机扫描时越容易立刻看到设备但功耗会上升间隔太大比如1000ms手机会扫很久甚至漏掉广播。做产品时一般会做成“可发现模式用100ms快速广播连接成功后切到低功耗模式”E104-BT02的固件如果有相应AT指令就可以这样设计。广播类型也是新手容易忽略的点。BLE广播大体分为可连接非定向、可连接定向、不可连接非定向、可扫描非定向几类。透传模块通常用“可连接非定向广播”手机才能既发现它又发起连接。如果你只是想让别人扫描到但不能连接比如纯信标应用就可以把广播类型改成不可连接这样别人无法连上来。2.3 手机端调试助手连接、绑定、透传一次跑通模块配置好以后打开手机上的BLE调试助手扫描应该能看到刚才设置的设备名。点进去连接连接成功后调试助手会自动读出模块暴露的GATT服务。E104-BT02这类透传模块一般会有一个自定义服务里面包含两个特征值一个用于写数据手机发到模块一个用于通知模块发到手机。你先在APP的“写特征值”里发一个字符串比如“hello”再回到串口助手如果TXD线接对串口助手大概率能直接收到这串字符串。反过来在串口助手里发一包数据手机会从“通知/Notify”通道收到。到这里双向透传就通了5分钟确实够用。这里顺带说下“绑定(bond)”概念。手机连接模块时默认是“配对”或“不配对”状态如果你在调试助手里选择了“配对”并保存手机和模块会协商出一套长期密钥之后每次连接都不用重新配对这就是bond。但绑定也带来了一个经典坑模块恢复出厂设置后手机还留着旧密钥导致连接时认证失败。解决办法是在手机蓝牙设置里删除这个设备再重新扫描配对。3. 吃透BLE的几个关键概念写驱动时才能不懵3.1 广播与扫描设备之间怎么打招呼BLE里广播包的结构是有讲究的并不是随便往里塞字符串。传统广播数据最多31字节由若干个AD Structure组成每个AD Structure格式是“长度-类型-数据”。比如广播名就是类型0x09的AD厂商自定义数据用0xFF类型。E104-BT02这类透传模块通常把服务UUID和广播名放在广播包里手机扫描时能看到。你可能遇到过一种情况广播里明明有服务UUID但调试助手却识别不出来。这多半是广播类型配成了“不可扫描/不可连接”或者广播包太长被截断。BLE 5.0还引入了扩展广播可以让广播数据量更大、广播间隔更灵活但E104-BT02的应用大多用传统广播就够。3.2 连接、配对与绑定不只是“连上了”这么简单BLE连接过程说起来不复杂手机扫描到广播发起连接请求模块返回连接响应链路建立。但链路建立后真正影响体验的是连接参数。连接参数包括连接间隔、从机延迟、监督超时这三大件。连接间隔决定两个设备多久同步一次间隔越短实时性越好但功耗越高从机延迟允许从机跳过若干次同步换取省电监督超时是双方判断“链路断了”的阈值一般不能小于连接间隔和从机延迟的乘积。模块固件里通常有一套默认连接参数手机端也可以发起连接参数更新请求。做透传时如果发现数据延迟很大先查这三个参数不要一上来就怀疑模块坏了。配对和绑定是两个级别。配对是临时建立信任关系绑定是把这个信任关系持久化保存。E104-BT02这类模块默认往往不开启配对任何手机都能直接连。如果你的产品需要防误连可以开启配对并开启绑定但要提醒用户一旦换手机需要重新做一次配对否则旧绑定关系会干扰新设备的连接。3.3 GATT与MTU透传模块的“服务”“特征”“邮筒”BLE没有传统的“串口流”它把所有数据都组织成GATT服务和特征值。一个服务相当于一个文件柜特征值相当于文件柜里的抽屉。手机往特征值里写数据模块这边的串口就能收到模块串口收到的数据往通知特征值里发手机就能收到。透传模块的本质就是把人机交互简化成“往特征值里扔数据”。MTU这个词你肯定见过它和透传速度直接相关。BLE 4.0时代默认MTU是23字节扣掉ATT头一包实际数据最多20字节BLE 5.0同样默认23字节但支持在连接后协商更大的MTU比如247字节这样一包就能带200多个字节。很多驱动代码里写的“提高透传速率”核心操作之一就是把MTU拉大同时配合更短的连接间隔。E104-BT02的固件是否自动协商MTU取决于版本但通常它支持手机端发起的MTU请求。你在调试助手里连续多包发大块数据时如果速度上不去多半就是MTU还卡在23字节的老格局。4. 开源驱动代码怎么用以STM32 HAL库为例4.1 代码结构模块化驱动应该包含哪些文件我整理这套开源驱动时参考了社区里常见的做法尽量做到“换芯片也能用”。代码主要分成三层硬件抽象层、E104-BT02驱动层、应用示例层。硬件抽象层是串口和GPIO以及延时函数我用STM32 HAL库实现驱动层提供e104_bt02_init、e104_bt02_send、e104_bt02_set_event_handler等API应用层则是一个循环或RTOS任务里调用驱动。文件清单大致如下e104_bt02.h / e104_bt02.c模块核心驱动封装AT指令、启动广播、发送透传数据、接收回调。uart_port.c / uart_port.h串口底层我用DMA空闲中断做不定长接收。ring_buffer.c / ring_buffer.h环形缓冲区避免数据处理时堵塞中断。app_main.c示例拿到串口数据后原样回传同时周期播发一次RSSI。移植到别的MCU时只要把uart_port和gpio_port换掉驱动层基本不用动。这套设计思路对STM32、GD32、中微SC8F096BUZ这类带串口外设的MCU都适用只是底层接口差异。4.2 初始化与发送这几行代码是核心骨架下面这段是驱动初始化的核心骨架跑通“透传回环”就靠它e104_bt02_dev_t dev; void app_init(void) { uart_port_init(dev.uart, 115200); gpio_port_init(dev.state_io); e104_bt02_init(dev); e104_bt02_wait_ready(dev, 1000); e104_bt02_set_event_handler(dev, bt02_event_handler); e104_bt02_start_advertising(dev); } void bt02_event_handler(e104_bt02_event_t evt) { if (evt.type E104_BT02_EVT_DATA) { // 收到BLE端发来的数据放入业务队列 app_process_incoming_data(evt.data, evt.len); } else if (evt.type E104_BT02_EVT_CONNECTED) { // 连接建立可以点亮STATE指示灯或者停止低功耗 } }发送侧的代码相对简单但有一个细节串口发送时最好用DMA或者加锁避免主循环和中断同时写UART外设导致数据错乱。我用的方式是一个全局发送互斥标志发送期间不允许再发否则直接丢弃并返回忙。uint8_t tx_buf[256]; int e104_bt02_send(e104_bt02_dev_t *dev, const uint8_t *data, uint16_t len) { if (dev-uart_busy) return -1; dev-uart_busy 1; HAL_UART_Transmit_DMA(dev-uart_handle, (uint8_t*)data, len); return len; }接收侧用DMA空闲中断这样可以做到“不知道对方一帧发多少字节也能完整收到”比轮询固定长度buffer优雅很多。DMA配置成循环模式开启串口空闲中断一旦总线上出现一段时间空闲就意味着一个帧结束可以把DMA搬运到的数据交给上层。注意DMA接收的数据长度需要自己计算用“buffer总大小-剩余计数”这种方式HAL库里对应的是hdma_rx-Instance-NDTR。4.3 驱动里没写的隐藏细节UART时钟、中断优先级、缓冲区大小说实话公开的驱动代码最常缺的不是函数逻辑而是工程级配置。比如UART的时钟频率很多新手直接复用例程的配置但用的是外部晶振和内部RC导致波特率偏差很大模块不回AT。另外DMA中断优先级要高于普通串口中断否则高频数据时容易丢失中断事件。环形缓冲区大小如果只开128字节一次大包下发直接溢出数据被截断表现为“模块收到的数据总是不完整”。建议缓冲区开到512字节以上和MTU协商后的最大包匹配。4.4 一个马上能用的案例把接收数据实时显示到数码管很多人学驱动只学透传觉得不过瘾这里给一个组合玩法E104-BT02收到手机下发的数字字符串后通过驱动解析成数值再送到0.36寸3位数码管模块显示。数码管我用的是TM1650驱动芯片两线IIC通信代码量很小。手机端发个“123”数码管就显示123这个“蓝牙数字显示器”看似简单却覆盖了串口接收、数据结构解析、外设驱动三个技能点。OLED显示RSSI也一样用HAL库驱动OLED把连接后的RSSI值定期刷上去调试天线位置、测试传输距离时非常直观。社区里还有不少进阶组合用LIS2DW12这类加速度传感器通过E104-BT02上报姿态数据用SST25VF080B这类SPI Flash存日志并通过BLE导出原理都是把传感器/存储IC的驱动结果往透传通道里喂。驱动代码的质量关键在于“送给BLE的数据是结构化而准确地”不要直接往串口扔零散字节最好在上层做一层协议帧封装。5. 开源电路设计里的几个关键细节5.1 供电电路低功耗模块最怕电源纹波E104-BT02虽然内部有LDO但它对外部电源的纹波和瞬态响应仍有一定要求。尤其是射频发射瞬间电流会突然拉高如果电源路径阻抗太大电压跌落严重模块就会出现“能发广播但一连接就复位”的诡异现象。我在开源电路里加的是一颗XC6206P332MR3.3V输出输入侧和输出侧各放一颗10uF和100nF电容且电容都紧靠引脚放置。如果直接用电池供电建议在VCC入口串一颗磁珠再加π型滤波能明显减少射频噪声对电源的干扰。如果是主板上已有3.3V也要尽量避免从数字电路远端拉线给模块供电最好单独布线模拟和射频电路布线尽量短粗。5.2 天线周围净空最容易被“看不见”的问题坑到E104-BT02用的是PCB天线天线区域上方必须留出净空区。这句话翻译成人话就是天线的投影区域内不要铺铜、不要走线、不要放螺丝柱和金属外壳。不少工程师画板时习惯铺大块地铜结果模块的射频性能一塌糊涂表现为距离近、掉线频繁。原因就是地铜和天线之间形成寄生电容把辐射能量吸收掉了。PCB天线正下方对应到正面一般会标注天线区域印丝设计转接板或底板时这个区域正反面都不要覆铜。如果板子空间紧张模块尽量靠板边放置天线延伸到板外是最好的。外壳如果用金属材质更要谨慎天线方向要朝向非金属开窗位置。5.3 电平匹配别让5V单片机把模块送走模块串口是1.8V到3.6V电平如果你的MCU是5V供电TXD输出高电平5V直接接到模块RXD会超出模块IO耐压长期使用轻则通信不稳定重则烧毁。处理方式很简单单向电平转换芯片比如TXS0108E/SN74LVC1T45或者电阻分压。如果MCU是STM32F103这类3.3V单片机直接连就行不需要额外转换。STATE引脚建议接一个LED和限流电阻直观显示连接状态调试时非常有用。另外模块的RST引脚可以接一颗10k上拉电阻并留一个测试点或按键位置方便异常时手动复位。SWDIO和SWCLK虽然正常运行时不用但建议引出一排2.54mm针以备固件升级和调试。5.4 开源电路的层级评估板、最小系统板、集成到产品我整理的电路开源文件分三个版本一个是纯评估板就是把E104-BT02管脚引出外加USB转串口直接插电脑调AT第二个是最小系统板板上多了一个STM32G030F6P6MCU通过串口接E104-BT02预留按键和数码管接口第三个是集成到产品主板的参考设计包含完整电源、ESD防护、天线净空区开槽。你做产品时可以直接参考第三个版本裁剪不需要从零画起。ESD防护很多人会漏BLE模块是暴露在外的尤其做手持设备人体静电容易从天线端耦合进来。在USB口、按钮、电池触点上预留ESD二极管比如LESD5D5.0CT1G即使量产时没贴也给自己留了返修余地。6. 我踩过的坑扫描不到、老是断开、透传速度上不去6.1 扫描不到设备别急着怀疑模块这个问题的排查顺序非常重要。第一步先确认模块是否正常进入广播模式串口发ATADVON1或者复位指令观察电流变化第二步看供电电压是不是正确、有没有跌落最好用万用表量模块VCC第三步查天线区域有没有金属或大面积地铜第四步换一个调试助手我遇到过某个版本的APP在Android 13上扫描缓存异常换nRF Connect马上就好。还有一个隐蔽原因模块广播间隔设置过长。如果你把广播间隔改成2000ms手机扫描可能刚好错过表现就是“偶尔能扫到大多时候扫不到”。调试阶段把广播间隔设在100ms左右最稳。6.2 连接后频繁断开连接参数和天线是两大元凶连接后频繁断开的案例我手里修过几个原因通常有三类。第一类是连接参数太激进手机端发起的连接间隔小于模块固件支持的最小值模块拒绝后链路质量差。第二类是天线环境恶劣透传模块在金属机箱内信号被屏蔽表现为连接后几秒到几十秒随机掉线。第三类是供电瞬间跌落尤其在电池快没电时射频一发射电压就掉到模块最低工作电压以下。排查方法很简单连接后观察STATE引脚状态和电流波形看断开瞬间是模块先掉电还是先断链。如果模块掉电查电源如果电源稳定但断链查距离、天线和连接参数。别一上来就刷固件浪费一天时间。6.3 透传速度上不去MTU、连接间隔、串口波特率串一串按我的实测E104-BT02做透传如果把MTU协商到247、连接间隔调到15ms左右单方向实际吞吐能到十几KB/s甚至更高但如果保持默认MTU 23、连接间隔30ms以上吞吐可能就只有每秒几百字节差距非常明显。所以透传速度上不去时先查三处排查点检查方式常见问题MTU调试助手里看协商后MTU仍为23需手动请求大MTU连接间隔看链路层连接参数默认过大延缓了数据发送串口波特率确认模块UART和MCU侧一致115200波特率下串口本身也有瓶颈实测下来串口波特率115200时串口最快约11.5KB/s这本身就封死了透传上限如果BLE侧已经协商出高吞吐但串口还在9600瓶颈就在串口。想榨干模块建议把串口波特率提到460800或更高同时确保模块固件支持。注意驱动代码里的环形缓冲区和DMA配置也要跟着调否则高速串口数据会频繁丢帧。6.4 绑定(bond)导致的重连失败模块和手机各留一份密钥这是“连接故障”里最典型的软件坑。你之前用BLE调试助手绑定了模块后面模块恢复了出厂或者刷了另一套固件链路层随机地址变化手机端还留着旧绑定信息。重新连接时手机试图用旧密钥加密模块这边根本没有对应密钥认证失败就会不断重连然后断开。查这个问题要做的只有一件事手机蓝牙设置里删除这个设备再重新扫描、重新配对。如果产品里用户经常遇到最好提供一个“长按按键清除模块绑定信息并恢复出厂”的隐藏指令。WCH的BLE Central方案里也有类似坑Central设备本地缓存了从机的绑定信息从机侧换固件后不匹配导致连接失败。解决思路就是绑定信息要有版本管理模块恢复出厂时Central端同步清理。7. 进阶玩法把E104-BT02用出更多花活7.1 Modbus RTU over BLE工业采集的无线化Modbus RTU是工业现场最常见的总线协议之一本质就是一问一答的串口帧。E104-BT02既然能透传串口理论上上位机可以通过BLE连模块模块再通过串口接Modbus从机实现无线Modbus访问。实际做的时候要留意Modbus对超时时间很敏感主机等待从机应答的定时一般也就几十到几百毫秒BLE链路本身的连接间隔、从机延迟、空中传输时间都会叠加进去。所以要把串口波特率提高、连接间隔调短、从机地址不要太多否则一帧Modbus请求发下去BLE还没送到从机主机那边已经超时报错了。我也试过用E104-BT02替代手机和仪表之间的有线连接仪表端接一个模块手机端用调试助手或自研APP连接读仪表寄存器数据。这种场景只要把MTU和连接间隔调好体验已经接近低波特率串口直连。7.2 BLE配网给ESP32-S3这类Wi-Fi设备带路很多IoT设备没有屏幕没有键盘怎么把Wi-Fi SSID和密码告诉它经典方案就是BLE配网。ESP32-S3本身自带BLE但如果产品里Wi-Fi模块和主控分离或者你想让BLE和Wi-Fi彻底解耦完全可以用E104-BT02负责配网信道设备上电后进入配网模式E104-BT02开启广播手机连接后通过透传通道发送Wi-Fi SSID和密码MCU收到后写入Flash然后关闭E104-BT02的广播主控去连接Wi-Fi。这里有个经验配网阶段的BLE广播名要带上产品身份信息比如前缀MAC后6位方便用户在APP里精确查找避免同型号多台设备时认错。配网完成后的数据要加校验和BLE透传虽然底层有重传机制但业务层最好还是做一次完整性校验毕竟“偶尔丢一字节”在真实空间里确实存在。7.3 数字钥匙、防丢器、门禁原型验证真香“BLE数字钥匙”是这几年很热的方向手机当车钥匙、门禁卡用。这类产品对安全要求极高涉及CCC规范、安全芯片、复杂交互场景量产时不会直接用透传模块裸跑。但做原型验证时E104-BT02依旧非常好用主控这边接一个低功耗传感器模块负责广播和连接先把“手机靠近-自动解锁-手机离开-上锁”这套交互逻辑跑通再去替换成安全方案。原型阶段便宜的模块损坏了也不心疼这在产品开发早期非常值。社区里还有人把E104-BT02接到中微SC8F096BUZ这类国产MCU上做低成本智能灯、电子价签、医疗穿戴小设备架构几乎都是“MCU采集数据 E104-BT02透传/广播 手机APP”。SC8F096BUZ这类MCU资源有限BLE协议栈跑不动完整功能但配合E104-BT02这样把协议栈封装好的模块产品依然能做得很轻盈。写在最后的个人体会我调试BLE模块越多越觉得它和普通串口模块最大的区别不在硬件而在视角。普通串口模块你只要把电平搞对、波特率设对数据流就通了BLE不一样你还要面对广播、扫描、连接参数、GATT、MTU、绑定关系这一套看不见的逻辑。好在E104-BT02这类模块把底层大部分复杂度封住了剩下的工作与其说是在写代码不如说是在“理解链路”。最后分享一个我自己的习惯拿到任何BLE模块我不会急着接单片机而是先把它放到USB转TTL上用手机把广播、连接、透传、绑定全过一遍确认自己对这个模块的“脾气”有手感了再开始写驱动。很多项目卡壳就是因为跳过了这一层直接写代码最后不得不回头查硬件。希望这套开源电路和驱动代码能帮你少走一点弯路先把链路跑通再谈产品优化。
返回列表