跳到主要内容

Raspberry Pi Pico 使用

本章节包含以下部分,请按需阅读:

配置开发环境

1. 安装和配置

硬件连接

参考下表进行连接

Core2021-XFRaspberry Pi Pico/Pico2
CLK10
MISO11
MOSI12
CS13
DIO1115
RESET5
BUSY14

示例程序

  • Raspberry Pi Pico 示例程序位于 示例程序包core2021-xf\examples\pico 目录中。
  • 示例 01,02,03 都需要两个 Core2021-XF 模块,一个发送,一个接收。
示例程序基础例程说明依赖库
01_lr2021_txLR2021 发送RadioLib
02_lr2021_rxLR2021 接收RadioLib
03_lr2021_pingpongLR2021 PingPongRadioLib
04_lr2021_tx_cwLR2021 以 CW 模式发送RadioLib
05_lr2021_LoRaWANLoRaWANRadioLib

示例 Arduino Pico 程序

  • 进入到 core2021-xf\examples\pico\arduino,选择需要测试的示例程序

  • 选择好芯片型号跟端口

    Arduino Pico 2
  • 上传完成后,打开串口监测器,就会输出相关的信息

01_lr2021_tx_arduino

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,使用 中断方式 实现 LoRa 数据包周期性发送
  • 使用 Pico/Pico2 硬件 SPI1 端口,自定义 SPI 引脚映射
  • 采用非阻塞发送机制,不占用主循环 CPU 资源
  • 每发送完成一包数据,自动延时 1 秒后继续发送下一包
  • 支持字符串数据发送,自带数据包序号,方便调试

【代码分析】

  • SPI1.setSCK / setRX / setTX:RP2040 硬件 SPI1 引脚重新映射
  • SPI1.begin():启动树莓派 Pico 硬件 SPI1
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证频率精度
  • setFlag(void):中断回调函数,模块发送完成后自动触发,标记发送完成标志
  • radio.setPacketSentAction(setFlag):绑定发送完成中断函数
  • radio.startTransmit("内容"):启动 LoRa 异步发送,支持字符串 / 字节数组
  • radio.finishTransmit():发送完成后收尾操作,关闭发射电路、复位模块状态
  • loop() 主逻辑:检测发送完成标志 → 打印状态 → 延时 → 发送下一包带序号的数据

【运行效果】

  • 程序编译下载完成,打开串口监控可以看到打印发送完成的日志,如下图所示(搭配02_lr2021_rx):

02_lr2021_rx_arduino

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,使用中断方式实现 LoRa 数据包无线接收
  • 使用 Pico/Pico2 硬件 SPI1 端口,支持自定义引脚映射
  • 采用非阻塞监听模式,模块自动等待数据,不占用 CPU 资源
  • 接收成功后自动解析数据,并打印数据包内容、RSSI 信号强度、SNR 信噪比
  • 必须与发送端配置相同频率、扩频因子、带宽、编码率才能正常通信

【代码分析】

  • SPI1.setSCK / setRX / setTX:RP2040 硬件 SPI1 引脚重新映射配置
  • SPI1.begin():初始化树莓派 Pico 硬件 SPI1 总线
  • radio.irqDioNum = 11:配置 LR2021 模块中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证频率精度,提升接收稳定性
  • setFlag(void):中断回调函数,模块接收到完整数据包后自动触发
  • radio.setPacketReceivedAction(setFlag):绑定接收完成中断服务函数
  • radio.startReceive():启动 LoRa 连续接收模式,进入等待数据状态
  • radio.readData(str):读取接收到的无线数据,支持字符串格式解析
  • radio.getRSSI() / radio.getSNR():获取信号质量参数,用于调试与链路评估
  • loop() 主逻辑:检测接收完成标志 → 读取数据 → 解析打印 → 继续监听

【运行效果】

  • 程序编译下载完成,打开串口监控可以看到实时接收日志,包含数据内容、RSSI、SNR 信息,如下图所示(搭配01_lr2021_tx):

