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 个字节的收发报文