SANPO SPI 转 RS485
SANPO SPI 转 RS485 适合 Jetson、树莓派或其他主控板实时控制 RS485 电机和设备。主控板通过固定 23 字节的 SPI 报文发送 RS485 原始指令,并在后续 SPI 传输中读取设备反馈。
建议使用 V47 或更新的 V4 固件。
SPI 连接和参数
项目 |
设置 |
|---|---|
SPI 模式 |
Mode 0 |
数据顺序 |
MSB First |
每次传输长度 |
固定 23 字节 |
建议时钟 |
从 2 MHz 开始测试 |
建议帧间隔 |
不小于 100 µs |
校验 |
第 23 字节为前 22 字节的 CRC-8 |
开发板丝印 CS1 控制 RS485-1 和 RS485-2,CS2 控制 RS485-3 和 RS485-4。在 Jetson、树莓派等 Linux 主控上,软件中的 CS0 和 CS1 通常分别连接开发板丝印的 CS1 和 CS2。
RS485 出厂默认参数为 4 Mbps、1 个停止位、无校验、8 个数据位。如需保存其他参数,可以先通过 USB 使用 RS485 原始数据透传中的 AT+SETRS485 命令;如果只需要临时修改,可参考配套示例中的 spi_set_baudrate.py。通过 SPI 临时设置的参数在重新上电后不会保留。
例如,在 Linux 主控上将 SPI0、CS0 对应的第一路 RS485 临时设置为 4 Mbps、1 个停止位、无校验、8 个数据位:
sudo python3 spi_set_baudrate.py --spibus 0 --cs 0 --mode rs485 --rs485num 1 --baudrate 4000000 --stop-bits 1 --parity 0 --data-bits 8
命令执行后应使用实际设备指令确认通信,设置本身不会保存到 Flash。
选择 RS485 接口
开发板片选 |
Channel |
发送目标 |
|---|---|---|
CS1 |
|
RS485-1 |
CS1 |
|
RS485-2 |
CS2 |
|
RS485-3 |
CS2 |
|
RS485-4 |
CS1 或 CS2 |
|
同时发送到当前片选对应的两路 RS485 |
23 字节发送报文
字节位置 |
内容 |
|---|---|
0~19 |
RS485 原始数据,不足 20 字节填 |
20 |
Channel |
21 |
RS485 原始数据长度 |
22 |
前 22 字节的 CRC-8 |
CRC-8 使用多项式 0x07、初始值 0x00、无结果异或。
def crc8(data: bytes) -> int:
crc = 0
for value in data:
crc ^= value
for _ in range(8):
crc = ((crc << 1) ^ 0x07) & 0xFF if crc & 0x80 else (crc << 1) & 0xFF
return crc
例如,将一条 17 字节的宇树电机指令发送到 Channel 2:
FE EE 11 00 00 00 00 00 00 00 00 00 00 00 00 18 7C 00 00 00 02 11 67
其中字节 17~19 为填充的 00,02 是 Channel,11 表示原始指令长度为 0x11,最后的 67 是 CRC-8。
读取 RS485 反馈
SPI 为全双工通信。发送控制报文时同时读到的内容,可能是之前已经缓存的数据或全 00。如果需要等待设备回包,应在发送后继续发送全 00 的 23 字节空报文进行读取。
有效回包格式为:
字节位置 |
内容 |
|---|---|
0~19 |
RS485 设备反馈,不足 20 字节填 |
20 |
回包来源 Channel:当前片选的第一路为 |
21 |
实际反馈长度 |
22 |
前 22 字节的 CRC-8 |
回包 Channel 使用当前片选内的本地编号。通过开发板 CS2 读取 RS485-3 或 RS485-4 时,回包也分别显示为 0x01 或 0x02。上位机应先校验 CRC,再读取 Channel 和实际反馈长度。
该字段从 V47 开始生效。早期固件始终返回 00;原先忽略字节 20 的上位机程序可以继续使用,新程序可以通过该字节区分两路 RS485 反馈。
开发示例
使用限制
单条 RS485 原始数据最长为 20 字节。
原始数据的前两个字节不能是
41 54、45 54或53 54。如果设备协议使用了这些开头,请联系技术支持获取兼容方案。每次传输必须完整发送 23 字节,不能省略填充字节或 CRC。
常见问题
现象 |
处理方法 |
|---|---|
收到的数据全为 |
这表示当前没有待读取数据;发送控制报文后稍等,再发送空报文读取 |
CRC 校验失败 |
确认 SPI 为 Mode 0、MSB First、每次 23 字节,并降低时钟或增大帧间隔 |
RS485 设备没有回复 |
检查片选、Channel、原始数据长度、RS485 通信参数、指令校验、A/B 接线和设备供电 |
指令被发到了两路 RS485 |
Channel 为 |
高频连续发送时偶发丢帧 |
从 2 MHz、100 µs 帧间隔开始测试,确认稳定后再逐步提高速率 |