CAN总线协议实现、固件移植和诊断工具的完整开发套件。
CAN_HOME/
├── pcan_portable/ # PCAN-USB 可移植库 (单通道CAN)
├── pcan_pro_portable/ # PCAN-USB-PRO 可移植库 (双通道CAN FD)
├── pcan_prj/ # PCAN-USB 完整项目 (STM32F0)
├── pcan_pro_x-master/ # PCAN-USB-PRO 原始固件参考
├── kvaser_portable/ # Kvaser Leaf 可移植库
├── kvaser_cantact-master/ # Kvaser CANtact 原始固件
├── slcan_prj/ # SLCAN (Lawicel) 协议实现
├── uds_diagnostic/ # UDS诊断框架 (ISO 14229)
└── modbus_portable/ # Modbus RTU/TCP 可移植库
协议: Peak System PCAN-USB (单通道)
特性:
- 单通道CAN (经典CAN)
- 4个USB端点
- 3个LED指示灯
- 支持STM32F0平台
目录结构:
pcan_portable/
├── core/ # 协议层 (平台无关)
│ ├── pcan_protocol.c/h
│ ├── pcan_packet.h
│ └── punker.h
├── hal/ # 硬件抽象层
├── port/stm32f0/ # STM32F0实现
└── buffer/ # 高性能缓冲区
使用:
#include "pcan_protocol.h"
int main(void) {
pcan_protocol_init();
while(1) {
pcan_protocol_poll();
}
}协议: Peak System PCAN-USB-PRO (双通道CAN FD)
特性:
- 双通道CAN/CAN FD
- 6个USB端点
- 5个LED指示灯
- 支持STM32F4平台
与PCAN-USB对比:
| 特性 | PCAN-USB | PCAN-USB-PRO |
|---|---|---|
| CAN通道 | 1个 | 2个 |
| CAN FD | 不支持 | 支持 |
| USB端点 | 4个 | 6个 |
| 数据缓冲 | 896字节 | 1024字节 |
| LED数量 | 3个 | 5个 |
完整的STM32F0项目,包含:
- Keil MDK工程
- VSCode配置
- 硬件驱动实现
- 应用层代码
协议: Kvaser Leaf/USBcan II (filo协议)
特性:
- 单通道CAN
- 2个USB端点
- 2个LED指示灯
- 多平台支持 (STM32F0/F103/ESP32)
已支持平台:
| 平台 | MCU | CAN驱动 | USB驱动 | 状态 |
|---|---|---|---|---|
| STM32F0 | STM32F042 | bxCAN | USB Device | ✅ |
| STM32F103 | STM32F103xB | bxCAN | USB Device | ✅ |
| ESP32 | ESP32-S2/S3 | TWAI | TinyUSB | ✅ |
目录结构:
kvaser_portable/
├── core/
│ ├── kvaser_protocol.c/h
│ └── filo_cmds.h # Kvaser命令定义
├── hal/
│ ├── kvaser_hal_can.h
│ ├── kvaser_hal_usb.h
│ ├── kvaser_hal_gpio.h
│ └── kvaser_hal_timer.h
├── port/
│ ├── stm32f0/
│ ├── stm32f103/
│ └── esp32/
└── README.md
支持的Kvaser命令:
CMD_GET_CARD_INFO_REQ- 获取设备信息CMD_GET_SOFTWARE_INFO_REQ- 获取固件信息CMD_SET_BUSPARAMS_REQ- 设置波特率CMD_START_CHIP_REQ/CMD_STOP_CHIP_REQ- 启停CANCMD_TX_STD_MESSAGE/CMD_TX_EXT_MESSAGE- 发送CAN帧CMD_GET_CAPABILITIES_REQ- 获取能力CMD_SET_DRIVERMODE_REQ- 设置驱动模式CMD_LED_ACTION_REQ- LED控制
CANtact/CANable开源固件,基于STM32F042。
协议: Lawicel CAN232/CANUSB (ASCII协议)
特性:
- ASCII命令接口
- 串口通信
- 简单易用
- 适合调试
常用命令:
O- 打开CAN通道C- 关闭CAN通道Sx- 设置波特率tIDDLCDATA- 发送标准帧TIDDLCDATA- 发送扩展帧rIDDLCDATA- 发送远程帧
协议: ISO 14229 UDS + ISO 15765-2 CAN TP + ISO 13400 DoIP
特性:
- 完整UDS服务支持 (SID 0x10-0x87)
- 双传输层 (CAN TP / DoIP)
- Bootloader支持
- 静态内存分配
- MISRA-C规范
目录结构:
uds_diagnostic/
├── core/ # 核心层
│ ├── uds_transport.h # 传输层抽象
│ ├── uds_tp_can.c/h # CAN TP实现
│ ├── uds_tp_doip.c/h # DoIP实现
│ └── uds_server.c/h # 服务调度器
├── hal/ # 硬件抽象层
├── service/ # UDS服务实现
│ ├── uds_service_10.c # 诊断会话控制
│ ├── uds_service_11.c # ECU复位
│ ├── uds_service_22.c # 读数据ByID
│ ├── uds_service_27.c # 安全访问
│ ├── uds_service_2E.c # 写数据ByID
│ ├── uds_service_31.c # 例程控制
│ ├── uds_service_34-37.c # 传输服务
│ └── ...
├── bootloader/ # Bootloader实现
└── app/ # 应用示例
支持的UDS服务:
| SID | 服务名称 | 功能 |
|---|---|---|
| 0x10 | DiagnosticSessionControl | 会话控制 |
| 0x11 | ECUReset | ECU复位 |
| 0x14 | ClearDiagnosticInformation | 清除DTC |
| 0x19 | ReadDTCInformation | 读取DTC |
| 0x22 | ReadDataByIdentifier | 读数据 |
| 0x27 | SecurityAccess | 安全访问 |
| 0x2E | WriteDataByIdentifier | 写数据 |
| 0x31 | RoutineControl | 例程控制 |
| 0x34 | RequestDownload | 请求下载 |
| 0x36 | TransferData | 数据传输 |
| 0x37 | RequestTransferExit | 退出传输 |
| 0x3E | TesterPresent | 在线保持 |
| 0x85 | ControlDTCSetting | DTC控制 |
协议: Modbus RTU/TCP
特性:
- 双传输层 (RTU串口 + TCP以太网)
- 双模式 (主站 + 从站)
- 完整功能码支持 (0x01-0x10)
- 静态内存分配
- 多平台支持
目录结构:
modbus_portable/
├── core/ # 核心协议层
│ ├── modbus.c/h # 主协议栈
│ ├── modbus_rtu.c/h # RTU帧处理
│ ├── modbus_tcp.c/h # TCP帧处理
│ ├── modbus_pdu.c/h # PDU编解码
│ └── modbus_crc.h # CRC16计算
├── hal/ # 硬件抽象层
├── port/stm32f0/ # STM32F0实现
└── README.md
支持的功能码:
| 功能码 | 名称 | 主站 | 从站 |
|---|---|---|---|
| 0x01 | Read Coils | ✅ | ✅ |
| 0x02 | Read Discrete Inputs | ✅ | ✅ |
| 0x03 | Read Holding Registers | ✅ | ✅ |
| 0x04 | Read Input Registers | ✅ | ✅ |
| 0x05 | Write Single Coil | ✅ | ✅ |
| 0x06 | Write Single Register | ✅ | ✅ |
| 0x0F | Write Multiple Coils | ✅ | ✅ |
| 0x10 | Write Multiple Registers | ✅ | ✅ |
所有portable项目采用统一的分层架构:
┌─────────────────────────────────────┐
│ Application Layer │
├─────────────────────────────────────┤
│ Protocol Layer (Core) │ ← 平台无关
├─────────────────────────────────────┤
│ HAL Interface │ ← 抽象接口
├─────────────────────────────────────┤
│ Platform Implementation │ ← 平台相关
├─────────────────────────────────────┤
│ Hardware │
└─────────────────────────────────────┘
/* CAN HAL */
typedef struct {
void (*init)(void);
void (*poll)(void);
void (*set_bitrate)(uint16_t brp, uint8_t tseg1, uint8_t tseg2, uint8_t sjw);
int (*send_message)(const can_msg_t *msg);
void (*install_rx_callback)(rx_callback_t cb);
void (*install_tx_callback)(tx_callback_t cb);
void (*install_error_callback)(error_callback_t cb);
} hal_can_t;
/* USB HAL */
typedef struct {
void (*init)(void);
void (*poll)(void);
int (*flush_ep)(uint8_t ep);
int (*flush_data)(void *fsm, void *src, int size);
} hal_usb_t;
/* GPIO HAL */
typedef struct {
void (*init)(void);
void (*set_mode)(int led, int mode, uint16_t arg);
void (*poll)(void);
} hal_gpio_t;
/* Timer HAL */
typedef struct {
void (*init)(void);
uint32_t (*millis)(void);
uint64_t (*micros)(void);
} hal_timer_t;-
创建平台目录
port/<platform>/ ├── hal_can.c ├── hal_usb.c ├── hal_gpio.c ├── hal_timer.c └── config.h -
实现HAL接口
const hal_can_t *hal_can_get(void); const hal_usb_t *hal_usb_get(void); const hal_gpio_t *hal_gpio_get(void); const hal_timer_t *hal_timer_get(void);
-
配置硬件引脚 在
config.h中定义引脚映射。 -
调整时钟配置 根据目标平台时钟频率调整波特率计算。
| 特性 | PCAN-USB | PCAN-USB-PRO | Kvaser Leaf | SLCAN |
|---|---|---|---|---|
| 通道数 | 1 | 2 | 1 | 1 |
| CAN FD | ❌ | ✅ | ❌ | ❌ |
| 协议类型 | 二进制 | 二进制 | 二进制 | ASCII |
| USB端点 | 4 | 6 | 2 | 1 (CDC) |
| 厂商 | Peak | Peak | Kvaser | Lawicel |
| 开源驱动 | ✅ | ✅ | ✅ | ✅ |
- IDE: VSCode + Cortex-Debug / Keil MDK
- 编译器: ARM GCC / Keil ARMCC
- 调试器: ST-Link / J-Link
- CAN工具: PCAN-View / Kvaser CANking / Busmaster
- STM32: STM32 HAL库 / CMSIS
- ESP32: ESP-IDF 5.x
- USB: STM32 USB Device Library / TinyUSB
| 项目 | 许可证 |
|---|---|
| pcan_portable | MIT |
| pcan_pro_portable | MIT |
| kvaser_portable | BSD-new / GPLv2 (filo_cmds.h) |
| uds_diagnostic | MIT |
| slcan_prj | MIT |
- PCAN-USB Specification
- Kvaser CANlib SDK
- Lawicel SLCAN Protocol
- ISO 14229 UDS Specification
- ISO 15765-2 CAN TP
- ISO 13400 DoIP
- Fork本仓库
- 创建特性分支 (
git checkout -b feature/new-platform) - 提交更改 (
git commit -am 'Add STM32H7 support') - 推送到分支 (
git push origin feature/new-platform) - 创建Pull Request
- Issues: GitHub Issues
- Discussions: GitHub Discussions