You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派Pico通过SX1262 LoRa模块跨设备通信失败求助

解决树莓派Pico+SX1262模块点对点通信问题

一、修复micropySX126X库的SPI错误

你遇到的TypeError: object with buffer protocol required是因为Micropython的SPI传输接口参数格式不匹配,库代码未适配Pico的SPI实现,修改步骤如下:

  1. 找到Pico中/lib/sx126x.py文件里的SPItransfer函数
  2. 将原代码:
def SPItransfer(self, data):
    return self.spi.write_readinto(data, data)

替换为适配Pico的版本:

def SPItransfer(self, data):
    buf = bytearray(data)
    self.spi.write_readinto(buf, buf)
    return buf
  1. 重新上传修改后的库文件到Pico,再运行ping pong示例代码

二、确认硬件接线正确性

SX1262与Pico的接线必须严格对应,以常用SPI引脚为例:

  • SX1262 VCC → Pico 3.3V(注意:SX1262不能接5V)
  • SX1262 GND → Pico GND
  • SX1262 SCK → Pico GP10
  • SX1262 MOSI → Pico GP11
  • SX1262 MISO → Pico GP12
  • SX1262 NSS → Pico GP13
  • SX1262 RESET → Pico GP14
  • SX1262 DIO1 → Pico GP15
  • SX1262 BUSY → Pico GP16(部分模块带此引脚)

三、改用简化的点对点LoRa代码(无需复杂库)

如果修改库仍有问题,可直接用底层SPI命令实现简单收发,示例代码如下:

发送端代码

from machine import Pin, SPI
import time

# 初始化SPI和引脚
spi = SPI(1, baudrate=1000000, polarity=0, phase=0, sck=Pin(10), mosi=Pin(11), miso=Pin(12))
nss = Pin(13, Pin.OUT)
reset = Pin(14, Pin.OUT)
dio1 = Pin(15, Pin.IN)

def sx1262_reset():
    reset.value(0)
    time.sleep_ms(10)
    reset.value(1)
    time.sleep_ms(100)

def sx1262_write_cmd(cmd, data=None):
    nss.value(0)
    spi.write(bytearray([cmd]))
    if data:
        spi.write(bytearray(data))
    nss.value(1)

def sx1262_read_cmd(cmd, length=1):
    nss.value(0)
    spi.write(bytearray([cmd | 0x80]))
    res = spi.read(length)
    nss.value(1)
    return res

# 初始化模块(参数需与接收端一致)
sx1262_reset()
sx1262_write_cmd(0x80, [0x00])  # 进入待机模式
sx1262_write_cmd(0x83, [0x02])  # 设置LoRa模式
sx1262_write_cmd(0x70, [0x00])  # 设置频段为433MHz(根据模块实际频段调整)
sx1262_write_cmd(0x71, [0x00, 0x00])
sx1262_write_cmd(0x72, [0x10])
sx1262_write_cmd(0x73, [0x00])  # 扩频因子设为7
sx1262_write_cmd(0x74, [0x04])  # 带宽设为125kHz
sx1262_write_cmd(0x75, [0x01])  # 编码率设为4/5

# 循环发送数据
while True:
    sx1262_write_cmd(0x82, [0x01])  # 进入发送模式
    # 发送"Hello":第一个字节为数据长度,后续为内容
    sx1262_write_cmd(0x00, [0x05, 0x48, 0x65, 0x6C, 0x6C, 0x6F])
    while dio1.value() == 0:
        pass
    print("数据已发送")
    time.sleep(2)

接收端代码

from machine import Pin, SPI
import time

# 初始化SPI和引脚(与发送端一致)
spi = SPI(1, baudrate=1000000, polarity=0, phase=0, sck=Pin(10), mosi=Pin(11), miso=Pin(12))
nss = Pin(13, Pin.OUT)
reset = Pin(14, Pin.OUT)
dio1 = Pin(15, Pin.IN)

def sx1262_reset():
    reset.value(0)
    time.sleep_ms(10)
    reset.value(1)
    time.sleep_ms(100)

def sx1262_write_cmd(cmd, data=None):
    nss.value(0)
    spi.write(bytearray([cmd]))
    if data:
        spi.write(bytearray(data))
    nss.value(1)

def sx1262_read_cmd(cmd, length=1):
    nss.value(0)
    spi.write(bytearray([cmd | 0x80]))
    res = spi.read(length)
    nss.value(1)
    return res

# 初始化模块(参数与发送端完全一致)
sx1262_reset()
sx1262_write_cmd(0x80, [0x00])
sx1262_write_cmd(0x83, [0x02])
sx1262_write_cmd(0x70, [0x00])
sx1262_write_cmd(0x71, [0x00, 0x00])
sx1262_write_cmd(0x72, [0x10])
sx1262_write_cmd(0x73, [0x00])
sx1262_write_cmd(0x74, [0x04])
sx1262_write_cmd(0x75, [0x01])

# 循环接收数据
while True:
    sx1262_write_cmd(0x82, [0x00])  # 进入接收模式
    while dio1.value() == 0:
        pass
    sx1262_write_cmd(0x12)  # 读取接收数据长度
    length = sx1262_read_cmd(0x13)[0]
    data = sx1262_read_cmd(0x14, length)
    print("收到数据:", bytes(data).decode())
    time.sleep_ms(100)

四、AT命令无响应的排查要点

如果坚持用AT命令方式,需确认:

  • 模块是否为带AT固件的版本(普通SX1262模块默认无AT固件)
  • UART接线是否正确:SX1262的TX接Pico的RX,SX1262的RX接Pico的TX
  • 波特率是否匹配(常见为9600或115200)
  • 发送AT命令时必须加换行符(例如AT\r\n)

内容的提问来源于stack exchange,提问作者Marwa Moussa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:15:35