SPI 转 RS485

  • 如下协议定义只适用于固件 V4.1 版本及以后

  • 发送 AT+VER 串口指令,可以查询固件版本,如未返回版本号或者返回 V33,请下载最新固件

  • 支持 SANPO 电机调试工具 快速生成调试代码,支持全系列 CAN/RS485 协议电机

协议说明

适用场景

接线规则

发送协议(SPI->RS485)

接收协议(RS485->SPI)

RS485 协议电机(固定报文长度 23 个字节)

CS1 片选通道控制 RS485-1、RS485-2;CS2 片选通道控制 RS485-3、RS485-4

透传,固定长度 23 个字节,预留最后 3 个字节,最后一个字节为 CRC 值,倒数第二个字节为实际有效数据长度,倒数第三个字节为 Channel

透传,固定长度 23 个字节,预留最后 3 个字节,最后一个字节为 CRC 值,倒数第二个字节为实际有效数据长度,倒数第三个字节为 Channel

  • RS485 协议的前两个字节不可以使用预留帧头 0x45 0x54 或者 0x41 0x54 或者 0x53 0x54,其他字节没有限制

报文示例

发送报文

RS485 电机数据透传(不够 20 个字节时,使用 0x00 补齐)

Channel

数据长度

CRC 校验(1 字节)

0x22 0x33 0x00 0x53 0x54 0x00 0x53 0x54 0x00 0x53 0x54 0x00 0x53 0x54 0x00 0x53 0x54 0x00 0x00 0x00

0x00

0x17

0x0F

接收报文

RS485 电机反馈数据透传

Channel

数据长度

CRC 校验(1 字节)

0x22 0x33 0x00 0x53 0x54 0x00 0x53 0x54 0x00 0x53 0x54 0x00 0x53 0x54 0x00 0x53 0x00 0x00 0x00 0x00

0x00

0x16

0x0F

代码片段(SPI 转 RS485,Python)

完整代码样例请参考 spi_unitree_GO_M8010_demo_v4.py

# 发送:电机指令数据(<=20字节,不足补0) + Channel + 数据长度 + CRC
def build_spi_rs485_frame(cmd: bytes, channel: int) -> bytes:
    data_bytes = bytearray(cmd[:20])
    data_len = len(data_bytes)
    if data_len < 20:
        data_bytes.extend([0x00] * (20 - data_len))
    payload = bytes(data_bytes) + bytes([channel & 0xFF, data_len])
    crc = crc8_calculator.calculate(payload)
    return payload + bytes([crc])  # 固定长度23字节


tx = build_spi_rs485_frame(cmd, channel=0x00)
rx = spi.xfer2(list(tx))  # 固定长度23字节

# 接收解析:CRC 校验 + 取有效数据长度
data_part = rx[:22]
crc_ok = crc8_calculator.calculate(data_part) == rx[22]
data_len = rx[21]
motor_data = rx[:data_len]

开发样例

  • SPI 转 RS485 样例程序(Python 版本):下载地址

  • SPI 默认使用固定 23 个字节的收发报文