# 快速开始 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 指令 |