03_lr2021_pingpong

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRa 自动乒乓收发(一问一答)双向通信
  • 使用 Pico/Pico2 硬件 SPI1 端口,支持任意引脚映射
  • 两块模块即可完成互发互收,无需手动控制
  • 开启 INITIATING_NODE 为发起端,另一块为接收端
  • 自动切换发送 / 接收状态,非阻塞中断驱动

【代码分析】

  • SPI1.setSCK / setRX / setTX:树莓派 Pico SPI1 引脚重映射
  • SPI1.begin():初始化硬件 SPI1 总线
  • radio.irqDioNum = 11:配置 LR2021 中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证通信频率精度
  • setFlag(void):通用中断回调,发送完成或接收完成都会触发
  • radio.setIrqAction(setFlag):绑定收发共用中断函数
  • INITIATING_NODE 宏定义:用于区分主动发起节点
  • radio.startTransmit():启动数据包发送
  • radio.startReceive():切换模块到监听接收状态
  • radio.readData(str):读取接收到的 LoRa 数据包
  • loop() 主逻辑:发送完成 → 进入接收;接收完成 → 延时回复 → 再次发送

【运行效果】

  • 两块模块分别烧录程序,一块打开 INITIATING_NODE 宏定义
  • 上电后自动互发互收,串口打印收发状态、数据、RSSI、SNR,如下图所示:

04_lr2021_tx_cw

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRa 直接载波发射(CW/Direct Transmit)
  • 使用 Pico/Pico2 硬件 SPI1 端口,支持任意引脚映射
  • 输出固定频率的连续载波信号,无数据包格式,用于频段测试、信号检测、仪器校准
  • 固定频率 868MHz,发射功率 22dBm
  • 上电后持续发射,无额外逻辑操作

【代码分析】

  • SPI1.setSCK / setRX / setTX:树莓派 Pico SPI1 引脚重映射配置
  • SPI1.begin():初始化硬件 SPI1 总线
  • radio.XTAL = true:开启外部晶振,保证载波频率精度
  • OUT_HZ 868000000UL:定义直接发射频率(868MHz),可自行修改
  • radio.setOutputPower(22):配置发射功率为 22dBm
  • radio.transmitDirect(OUT_HZ):进入连续直接发射模式,输出固定频率载波
  • loop():无业务逻辑,载波持续发射无需程序干预

【运行效果】

  • 程序烧录后模块立即输出固定频率载波信号

  • 串口打印初始化与发射启动状态,可使用频谱仪/接收模块检测到连续射频信号,如下图所示:

05_lr2021_LoRaWAN

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRaWAN OTAA 入网与上下行通信
  • 使用 EEPROM 仿真存储 保存会话信息,掉电重启可快速恢复连接
  • 自定义 SPI1 引脚映射,完全适配 Pico/Pico2 硬件设计
  • 定时发送上行数据(默认 5 分钟),自动接收服务器下行消息
  • 支持数据 HEX/ASCII 格式打印,便于调试与链路验证

【代码分析】

  • SPI1.setSCK/setRX/setTX:RP2040 硬件 SPI1 引脚重映射配置
  • SPI1.begin():初始化树莓派 Pico 硬件 SPI1 总线
  • radio.irqDioNum = 11:配置 LR2021 中断映射引脚,必须在初始化前设置
  • radio.XTAL = true:开启外部晶振,保证 LoRaWAN 频点精度
  • EEPROM.begin(256):初始化 RP2040 片上 Flash 模拟 EEPROM
  • restoreLoRaWANState():从 EEPROM 恢复会话信息,实现快速重连
  • node.beginOTAA()/activateOTAA():OTAA 入网相关关键函数
  • saveLoRaWANState():入网成功后保存会话信息到 EEPROM
  • node.sendReceive():发送上行数据并自动监听下行
  • printHex/printAscii:格式化打印下行数据

【运行效果】

  • 烧录程序后自动完成 OTAA 接入,周期性上报数据并接收下行

  • 串口实时打印入网状态、上下行数据、信号质量等信息,如下图所示:

示例 C/C++ 程序

  • 进入到 core2021-xf\examples\pico\c,选择需要测试的示例程序

  • 选择好芯片型号跟端口

    Arduino Pico 2
  • 上传完成后,打开串口监测器,就会输出相关的信息

