主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
CAN总线重点课程 | 电路原理,跳线设置。协议分析。驱动程序。自检模式,其他CAN总线通信。 | 会设置CAN模式,会收发数据。 |
师从洋桃电子,杜洋老师
📑文章目录
▲ 回顾上期🔍STM32 CAN总线原理与应用开发指南(上) | 零基础入门STM32第六十一步

一、CAN总线基础概念
1.1 什么是CAN总线?
CAN(Controller Area Network)是ISO标准化的串行通信协议,由博世公司于1986年提出。其高可靠性使其广泛应用于汽车电子、工业自动化等领域。
1.2 CAN核心特性
- 多主控制:所有节点均可主动发送数据,通过ID仲裁优先级
- 错误处理:具备错误检测、通知和自动重发机制
- 故障隔离:可自动隔离持续故障节点
- 扩展性强:支持动态增减节点,无需修改现有系统
二、物理层标准对比
特性 | ISO11898(高速) | ISO11519-2(低速) |
---|---|---|
通信速率 | 125Kbps~1Mbps | <125Kbps |
传输距离 | <40M(1Mbps时) | 可达10KM(5Kbps时) |
典型应用场景 | 汽车ECU、实时控制 | 车身电子、仪表系统 |
总线电平 | 差分电压(CANH-CANL) | 单线传输 |
显性电平电压 | 2V | 1.5V |
三、CAN协议关键技术
3.1 通信机制
+------------------+
| 应用层 |
+------------------+
| 数据链路层 |
+------------------+
| 物理层 |
+------------------+
3.2 关键参数
-
波特率计算:
波特率 = PCLK1 / [(TSJW + TBS1 + TBS2) * BRP]
示例:36MHz/(1+8+7)*9 = 250Kbps -
数据帧结构:
- 最大数据长度:8字节
- 标准帧(11位ID)/扩展帧(29位ID)
四、STM32 CAN驱动代码解析
4.1 can.h核心配置
#define CAN_INT_ENABLE 0 // 接收中断开关
#define tsjw CAN_SJW_1tq // 同步跳转宽度
#define tbs1 CAN_BS1_8tq // 时间段1
#define tbs2 CAN_BS2_7tq // 时间段2
#define brp 9 // 波特率分频系数
// 初始化函数
u8 CAN1_Configuration(void);
// 发送函数(数据长度≤8)
u8 CAN_Send_Msg(u8* msg, u8 len);
// 接收函数(查询方式)
u8 CAN_Receive_Msg(u8 *buf);
4.2 初始化流程
4.3 主程序逻辑
int main(void) {
CAN1_Configuration(); // 初始化CAN
while(1) {
// 按键触发发送
if(按键按下) {
CAN_Send_Msg(buff, 1); // 发送1字节数据
}
// 查询接收
if(CAN_Receive_Msg(buff)) {
OLED显示接收数据;
}
}
}
五、开发注意事项
- 终端电阻:总线两端需接120Ω电阻消除反射
- 波特率匹配:所有节点必须配置相同波特率
- 数据分帧:超过8字节数据需分多次发送
- 错误处理:建议启用CAN错误中断进行诊断
六、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] CAN通信测试程序
[5] TJA1050 数据手册 + CAN总线协议
[6] CAN总线驱动程序分析.pptx
七、实践建议
- 通过逻辑分析仪观察CAN波形
- 尝试修改BRP值体验不同波特率
- 扩展实现CAN中断接收模式
- 结合CAN分析仪进行协议解析
通过理论结合实践,可以深入掌握CAN总线的精髓。建议阅读《CAN总线协议》并配合STM32参考手册进行二次开发。
本文全面解析了CAN总线的技术原理与STM32实现方案,包含协议要点、代码解析和实践建议,可作为CAN开发的快速入门指南。关键点总结清晰,扩展性强,便于读者在此基础上进行二次开发。
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨CAN总线驱动程序分析2
重点课程
,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-10)