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 |
|
RS485-1 |
第一颗 MCU |
|
RS485-2 |
第二颗 MCU |
|
RS485-3 |
第二颗 MCU |
|
RS485-4 |
任意片选 |
|
当前 MCU 的两路 RS485 |
固件按本地接口处理:1/3 选择第一路,2/4 选择第二路。回包使用本地 Channel 1/2。
SHORT 报文
发送和接收使用相同布局:
字节位置 |
内容 |
|---|---|
0~1 |
固定 |
2 |
Channel |
3 |
RS485 数据长度 |
4~21 |
18 字节 RS485 数据区,未使用部分填 |
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 |
固定 |
2 |
Channel |
3 |
RS485 数据长度 |
4~71 |
68 字节 RS485 数据区,未使用部分填 |
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
参数名称以示例程序当前帮助信息为准。首次运行时应降低运动幅度并预留立即断电的安全措施。
常见问题
现象 |
处理方法 |
|---|---|
收到全 |
当前没有排队反馈;稍后继续发送同长度空帧 |
回包 Channel 为 1/2 |
回包使用当前 MCU 的本地编号,属于正常行为 |
17 字节指令在 SHORT 可用,较长指令失败 |
SHORT 最多 18 字节;切换 LONG |
CRC 错误 |
检查 Mode 0、MSB First、固定长度、SPI 时钟和片选时序 |
设备没有回复 |
检查片选、Channel、RS485 参数、设备 ID、指令校验、A/B 接线和供电 |
反馈被拆成多段 |
按设备协议在主控端进行重组,不要把一次 SPI 读取视为固定的一条电机回包 |