SANPO SPI 转 RS485

SANPO SPI 转 RS485 适合 Jetson、树莓派或其他主控板实时控制 RS485 电机和设备。主控板通过固定 23 字节的 SPI 报文发送 RS485 原始指令,并在后续 SPI 传输中读取设备反馈。

建议使用 V47 或更新的 V4 固件。

SPI 连接和参数

项目

设置

SPI 模式

Mode 0

数据顺序

MSB First

每次传输长度

固定 23 字节

建议时钟

从 2 MHz 开始测试

建议帧间隔

不小于 100 µs

校验

第 23 字节为前 22 字节的 CRC-8

开发板丝印 CS1 控制 RS485-1 和 RS485-2,CS2 控制 RS485-3 和 RS485-4。在 Jetson、树莓派等 Linux 主控上,软件中的 CS0 和 CS1 通常分别连接开发板丝印的 CS1 和 CS2。

RS485 出厂默认参数为 4 Mbps、1 个停止位、无校验、8 个数据位。如需保存其他参数,可以先通过 USB 使用 RS485 原始数据透传中的 AT+SETRS485 命令;如果只需要临时修改,可参考配套示例中的 spi_set_baudrate.py。通过 SPI 临时设置的参数在重新上电后不会保留。

例如,在 Linux 主控上将 SPI0、CS0 对应的第一路 RS485 临时设置为 4 Mbps、1 个停止位、无校验、8 个数据位:

sudo python3 spi_set_baudrate.py --spibus 0 --cs 0 --mode rs485 --rs485num 1 --baudrate 4000000 --stop-bits 1 --parity 0 --data-bits 8

命令执行后应使用实际设备指令确认通信,设置本身不会保存到 Flash。

选择 RS485 接口

开发板片选

Channel

发送目标

CS1

0x01

RS485-1

CS1

0x02

RS485-2

CS2

0x03

RS485-3

CS2

0x04

RS485-4

CS1 或 CS2

0x00

同时发送到当前片选对应的两路 RS485

23 字节发送报文

字节位置

内容

0~19

RS485 原始数据,不足 20 字节填 00

20

Channel

21

RS485 原始数据长度 120;填写 0 时不发送数据,可作为空轮询

22

前 22 字节的 CRC-8

CRC-8 使用多项式 0x07、初始值 0x00、无结果异或。

def crc8(data: bytes) -> int:
    crc = 0
    for value in data:
        crc ^= value
        for _ in range(8):
            crc = ((crc << 1) ^ 0x07) & 0xFF if crc & 0x80 else (crc << 1) & 0xFF
    return crc

例如,将一条 17 字节的宇树电机指令发送到 Channel 2:

FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C 00 00 00 02 11 67

其中字节 17~19 为填充的 0002 是 Channel,11 表示原始指令长度为 0x11,最后的 67 是 CRC-8。

读取 RS485 反馈

SPI 为全双工通信。发送控制报文时同时读到的内容,可能是之前已经缓存的数据或全 00。如果需要等待设备回包,应在发送后继续发送全 00 的 23 字节空报文进行读取。

有效回包格式为:

字节位置

内容

0~19

RS485 设备反馈,不足 20 字节填 00

20

回包来源 Channel:当前片选的第一路为 0x01,第二路为 0x02

21

实际反馈长度 020

22

前 22 字节的 CRC-8

回包 Channel 使用当前片选内的本地编号。通过开发板 CS2 读取 RS485-3 或 RS485-4 时,回包也分别显示为 0x010x02。上位机应先校验 CRC,再读取 Channel 和实际反馈长度。

该字段从 V47 开始生效。早期固件始终返回 00;原先忽略字节 20 的上位机程序可以继续使用,新程序可以通过该字节区分两路 RS485 反馈。

开发示例

使用限制

  • 单条 RS485 原始数据最长为 20 字节。

  • 原始数据的前两个字节不能是 41 5445 5453 54。如果设备协议使用了这些开头,请联系技术支持获取兼容方案。

  • 每次传输必须完整发送 23 字节,不能省略填充字节或 CRC。

常见问题

现象

处理方法

收到的数据全为 00

这表示当前没有待读取数据;发送控制报文后稍等,再发送空报文读取

CRC 校验失败

确认 SPI 为 Mode 0、MSB First、每次 23 字节,并降低时钟或增大帧间隔

RS485 设备没有回复

检查片选、Channel、原始数据长度、RS485 通信参数、指令校验、A/B 接线和设备供电

指令被发到了两路 RS485

Channel 为 0x00 时会同时发到当前片选对应的两路 RS485;请改为具体通道编号

高频连续发送时偶发丢帧

从 2 MHz、100 µs 帧间隔开始测试,确认稳定后再逐步提高速率