树莓派Pico通过SX1262 LoRa模块跨设备通信失败求助
解决树莓派Pico+SX1262模块点对点通信问题
一、修复micropySX126X库的SPI错误
你遇到的TypeError: object with buffer protocol required是因为Micropython的SPI传输接口参数格式不匹配,库代码未适配Pico的SPI实现,修改步骤如下:
- 找到Pico中
/lib/sx126x.py文件里的SPItransfer函数 - 将原代码:
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
- 重新上传修改后的库文件到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
相关产品推荐
相关产品推荐

