SPI 转 RS485
本协议用于 SPI 接口和 RS485 总线之间传输数据。SPI RS485 统一使用 SANPO RT 封装帧。
SANPO RT 封装帧是在原始 RS485 数据外层增加 RT / Channel / Len / CRC 路由信息。需要发送到 RS485 总线的第三方协议数据应原样放入 Data 字段,固件转发到 RS485 总线时不会解析或修改 Data 内容,只会根据 Channel 选择目标 RS485 接口,并按 Len 取出有效字节发送。
SPI RS485 支持 SHORT 和 LONG 两种固定长度模式。
模式 |
总线长度 |
报文区长度 |
RS485 最大有效数据 |
|---|---|---|---|
|
23 字节 |
22 字节 |
18 字节 |
|
73 字节 |
72 字节 |
68 字节 |
最后 1 字节为 SPI CRC;前面的字节为报文区。
SHORT 模式格式
0x52 0x54 + Channel(1B) + Len(1B) + Data(18B) + CRC(1B)
LONG 模式格式
0x52 0x54 + Channel(1B) + Len(1B) + Data(68B) + CRC(1B)
字段说明
字段 |
说明 |
|---|---|
|
ASCII |
|
|
|
RS485 真实有效数据长度;SHORT 范围 |
|
固定长度数据区;前 |
|
SPI CRC 字节 |
CRC 说明
总线长度包含最后 1 字节 CRC。开发板固件使用 SPI 硬件 CRC,若主机使用软件SPI,需要生成最后 1 字节 CRC。
SHORT 示例
帧头 |
Channel |
Len |
Data |
CRC |
|---|---|---|---|---|
|
|
|
18 字节数据区,前 4 字节有效,其余补零 |
SPI CRC |
Python 示例
完整代码样例请参考 spi_unitree_GO_M8010_demo_v6.py
def build_spi_rs485_short_payload(channel: int, payload: bytes) -> bytes:
payload = payload[:18]
data = payload + bytes([0x00] * (18 - len(payload)))
body = bytes([0x52, 0x54, channel & 0xFF, len(payload)]) + data
if len(body) != 22:
raise ValueError("invalid SHORT payload size")
return body
def build_spi_rs485_long_payload(channel: int, payload: bytes) -> bytes:
payload = payload[:68]
data = payload + bytes([0x00] * (68 - len(payload)))
body = bytes([0x52, 0x54, channel & 0xFF, len(payload)]) + data
if len(body) != 72:
raise ValueError("invalid LONG payload size")
return body