Skip to content

huanglian34/CAN_HOME

Repository files navigation

CAN_HOME - CAN总线开发工具集

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 可移植库

项目详解

1. PCAN系列 (Peak System)

pcan_portable - PCAN-USB可移植库

协议: 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();
    }
}

pcan_pro_portable - PCAN-USB-PRO可移植库

协议: 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个

pcan_prj - PCAN-USB完整项目

完整的STM32F0项目,包含:

  • Keil MDK工程
  • VSCode配置
  • 硬件驱动实现
  • 应用层代码

2. Kvaser系列

kvaser_portable - Kvaser Leaf可移植库

协议: 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 - 启停CAN
  • CMD_TX_STD_MESSAGE / CMD_TX_EXT_MESSAGE - 发送CAN帧
  • CMD_GET_CAPABILITIES_REQ - 获取能力
  • CMD_SET_DRIVERMODE_REQ - 设置驱动模式
  • CMD_LED_ACTION_REQ - LED控制

kvaser_cantact-master - 原始固件参考

CANtact/CANable开源固件,基于STM32F042。


3. SLCAN协议

slcan_prj - Lawicel SLCAN实现

协议: Lawicel CAN232/CANUSB (ASCII协议)

特性:

  • ASCII命令接口
  • 串口通信
  • 简单易用
  • 适合调试

常用命令:

  • O - 打开CAN通道
  • C - 关闭CAN通道
  • Sx - 设置波特率
  • tIDDLCDATA - 发送标准帧
  • TIDDLCDATA - 发送扩展帧
  • rIDDLCDATA - 发送远程帧

4. UDS诊断框架

uds_diagnostic - ISO 14229 UDS实现

协议: 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控制

5. Modbus协议

modbus_portable - Modbus RTU/TCP可移植库

协议: 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

架构设计

HAL抽象层设计

所有portable项目采用统一的分层架构:

┌─────────────────────────────────────┐
│          Application Layer          │
├─────────────────────────────────────┤
│          Protocol Layer (Core)      │  ← 平台无关
├─────────────────────────────────────┤
│          HAL Interface              │  ← 抽象接口
├─────────────────────────────────────┤
│          Platform Implementation    │  ← 平台相关
├─────────────────────────────────────┤
│          Hardware                   │
└─────────────────────────────────────┘

HAL接口统一规范

/* 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;

移植指南

移植到新平台步骤

  1. 创建平台目录

    port/<platform>/
    ├── hal_can.c
    ├── hal_usb.c
    ├── hal_gpio.c
    ├── hal_timer.c
    └── config.h
    
  2. 实现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);
  3. 配置硬件引脚config.h 中定义引脚映射。

  4. 调整时钟配置 根据目标平台时钟频率调整波特率计算。


协议对比

特性 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

参考资料

协议文档

开源项目


贡献指南

  1. Fork本仓库
  2. 创建特性分支 (git checkout -b feature/new-platform)
  3. 提交更改 (git commit -am 'Add STM32H7 support')
  4. 推送到分支 (git push origin feature/new-platform)
  5. 创建Pull Request

联系方式

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors