SANPO SPI 转 RS485

SANPO SPI 转 RS485 适合 Jetson、树莓派或其他主控板周期控制 RS485 电机和设备。主控板把设备原始指令放入固定长度的 RT 报文,并在当前或后续 SPI 传输中读取反馈。

SPI 参数和长度

项目

SHORT

LONG

总传输长度

23 字节

73 字节

报文区

22 字节

72 字节

RS485 数据区

18 字节

68 字节

最后一个字节

CRC-8

CRC-8

两种模式都使用 SPI Mode 0、MSB First。CRC-8 多项式为 0x07,初始值 0x00,无结果异或。

出厂默认 SHORT。超过 18 字节的 RS485 指令需要先通过 USB 串口发送:

AT+SPIMODE=LONG

收到 OK 后等待至少 10 ms,再改用 73 字节传输。设置会保存到 Flash。

选择 RS485 接口

SPI 片选

Channel

发送目标

第一颗 MCU

0x01

RS485-1

第一颗 MCU

0x02

RS485-2

第二颗 MCU

0x03

RS485-3

第二颗 MCU

0x04

RS485-4

任意片选

0x00

当前 MCU 的两路 RS485

固件按本地接口处理:1/3 选择第一路,2/4 选择第二路。回包使用本地 Channel 1/2

SHORT 报文

发送和接收使用相同布局:

字节位置

内容

0~1

固定 52 54,即 RT

2

Channel

3

RS485 数据长度 018

4~21

18 字节 RS485 数据区,未使用部分填 00

22

前 22 字节的 CRC-8

将 17 字节宇树控制帧发送到 Channel 2 时,CRC 前的报文区为:

52 54 02 11 FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C 00

最后增加对这 22 字节计算得到的 CRC-8。

LONG 报文

字节位置

内容

0~1

固定 52 54,即 RT

2

Channel

3

RS485 数据长度 068

4~71

68 字节 RS485 数据区,未使用部分填 00

72

前 72 字节的 CRC-8

CRC 算法与 SANPO SPI 转 CAN相同。

读取 RS485 反馈

开发板收到 RS485 数据后,会使用同样的 RT 布局放入 SPI 发送队列:

  • 字节 2 表示反馈来自当前 MCU 的第一路或第二路 RS485。

  • 字节 3 表示本次反馈的数据长度。

  • 数据从字节 4 开始。

  • 未使用的数据区填 00

SPI 是全双工接口。发送控制帧时读到的可能是旧数据或全 00;如果还没有目标反馈,应继续发送同长度的全零空帧读取。

一次 RS485 接收事件不保证正好对应一条完整的电机协议帧。主控应使用 Channel 区分总线,再按照电机协议的帧头、长度和校验重组数据。

宇树 GO-M8010 示例

示例程序:SPI 转 RS485 宇树电机示例

sudo python3 spi2rs485_unitree_GM8010_demo_v6.py \
  --spibus 0 \
  --cs 0 \
  --motors 1 \
  --channel 1

参数名称以示例程序当前帮助信息为准。首次运行时应降低运动幅度并预留立即断电的安全措施。

常见问题

现象

处理方法

收到全 00

当前没有排队反馈;稍后继续发送同长度空帧

回包 Channel 为 1/2

回包使用当前 MCU 的本地编号,属于正常行为

17 字节指令在 SHORT 可用,较长指令失败

SHORT 最多 18 字节;切换 LONG

CRC 错误

检查 Mode 0、MSB First、固定长度、SPI 时钟和片选时序

设备没有回复

检查片选、Channel、RS485 参数、设备 ID、指令校验、A/B 接线和供电

反馈被拆成多段

按设备协议在主控端进行重组,不要把一次 SPI 读取视为固定的一条电机回包