在汽车电子开发中,CAN 通信是核心功能之一。本文结合项目经验,整理了从硬件确认到测试验证的完整开发步骤,并补充了寄存器配置示例、状态机设计思路和代码片段,帮助开发者更快落地。
目录
[1. 硬件确认](#1. 硬件确认)
[2. 需求文档确认](#2. 需求文档确认)
[3. 数据库与诊断文件](#3. 数据库与诊断文件)
[4. CAN驱动开发](#4. CAN驱动开发)
[5. 升级功能准备](#5. 升级功能准备)
[6. 基本设计书](#6. 基本设计书)
[7. 详细设计书](#7. 详细设计书)
[8. 代码设计与实现](#8. 代码设计与实现)
[9. 测试与验证](#9. 测试与验证)
1. 硬件确认
-
与电气、项目负责人确认 MCU 芯片和 CAN 收发器型号。
-
确认 CAN_TX、CAN_RX、CAN_STB 等引脚分配,检查是否支持唤醒功能。
-
根据芯片手册确认寄存器配置和唤醒引脚适配性。
示例:CAN 引脚配置(伪代码)
// 配置 CAN_TX, CAN_RX 引脚复用
PORT_SetPinMux(PORTB, PIN2, kPORT_MuxAlt2); // CAN_TX
PORT_SetPinMux(PORTB, PIN3, kPORT_MuxAlt2); // CAN_RX
2. 需求文档确认
-
通道配置:确认是否有 CAN 数据库(DBC 文件),定义报文 ID、信号等。
-
睡眠管理:设计 MCU 与收发器的休眠/唤醒策略。
-
UDS诊断:确认诊断服务需求,设计会话管理、安全访问、错误响应。
3. 数据库与诊断文件
-
CAN 数据库:客户提供的可能是 DBC 文件或矩阵表;若无则需自行创建。
-
诊断数据库(CDD 文件):通常由开发团队编写,定义 UDS 服务、DID、例程 ID、安全访问机制。
4. CAN驱动开发
-
驱动来源:购买的配置包(如 AUTOSAR MCAL)或自行编写寄存器驱动。
-
关键配置:波特率、唤醒模式、滤波器与掩码、中断与错误处理。
示例:波特率配置(假设 500 kbps)
CAN_InitTypeDef CAN_InitStruct;
CAN_InitStruct.baudRate = 500000; // 500 kbps
CAN_InitStruct.samplePoint = 75; // 采样点 75%
CAN_Init(&CAN_InitStruct);
5. 升级功能准备
-
升级诊断数据库:创建支持 UDS 升级的 CDD 文件(0x34 下载请求、0x36 数据传输等)。
-
驱动代码:编写 Flash 擦写驱动、Bootloader 与应用切换逻辑。
示例:Flash 擦写接口
bool Flash_Erase(uint32_t address, uint32_t size);
bool Flash_Write(uint32_t address, uint8_t *data, uint32_t length);
6. 基本设计书
-
接口设计:电源管理接口、统一 CAN 报文收发接口、诊断接口。
-
掉电保存数据:设计 DTC 等数据的存储结构和掉电保存机制。
7. 详细设计书
-
资源使用:内存占用、中断使用与保护。
-
模块划分:初始化、发送、接收、错误处理、诊断等子模块。
-
状态迁移图:
- 初始化 → 正常通信 → 休眠 → 唤醒 → 错误恢复。
-
Failsafe:通信错误进入安全状态,升级失败回退版本。
8. 代码设计与实现
-
使用模板修改或自行编写,保持结构清晰、可移植性强。
-
遵循详细设计书,保持接口一致性。
示例:CAN 报文发送函数
bool CAN_SendMessage(uint32_t id, uint8_t *data, uint8_t length) {
CAN_Frame frame;
frame.id = id;
frame.length = length;
memcpy(frame.data, data, length);
return CAN_Transmit(&frame);
}
9. 测试与验证
-
代码阶段测试:静态解析(MISRA-C)、动态检测(单元测试)。
-
接口测试:验证模块间交互、初始化流程、状态迁移。
-
机能测试:台架环境下验证报文收发、唤醒/休眠、错误处理、诊断服务。
-
集成与整车测试:验证电源管理、诊断接口、通信接口整体功能。
总结
这套 1--9 步开发流程覆盖了从硬件到文档、从驱动到诊断、从升级到测试的完整闭环。通过寄存器配置示例、状态机设计和代码片段,开发者可以更快落地,实现稳定可靠的 CAN 通信功能。