拿到 Ra-20 或 Ra-11 模组之后,第一个问题通常是:怎么让它跑起来?
本文以 STM32F103CBT6 开发板为例,用 Semtech RAC(Radio Access Controller)驱动 LR2021/LR1121 射频芯片,实现两块板子的 Ping-Pong 双向通信,一块做 Manager 主动发送 PING、一块做 Subordinate 监听并回复 PONG,每 250ms 完成一次往返。
这是 Ra-20/Ra-11 最基础的通信验证流程。跑通这个示例,说明硬件接线、SPI 驱动、射频初始化链路全部正常,可以作为后续二次开发的起点。
01两块板子,一发一收,每 250ms 完成一轮 Ping-Pong
本示例演示在 STM32F103CBT6 开发板上,使用 Semtech RAC 驱动 LR2021(Ra-20)或 LR1121(Ra-11)射频芯片实现 LoRa 双向通信。
角色分工:
| 角色 | 行为 | 启动标志 |
| Manager(主控端) | 启动后立即发送 PING,收到 PONG 后计数器 +1,250ms 后发送下一轮 | 默认 |
| Subordinate(从属端) | 仅监听,收到 PING 后立即回复 PONG | PING_PONG_START_AS_SUBORDINATE=1 |
02先搭好编译环境,ARM 工具链 + CMake + Ninja
以下以 Ubuntu / Debian / WSL2 为例。Windows 用户建议使用 WSL2 并参考相同命令。
克隆仓库:
|
git clone https://github.com/Ai-Thinker-Open/ra11-ra20.git Ra-20_Ra-11 cd Ra-20_Ra-11 git submodule update --init --recursive |
安装编译工具链:
|
sudo apt update sudo apt install -y gcc-arm-none-eabi binutils-arm-none-eabi gdb-multiarch sudo apt install -y cmake ninja-build sudo apt install -y stlink-tools sudo apt install -y python3 python3-pip pip3 install --user pyserial sudo apt install -y git |
验证安装:
|
arm-none-eabi-gcc --version cmake --version # 要求 ≥ 3.16 ninja --version st-info --version python3 -c "import serial; print('pyserial OK')" |
如果 arm-none-eabi-gcc 不在默认 PATH 中,导出工具链目录:
|
export ARM_GNU_BIN=/usr/bin # 或 export ARM_GNU_BIN=/opt/gcc-arm-none-eabi-10/bin |
建议将上述 export 加入 ~/.bashrc,避免每次手动设置。
03一条命令编译,Ra-20 和 Ra-11 的区别只在一个参数
推荐编译命令(Ra-11 + Legacy EVK 引脚定义):
|
rm -Rf build/ ; cmake -L -S examples -B build -DCMAKE_BUILD_TYPE=MinSizeRel -DLEGACY_EVK_LR20XX=true -DBOARD=STM32F103CB -DRAC_RADIO=lr1121 -G Ninja ; cmake --build build --target ping_pong |
不同芯片的编译参数对照:
| 芯片 | RAC_RADIO 参数 | 额外参数 | 说明 |
| Ra-20 | -DRAC_RADIO=lr2021 | -DLEGACY_EVK_LR20XX=true | LR2021,老版 EVK 引脚定义 |
| Ra-11 | -DRAC_RADIO=lr1121 | — | LR1121,标准 LR11xx 引脚 |
| STM32F103CB | -DBOARD=STM32F103CB | — | 使用 STM32F103CB HAL |
编译成功后在 build/ 目录下生成 ping_pong.elf、ping_pong.hex、ping_pong.bin 三个文件。
04六根 SPI 线 + 三根控制线,照着这张表接就不会错
STM32F103CBT6 与射频芯片的接线关系。以下所有引脚 Ra-20 和 Ra-11 通用:
| STM32 引脚 | 射频芯片引脚 | 功能 | 备注 |
| PA4 | NSS / CS | SPI 片选 | — |
| PA5 | SCK | SPI 时钟 | — |
| PA6 | MISO | SPI MISO | — |
| PA7 | MOSI | SPI MOSI | — |
| PB14 | NRST | 射频复位 | 低电平有效 |
| PB1 | DIO1 / DIOX | 射频中断 | 上升沿触发 |
| PA0 | BUSY | 射频忙信号 | LR11xx / LR20xx |
| PA8 | — | LED_TX | 发送时亮 |
| PB15 | — | LED_RX | 接收时亮 |
| PA9 | — | UART_TX | 调试串口 115200 8N1 |
| PA10 | — | UART_RX | 调试串口 |
Ra-20 额外注意事项:编译时需加 -DLEGACY_EVK_LR20XX=true,DIOX 固定使用 PB9。
Ra-11:核心 SPI 与控制引脚与上表相同;当 RAC_RADIO=lr1121 时,天线切换与 LNA 控制由驱动自动处理。
电源建议:MCU 与射频共用 3.3V 供电,靠近每个 VDD 引脚放置 100nF + 10μF 去耦电容,这一点对射频稳定性很关键。
05烧录固件,两块板子跑起来看日志
使用 st-flash 烧录:
|
st-flash --serial |
或使用 STM32_Programmer_CLI:
|
STM32_Programmer_CLI -c port=SWD sn= |
Manager 端编译(默认,启动后立即发送 PING):
| cmake ... -DPING_PONG_START_AS_SUBORDINATE=0 |
Subordinate 端编译(仅监听,收到 PING 后回复 PONG):
| cmake ... -DPING_PONG_START_AS_SUBORDINATE=1 |
Manager 端正常运行日志应如下(计数器不断递增):
|
INFO: smtc_rac_init INFO: USP/RAC Version: 1.0.0 ... INFO: starting ping-pong as manager INFO: sending (value=0, delay=0ms) INFO: usp/rac: transaction is starting INFO: usp/rac: new event: transaction (transmission) has ended (success) INFO: receiving... INFO: usp/rac: transaction is starting INFO: usp/rac: new event: transaction (reception) has ended (success) INFO: payload is correct, continuing INFO: sending (value=1, delay=250ms) ... |
运行表现:TX/RX LED 每轮通信闪烁一次;每 250ms 完成一次往返;不会出现重复的 smtc_rac_init 或看门狗复位。
06三个最容易踩的坑,都帮你填好了
| 故障现象 | 原因 | 解决 |
| 反复出现 smtc_rac_init / 看门狗复位 | DIO 引脚在回调注册前就配置了中断,或主循环存在过长延时 | 本仓库已修复,确认使用最新代码 |
| TX done 回调不触发 | ping_pong target 定义了 ENABLE_PERIODIC_UPLINK,与 ping-pong 事务冲突 | 编译时确保未定义该宏 |
| 射频类型不匹配 | 编译参数中的 RAC_RADIO 与实际芯片不一致 | Ra-20 用 -DRAC_RADIO=lr2021,Ra-11 用 lr1121 |
最后的话
这个 Ping-Pong 示例是 Ra-20/Ra-11 开发的最小闭环。
它验证了五件事:SPI 驱动正确、射频初始化成功、RAC 协议栈跑通、双板收发正常、日志系统可用。跑通这个示例之后,你可以在 Manager 端替换 payload 内容,加入自己的传感器数据,把 Ping-Pong 升级为实际业务通信。
整个代码仓库已经托管在 GitHub(Ai-Thinker-Open/ra11-ra20),包含完整的 HAL 适配和 RAC 驱动,开箱即用。
全部0条评论
快来发表一下你的评论吧 !