01_lr2021_tx

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,使用 非 Arduino 环境 直接在 Pico 上运行 RadioLib 库
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 配置 LR2021 模块引脚:
    • NSS=13、IRQ(DIO0)=15、RESET=5、BUSY=14
  • 支持中断回调机制,在数据包发送完成后自动触发回调标记发送状态
  • 采用非阻塞发送,主循环可以不断检测发送完成标志,进行后续操作
  • 支持 C 字符串或字节数组数据发送,长度可达 256 字节
  • 可连续发送带序号的数据包,便于调试

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • radio.irqDioNum = 11:配置中断映射引脚
  • radio.XTAL = true:开启外部晶振,提高频率精度
  • radio.begin():初始化模块,返回错误码
  • radio.setPacketSentAction(setFlag):绑定发送完成回调函数 setFlag()
  • radio.setFrequency(868.0)setOutputPower(22)setBandwidth(125.0)setSpreadingFactor(7)setCodingRate(5)setSyncWord(...)setPreambleLength(8):配置 LoRa 参数
  • radio.startTransmit("Hello World!"):启动第一次数据包发送
  • setFlag():发送完成后设置 transmittedFlag = true,用于主循环检测
  • 主循环 for(;;)
    1. 检测 transmittedFlag
    2. 发送成功或失败打印状态
    3. 调用 radio.finishTransmit() 做发送收尾操作
    4. 延时 1 秒
    5. 构建带序号的新数据包继续发送

【运行效果】

  • 程序启动后在串口打印初始化状态(搭配02_lr2021_rx):

02_lr2021_rx

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,使用 非 Arduino 环境 直接在 Pico 上运行 RadioLib 库接收数据
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 配置 LR2021 模块引脚:
    • NSS=13、IRQ(DIO0)=15、RESET=5、BUSY=14
  • 支持中断回调机制,在数据包接收完成后自动触发回调标记接收状态
  • 支持连续监听模式,可自动重新进入接收状态
  • 接收的数据既可以 HEX 格式打印,也可作为字符串输出

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • radio.irqDioNum = 11:配置中断映射引脚
  • radio.XTAL = true:开启外部晶振,提高频率精度
  • radio.begin():初始化模块,返回错误码
  • radio.setPacketSentAction(setFlag):绑定发送完成回调函数 setFlag()
  • radio.setFrequency(868.0)setOutputPower(22)setBandwidth(125.0)setSpreadingFactor(7)setCodingRate(5)setSyncWord(...)setPreambleLength(8):配置 LoRa 参数
  • radio.startReceive():启动接收模式,进入监听状态
  • setFlag():接收完成后设置 receivedFlag = true,用于主循环检测
  • 主循环 for(;;)
    1. 检测 receivedFlag
    2. 读取数据包长度 radio.getPacketLength() 并调用 radio.readData(rxBuf, len)
    3. 根据返回状态打印:
      • 成功:数据长度、RSSI、SNR、HEX 格式、字符串内容
      • CRC 错误:提示 CRC 错误
      • 其他错误:打印错误码
    4. 自动重新进入接收状态 radio.startReceive()
    5. 延时 10 ms 避免 CPU 占用过高

【运行效果】

  • 程序启动后在串口打印初始化状态:(搭配01_lr2021_tx):

03_lr2021_pingpong

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRa 自动乒乓收发(一问一答)双向通信
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 配置 LR2021 模块引脚:
    • NSS=13、IRQ(DIO0)=15、RESET=5、BUSY=14
  • 支持中断回调机制,在发送或接收完成后自动触发
  • 自动切换发送 / 接收状态,无需手动干预
  • 初次发送由 #define INITIATING_NODE 宏控制,另一块模块自动进入接收模式
  • 支持连续发送和接收字符串数据,并打印 RSSI / SNR

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • radio.irqDioNum = 11:配置中断映射引脚
  • radio.XTAL = true:开启外部晶振,提高频率精度
  • radio.begin():初始化模块,返回错误码
  • radio.setPacketSentAction(setFlag):绑定发送 / 接收完成回调函数
  • INITIATING_NODE 决定当前节点是否先发送数据
  • 主循环 for(;;)
    1. 检测 operationDone 标志
    2. 如果是发送完成:
      • 打印发送状态
      • 切换到接收模式 radio.startReceive()
    3. 如果是接收完成:
      • 读取数据包 radio.readData(rxBuffer, rxLen)
      • 打印接收到的字符串、RSSI、SNR
      • 延时 1 秒后再次发送数据
    4. 每次循环结束延时 5 ms 避免 CPU 占用过高

