SANPO USB 转 FDCAN
SANPO USB 转 FDCAN 用于通过 USB 串口收发 CAN FD 标准帧和扩展帧,单帧数据最多 64 字节。固件发送 CAN FD 时固定开启 BRS。
经典 CAN 请使用 SANPO USB 转 CAN。Linux 上如果希望使用标准 canX 接口,请使用 SocketCAN。
连接和准备
打开目标 MCU 对应的 USB 串口。
发送
AT+SETFDCAN?,确认仲裁段和数据段波特率与总线一致。需要修改时发送
AT+SETFDCAN=<仲裁段>,<数据段>,并以CRLF结尾。使用十六进制或二进制方式发送本页定义的报文。
出厂默认值为仲裁段 1 Mbps、数据段 5 Mbps。支持的具体数值见 通信参数配置。
选择 CAN FD 接口
当前 USB 串口 |
Channel |
发送目标 |
|---|---|---|
对应 CAN-1/2 |
|
CAN-1 |
对应 CAN-1/2 |
|
CAN-2 |
对应 CAN-3/4 |
|
CAN-3 |
对应 CAN-3/4 |
|
CAN-4 |
任意一个 USB 串口 |
|
当前 MCU 的两路 CAN FD |
发送时 1/3 都选择当前 MCU 的第一路,2/4 都选择第二路。回包只使用本地 Channel 1/2。
数据长度编码
CAN FD 的长度字段不是任意字节数,只能使用以下编码:
编码 |
数据字节数 |
编码 |
数据字节数 |
|---|---|---|---|
|
0 |
|
8 |
|
1 |
|
12 |
|
2 |
|
16 |
|
3 |
|
20 |
|
4 |
|
24 |
|
5 |
|
32 |
|
6 |
|
48 |
|
7 |
|
64 |
数据区的实际字节数必须与编码一致。
CAN FD 扩展帧
发送和接收使用相同格式:
字段 |
长度 |
说明 |
|---|---|---|
帧头 |
2 字节 |
固定 |
Channel |
1 字节 |
CAN FD 接口编号 |
CAN ID |
4 字节 |
29 位扩展帧 ID,高字节在前 |
长度编码 |
1 字节 |
|
数据 |
0~64 字节 |
字节数由长度编码决定 |
帧尾 |
2 字节 |
固定 |
向 Channel 1、扩展帧 ID 0x1F100101 发送 16 字节数据:
45 46 01 1F 10 01 01 0A
01 01 01 01 42 00 00 00 01 01 64 00 78 56 34 12
0D 0A
其中 0A 表示数据区为 16 字节。
CAN FD 标准帧
发送和接收使用相同格式:
字段 |
长度 |
说明 |
|---|---|---|
帧头 |
2 字节 |
固定 |
Channel |
1 字节 |
CAN FD 接口编号 |
保留字段 |
2 字节 |
固定 |
CAN ID |
2 字节 |
11 位标准帧 ID,高字节在前 |
长度编码 |
1 字节 |
|
数据 |
0~64 字节 |
字节数由长度编码决定 |
帧尾 |
2 字节 |
固定 |
向 Channel 2、标准帧 ID 0x142 发送 12 字节数据:
53 46 02 00 00 01 42 09
01 02 03 04 05 06 07 08 09 0A 0B 0C
0D 0A
回包识别
电机反馈会使用同一种 SF 或 EF 格式返回。根据帧头判断标准帧或扩展帧,根据长度编码确定数据字节数,再使用 Channel 判断来自当前 MCU 的第一路还是第二路。
USB 是字节流,一次串口读取可能包含半帧、完整一帧或多帧。上位机应按帧头和长度编码拆包,不要假设一次 read() 恰好得到一帧。
常见问题
现象 |
处理方法 |
|---|---|
经典 CAN 设备没有响应 |
经典 CAN 应使用 |
CAN FD 没有响应 |
检查仲裁段、数据段、BRS、终端电阻和对端是否支持 CAN FD |
发送长度不合法 |
只能使用 0~8、12、16、20、24、32、48、64 字节 |
回包 Channel 只显示 1/2 |
回包使用当前 MCU 的本地编号,属于正常行为 |
多帧数据连在一起 |
按帧头、长度编码和帧尾连续解析,不要按串口读取次数分帧 |