# 快速开始
SANPO 集成开发板固件 V6版本 基于 STM32G473 系列 MCU,支持 `CAN FD / 经典 CAN / RS485`。上位机可以通过 USB CDC串口协议、Linux SocketCAN 或 SPI 固定长度协议使用 CAN/CAN FD;RS485 通过 USB CDC串口或 SPI 使用。
出厂固件版本说明:SANPO 集成开发板 FDCAN 升级版基于 STM32G473 平台开发,已预装 V6 固件;标准版、隔离版(CAN) 和隔离版(RS485) 基于 STM32F407 平台开发,仍预装 V4 固件。不同硬件版本对应不同的固件版本,已在使用 V4 固件的用户可以继续按原有方式使用,无需强制升级。
文档适用范围:FDCAN 升级版用户请使用本文档;标准版、隔离版(CAN) 和隔离版(RS485) 用户请回到 [V4 版本说明文档](https://docs.sanporobot.com/v4/zh/get_started.html)。
## 使用前配置波特率
V6 出厂默认通信参数为:经典 CAN / CAN FD 仲裁段 `1000000`,CAN FD 数据段 `5000000`,RS485 `4000000,1,0,8`。
使用 USB CDC串口协议或 SPI 协议收发数据前,请先通过 USB CDC串口 AT+ 指令查询或配置波特率,确认固件保存值和实际的 CAN、CAN FD、RS485 设备参数一致。使用串口工具发送 AT+ 指令时,把发送结束符设置为 `CRLF`:
```text
AT+SETFDCAN=,
AT+SETRS485=,,,
```
查询当前固件保存值:
```text
AT+SETFDCAN?
AT+SETRS485?
```
USB CDC串口协议和 SPI 协议使用固件保存的这组参数;SocketCAN 使用 Linux `ip link` 单独配置当前运行时波特率。详细说明见 [波特率配置](baudrate_config)。
## 产品能力
| 能力 | 说明 |
| --- | --- |
| CAN FD | 支持 USB CDC串口、SocketCAN、SPI 转 CAN FD 标准帧和扩展帧,最大 64 字节数据区 |
| 经典 CAN | 支持 USB CDC串口、SocketCAN、SPI 转 CAN 标准帧和扩展帧,最大 8 字节数据区 |
| RS485 | 支持 USB CDC串口/SPI 转 RS485 |
| SocketCAN | 单块 SANPO 集成开发板提供 4 路 CAN 接口,Linux 下通过 `gs_usb` 枚举为 `canX` 网络接口,通常为 `can0`、`can1`、`can2`、`can3` |
| 批量执行 | 支持本地保存并自动执行 CAN、CAN FD、RS485 指令 |
## SANPO 通信协议头定义
如下这些协议头用于 USB CDC串口协议和 SPI 固定长度协议。SocketCAN 不使用这些帧头,Linux 上位机直接发送标准 CAN 或 CAN FD 报文。
| 协议头 | 十六进制 | 含义 |
| --- | --- | --- |
| `ST` | `0x53 0x54` | 经典 CAN 标准帧 |
| `ET` | `0x45 0x54` | 经典 CAN 扩展帧 |
| `SF` | `0x53 0x46` | CAN FD 标准帧 |
| `EF` | `0x45 0x46` | CAN FD 扩展帧 |
| `RT` | `0x52 0x54` | RS485 RT 封装帧 |
| `AT` | `0x41 0x54` | AT控制命令 |
## AT+ 控制指令结尾
`AT+` 控制指令通常通过串口助手等工具发送。文档中的命令表通常只写命令主体;实际发送时,每条 `AT+` 指令都必须以 CRLF 结尾。
使用串口工具时,只输入命令主体,并把发送结束符设置为 `CRLF`。不要在输入框中手动输入反斜杠 r、反斜杠 n 这几个字符,除非串口工具输入配置为可转义。
例如如下命令示例:
```text
AT+VER
AT+SETFDCAN=1000000,5000000
AT+SPIMODE=LONG
```
## USB CDC串口协议
USB CDC串口使用变长协议,标准 SANPO 报文均以 `0x0D 0x0A` 结尾。
| 协议 | 帧头 | 长度 |
| --- | --- | --- |
| USB CDC串口转经典 CAN | `ST / ET` | 变长,数据 0~8 字节 |
| USB CDC串口转 CAN FD | `SF / EF` | 变长,数据 0~64 字节 |
| USB CDC串口转 RS485(SANPO RT 封装帧) | `RT` | 变长,数据 0~64 字节 |
| USB CDC串口转 RS485(原始数据透传) | 无固定帧头 | 发送 `AT+RS485RAW=1` 后临时启用,用于兼容第三方 RS485 上位机,例如宇树原厂上位机 |
固件上电默认使用非透传的 SANPO `RT` 封装帧模式。需要临时使用第三方 RS485 上位机时,发送 `AT+RS485RAW=1` 开启原始数据透传;使用完成后发送 `AT+RS485RAW=0` 恢复 `RT` 封装帧模式。该透传开关不作为上电默认配置保存,重新上电后会自动恢复为非透传模式。
## SocketCAN 接口
Linux 主机可以通过 `gs_usb` 驱动把 SANPO 集成开发板识别为 4 个 SocketCAN 网络接口。在主机没有其他 SocketCAN 设备时,通常显示为 `can0`、`can1`、`can2`、`can3`。SocketCAN 使用 Linux 标准 CAN API,不需要构造 SANPO 自定义帧。
常用命令如下:
```bash
sudo modprobe gs_usb
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up
cansend can0 123#11223344
candump can0
```
CAN FD 使用 `ip link` 开启 `fd on` 并设置数据段波特率:
```bash
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 1000000 dbitrate 5000000 fd on
sudo ip link set can0 up
```
一块 SANPO 集成开发板上的 4 路 CAN 会分别显示为 4 个 `canX` 接口,但 Linux 分配的 `canX` 编号不保证和板上 CAN1~CAN4 的物理顺序固定一致。实际使用前应确认 `canX` 和物理 CAN 总线的对应关系,详见 [SocketCAN / gs_usb](socketcan)。
## SPI 协议
SPI 使用固定长度全双工协议。总线长度包含最后 1 字节 SPI CRC;报文区不包含 CRC。
| SPI 报文模式 | 总线长度 | 报文区长度 | 支持协议 | 默认 |
| --- | ---: | ---: | --- | --- |
| `SHORT` | 23 字节 | 22 字节 | 经典 CAN、RS485 | 是 |
| `LONG` | 73 字节 | 72 字节 | 经典 CAN、CAN FD、RS485 | 否 |
`SHORT` 模式用于兼容和低开销通信;`LONG` 模式用于 CAN FD 和更长 RS485 数据。固件出厂默认 `SHORT` 模式,可以使用 AT+ 指令切换,切换后,下次上电默认使用上次切换后的模式。
SPI 报文模式通过 USB CDC串口 AT+ 指令切换。使用串口工具时,只输入以下命令主体,并把发送结束符设置为 `CRLF`:
```text
AT+SPIMODE?
AT+SPIMODE=SHORT
AT+SPIMODE=LONG
```
收到 `OK` 后,SPI 主机应停止当前 SPI 交易,等待至少 10 ms,再按新模式长度发起通信。
## 数据长度字段
经典 CAN / CAN FD 的数据长度字段是“数据长度编码”,不是直接字节数。
经典 CAN 的数据长度字段范围 `0x00~0x08`。
CAN FD 的数据长度字段范围是`0x00~0x0F`。
| 编码字段值 | 真实数据长度 |
| --- | ---: |
| `0x00` | 0 |
| `0x01` | 1 |
| `0x02` | 2 |
| `0x03` | 3 |
| `0x04` | 4 |
| `0x05` | 5 |
| `0x06` | 6 |
| `0x07` | 7 |
| `0x08` | 8 |
| `0x09` | 12 |
| `0x0A` | 16 |
| `0x0B` | 20 |
| `0x0C` | 24 |
| `0x0D` | 32 |
| `0x0E` | 48 |
| `0x0F` | 64 |
## 波特率策略
USB CDC串口协议和 SPI 协议使用固件保存的 CAN/FDCAN 参数。该参数通过 USB CDC串口 AT+ 指令配置。使用串口工具时,只输入命令主体,并把发送结束符设置为 `CRLF`:
```text
AT+SETFDCAN=,
```
查询当前固件保存的通信参数:
```text
AT+SETFDCAN?
AT+SETRS485?
```
返回格式分别为 `FDCAN:,` 和 `RS485:,,,`。
| 总线 | 默认策略 |
| --- | --- |
| 经典 CAN | 使用 `arb_baud`,例如 `1000000 / 500000 / 250000 / 125000 / 100000` |
| CAN FD 仲裁段 | 使用 `arb_baud` |
| CAN FD 数据段 | 使用 `data_baud`,当前支持 `2000000` 或 `5000000` |
| RS485 | 通过 `AT+SETRS485=,,,` 配置 |
出厂默认 CAN/FDCAN 建议值为 `AT+SETFDCAN=1000000,5000000`。CAN FD 默认开启 BRS,因此仲裁段和数据段可以使用不同波特率。`AT+SETFDCAN`、`AT+SETRS485`、`AT+SPIMODE`、`AT+RS485RAWCH` 和 `AT+BATAUTOSET/BATAUTOCLR` 的配置会写入固件持久化存储,下次上电继续使用,无需重新配置。`AT+RS485RAW` 只控制当前运行时是否开启 RS485 原始数据透传,重新上电后自动恢复为非透传模式。
SocketCAN 使用 Linux `ip link set canX type can ...` 配置当前运行时波特率。该配置不会写入固件存储,设备重新上电或重新枚举后,SocketCAN 上位机应重新执行 `ip link` 配置。
USB CDC串口/SPI 和 SocketCAN 共用同一组物理 FDCAN 控制器。同一条 CAN 总线如果同时被多种入口配置,最后一次配置会决定当前实际 CAN 时序。正式控制时,建议同一条 CAN 总线只选择一种入口发送控制帧。
如需恢复出厂通信配置,或多次修改配置后返回 `ERR,5` 表示配置区空间不足,可以发送:
```text
AT+CFGERASE
```
该命令只擦除通信配置区,不擦除批量指令数据。执行成功后立即恢复默认值:CAN/FDCAN 为 `1000000/5000000`,SPI 为 `SHORT`,RS485 为 `4000000,1,0,8`。
USB CDC串口连接时设置的波特率,只作为虚拟串口的连接配置,不会同步修改 CAN/FDCAN/RS485 的波特率(请注意:配置策略与V4版本的固件不同)。
## 兼容性
- 兼容小米 CyberGear 原厂上位机(CAN扩展帧通信)。
- 发送 `AT+RS485RAW=1` 后,兼容宇树等第三方 RS485 上位机(RS485 原始数据透传)。
- Linux 主机可以通过 SocketCAN 标准接口直接使用 `canX`,不需要使用 SANPO 定义 CAN 帧头。
- SPI 协议不再支持无帧头 RS485;SPI 转 RS485 统一使用 SANPO `RT` 封装帧。
## 文档入口
| 文档 | 功能 |
| --- | --- |
| [波特率配置](baudrate_config) | CAN/FDCAN、RS485 和 SocketCAN 波特率配置 |
| [USB CDC串口转 CAN](usb_can) | USB CDC串口协议,经典 CAN 标准帧、扩展帧 |
| [USB CDC串口转 FDCAN](usb_fdcan) | USB CDC串口协议,CAN FD 标准帧、扩展帧 |
| [USB CDC串口转 RS485](usb_rs485) | USB CDC串口协议,SANPO RT 封装帧和可临时开启的 RS485 原始数据透传 |
| [SocketCAN / gs_usb](socketcan) | Linux SocketCAN 标准接口,经典 CAN 和 CAN FD |
| [SPI 转 CAN](spi_can) | SPI 经典 CAN 短帧/长帧 |
| [SPI 转 FDCAN](spi_fdcan) | SPI CAN FD 长帧 |
| [SPI 转 RS485](spi_rs485) | SPI RS485 短帧/长帧 |
| [批量离线执行](batch_programming) | 本地存储并自动执行 CAN/CAN FD/RS485 指令 |