【运行效果】

  • 两块模块分别烧录,一块定义 INITIATING_NODE
  • 上电后模块自动互发互收:

04_lr2021_tx_cw

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRa 直接载波发射(CW/Direct Transmit)
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 配置 LR2021 模块引脚:
    • NSS=13、IRQ(DIO0)=15、RESET=5、BUSY=14
  • 输出固定频率的连续载波信号,无数据包格式,用于频段测试、信号检测、仪器校准
  • 固定频率 868 MHz,发射功率 22 dBm
  • 上电后模块持续发射,无需额外逻辑干预

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • radio.irqDioNum = 11:配置中断映射引脚
  • radio.XTAL = true:开启外部晶振,提高频率精度
  • radio.begin():初始化模块,返回错误码
  • radio.setOutputPower(22):设置发射功率为 22 dBm
  • radio.transmitDirect(OUT_HZ):进入 连续直接发射模式,输出固定频率载波
  • 主循环无业务逻辑,载波持续发射无需程序干预

【运行效果】

  • 程序烧录后模块立即输出固定频率载波信号

  • 串口打印初始化与发射启动状态,可使用频谱仪/接收模块检测到连续射频信号,如下图所示:

05_lr2021_LoRaWAN

【程序说明】

  • 基于 树莓派 Pico + Core2021-XF 模块,实现 LoRaWAN OTAA 入网与上下行通信
  • 使用 硬件 SPI1 端口 并自定义 SPI 引脚(SCK=10, MOSI=11, MISO=12)
  • 支持 EEPROM 仿真存储,掉电重启可快速恢复会话信息
  • 定时发送上行数据(随机 3 字节 payload,默认周期 uplinkIntervalSeconds)
  • 自动接收服务器下行消息,打印数据 HEX/ASCII
  • 支持连续上下行,自动保存 LoRaWAN 会话状态,防止 DevNonce 重复

【代码分析】

  • PicoHal* hal = new PicoHal(SPI_PORT, SPI_MISO, SPI_MOSI, SPI_SCK):创建 Pico 硬件抽象层实例并绑定 SPI
  • LR2021 radio = new Module(hal, RFM_NSS, RFM_IRQ, RFM_RST, RFM_BUSY):初始化 LR2021 模块对象
  • LoRaWANNode node(&radio, &Region, subBand):创建 LoRaWAN 节点实例
  • Flash EEPROM 仿真:
    • FLASH_TARGET_OFFSET:存储偏移
    • FLASH_EMULATE_EEPROM_SIZE:仿真容量
    • saveLoRaWANState() / restoreLoRaWANState():保存 / 恢复 LoRaWAN 会话状态
  • node.beginOTAA(joinEUI, devEUI, nwkKey, appKey):初始化 OTAA 参数
  • joinLoRaWAN(restored):尝试入网并保存 DevNonce / Session
  • 上行 / 下行发送:
    • node.sendReceive(tx, sizeof(tx), 1, rx, &rxLen):发送上行数据并接收下行
    • 成功发送后保存 session 防止计数回退
    • 下行数据打印 HEX / ASCII
  • 循环逻辑:
    1. 发送随机 payload
    2. 检测是否收到下行
    3. 保存状态
    4. 延时 uplinkIntervalSeconds 秒后下一次发送

【运行效果】

  • 烧录程序后自动完成 OTAA 接入,周期性上报数据并接收下行

  • 串口实时打印入网状态、上下行数据、信号质量等信息,如下图所示: