CAN总线详解

admin 2026-09-29 04:53:58 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了CAN总线的基本概念、物理层结构、STM32CAN控制器架构、通信协议、配置步骤、HAL库编程实战、调试技巧与软件以及应用案例,为读者提供了全面了解CAN总线的技术资料。 综合评分: 80 文章分类: 嵌入式系统,物联网安全,数据安全,网络安全,其他


CAN总线详解

谈思实验室

2026年9月28日 18:17 上海

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

点击上方蓝字谈思实验室

获取更多汽车网络安全资讯

01

CAN总线基础概念

1.1 CAN总线简介

控制器局域网(Controller Area Network, CAN)是由Bosch公司开发的串行通信协议,专为汽车电子和工业控制设计,具有以下核心特性:

  • 多主控制架构:所有节点均可主动发送数据
  • 差分信号传输:CAN_H与CAN_L双绞线抗干扰
  • 非破坏性仲裁:基于ID优先级的冲突解决机制
  • 高可靠性:CRC校验、错误帧检测等安全机制

1.2 CAN物理层结构

物理连接示意图:

|  |
| --- |
| STM32 CAN收发器 CAN总线|------| |------| |--------| | | TX ----| TXD | | CAN_H | | CAN | | |--------| | | 控制 | RX ----| RXD | | CAN_L | | 器 | |------| |--------| |------| ↑ VCC(5V) |

#

02

STM32 CAN控制器架构

关键效果单元

1、发送邮箱:3个独立邮箱(F1/F4系列)

  • 优先级管理机制
  • 自动重传特性

2、接收FIFO:2个FIFO(FIFO0/FIFO1)

  • 每个FIFO深度3个报文
  • 可配置溢出处理

3、过滤器组:最多28个(F4系列)

  • 工作模式:掩码模式/列表模式
  • 尺度选择:16位/32位

03

CAN通信协议详解

3.1 数据帧结构

|  |
| --- |
| ┌───┬───────┬──────┬───┬───────┬──────┬──────┬───┬───┐ │SOF│Arbitr.│Control│IDE│Data │ CRC │ ACK │EOF│IFS│ │1 │11/29 │6 │1 │0-64 │16 │2 │7 |3 |└───┴───────┴──────┴───┴───────┴──────┴──────┴───┴───┘ |
  • SOF:帧起始(显性电平)
  • Arbitration:ID+ RTR位(11位标准/29位扩展)
  • Control:DLC(数据长度0-8字节)
  • CRC:15位校验 + 1位界定符
  • ACK:应答槽 + 应答界定符

3.2 波特率配置

计算公式:

|  |
| --- |
| 波特率 =APB1时钟/ (Prescaler* (BS1 + BS2 + 1 ) ) |

位时间组成:

|  |
| --- |
| ┌───┬──────────────┬──────────────┐ │SYNC│BS1(Prop) │ BS2(Ph2)│ ├───┼─────┬────┬───┼─────┬────┬───┤ │1│ TQ1│...│TQn│ TQ1│...│TQm│ └───┴─────┴────┴───┴─────┴────┴───┘ |
  • SYNC_SEG:固定1个时间量子(TQ)
  • BS1:传播时间段(1-16 TQ)
  • BS2:相位缓冲段2(1-8 TQ)

04

STM32CubeMX配置步骤

4.1 基础配置流程

1、在Pinout视图启用CAN

2、配置参数:

  • Mode:Normal/Loopback
  • Bit Timings:设置Prescaler/BS1/BS2

3、过滤器配置:

  • Filter Activate:Enable
  • Scale:32-bit/16-bit
  • Mode:Mask/List

4、NVIC设置:启用接收中断

4.2 推荐调整参数(500kbps)

05

HAL库编程实战

5.1 CAN初始化代码

|  |
| --- |
| CAN_HandleTypeDef hcan;CAN_FilterTypeDef filter; voidCAN_Init( void ) { hcan.Instance= CAN1; hcan.Init.Prescaler= 6 ; hcan.Init.Mode =CAN_MODE_NORMAL; hcan.Init.SyncJumpWidth=CAN_SJW_1TQ; hcan.Init.TimeSeg1=CAN_BS1_8TQ; hcan.Init.TimeSeg2=CAN_BS2_3TQ; hcan.Init.TimeTriggeredMode=DISABLE; hcan.Init.AutoBusOff=DISABLE; hcan.Init.AutoWakeUp=DISABLE; hcan.Init.AutoRetransmission=ENABLE; hcan.Init.ReceiveFifoLocked=DISABLE; hcan.Init.TransmitFifoPriority=DISABLE; if (HAL_CAN_Init(&hcan) !=HAL_OK) { Error_Handler( ) ; } // 配备过滤器(接收所有消息)filter.FilterBank= 0 ;filter.FilterMode=CAN_FILTERMODE_IDMASK;filter.FilterScale=CAN_FILTERSCALE_32BIT;filter.FilterIdHigh= 0x0000 ;filter.FilterIdLow= 0x0000 ;filter.FilterMaskIdHigh= 0x0000 ;filter.FilterMaskIdLow= 0x0000 ;filter.FilterFIFOAssignment=CAN_FILTER_FIFO0;filter.FilterActivation=ENABLE; HAL_CAN_ConfigFilter(&hcan, &filter) ; HAL_CAN_Start(&hcan) ; HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING) ; } |

5.2 素材发送函数

|  |
| --- |
| uint8_tCAN_Send(uint32_t id, uint8_t* data, uint8_t len) {CAN_TxHeaderTypeDef txHeader; uint32_ttxMailbox;txHeader.StdId = id; // 标准IDtxHeader.ExtId = 0 ; // 扩展ID(标准帧设为0)txHeader.IDE =CAN_ID_STD; // 使用标准帧txHeader.RTR =CAN_RTR_DATA; // 数据帧txHeader.DLC = len; // 数据长度txHeader.TransmitGlobalTime=DISABLE; if(HAL_CAN_AddTxMessage(&hcan, &txHeader, data, &txMailbox) !=HAL_OK) { return 0 ; // 发送失败 } // 等待发送完成 while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) != 3 ) ; return 1 ; } |

5.3 中断接收处理

|  |
| --- |
| voidHAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef*hcan) {CAN_RxHeaderTypeDef rxHeader; uint8_trxData[8] ;&nbsp;if(HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0, &rxHeader,rxData) ==HAL_OK) {&nbsp;uint32_t&nbsp;id =rxHeader.StdId;&nbsp;// 获取标准ID uint8_t len =rxHeader.DLC; // 素材长度 // 处理接收数据 (示例: 串口转发) printf("ID:0x%X Data:" , id) ; for( int i=0 ; i<len; i++ ) { printf("%02X " ,rxData[i] ) ; } printf("\n" ) ; } } |

#

06

调试技巧与软件

6.1 常见调试工具

6.2 典型问题排查

1、无法通信:

  • 检查终端电阻(总线两端各120Ω)
  • 验证波特率配置一致性
  • 测量CAN_H-CAN_L差分电压(2V左右)

2、数据丢失:

  • 增加接收FIFO深度
  • 优化过滤器设置减少无关报文
  • 提升中断优先级

3、总线错误:

  • 使用HAL_CAN_GetError()获取错误码
  • 否受干扰就是检查物理线路
  • 降低波特率测试稳定性

07

应用案例

7.1 汽车电子网络

|  |
| --- |
| ┌──────────────┐ ┌──────────────┐ │ 发动机控制器 │◄─────►│ 车身控制模块 │ ├──────────────┤ ├──────────────┤ │&nbsp;CAN总线 │◄──┐ ┌─►│ 仪表盘显示 │ └──────▲───────┘ │ │ └──────────────┘ │ ▼ ▼ ┌──────┴───────┐ ┌──────────────┐ │ 制动框架 │ │ 网关控制器 │ └──────────────┘ └──────────────┘ |

7.2 工业控制系统

最佳实践提示:在工业环境中,建议使用带隔离的CAN收发器(如ISO1050)并增加TVS管保护电路,可显著提升系统抗干扰能力。

附录:CAN资源速查表

来源:

https://www.cnblogs.com/ljbguanli/p/18916660

end

谈思汽车媒体门户

精品活动推荐

AutoSec系列沙龙

专业社群

部分入群专家来自:

新势力车企:

特斯拉、理想、极氪、小米、零跑汽车、阿维塔汽车、智己汽车、小鹏、岚图汽车、蔚来汽车、吉祥汽车、赛力斯……

外资传统主流车企代表:

大众中国、大众酷翼、奥迪汽车、宝马、福特、戴姆勒-奔驰、通用、保时捷、沃尔沃、现代汽车、日产汽车、捷豹路虎、斯堪尼亚……

内资传统主流车企:

吉利汽车、上汽乘用车、长城汽车、上汽大众、长安汽车、北京汽车、东风汽车、广汽、比亚迪、一汽集团、一汽解放、东风商用、上汽商用……

全球领先一级供应商:

博世、大陆集团、联合汽车电子、安波福、采埃孚、科世达、舍弗勒、霍尼韦尔、大疆、日立、哈曼、华为、百度、联想、联发科、普瑞均胜、德赛西威、蜂巢转向、均联智行、武汉光庭、星纪魅族、中车集团、潍柴集团、地平线、紫光同芯、字节跳动、……

二级供应商(500+以上):

中科数测、ETAS、BlackDuck、NXP、上海软件中心、Deloitte、奇安信、为辰信安、云驰未来、信长城、泽鹿安全、纽创信安、复旦微电子、天融信、奇虎360、中汽中心、中国汽研、上海汽检、加特兰微电子、浙江大学……

人员占比

公司类型占比

文章

不要错过哦,这可能是汽车网络安全产业最大的专属社区!

关于涉嫌仿冒AutoSec会议品牌的律师声明

一文带你了解智能汽车车载网络通信安全架构

网络安全:TARA方法、工具与案例

汽车数据安全合规重点分析

浅析汽车芯片信息安全之安全启动

域集中式架构的汽车车载通信安全方案探究

系统安全架构之车辆网络安全架构

车联网中的隐私保护问题

智能网联汽车网络安全技术研究

AUTOSAR 信息安全框架和关键技术分析

AUTOSAR 信息安全机制有哪些?

信息安全的底层机制

汽车网络安全

Autosar硬件安全模块HSM的使用

首发!小米雷军两会上就汽车数据安全问题建言:关于构建完善汽车数据安全管理体系的建议


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:谈思实验室 《CAN总线详解》

CAN总线详解 网络安全文章

CAN总线详解

文章总结: 本文详细介绍了CAN总线的基本概念、物理层结构、STM32CAN控制器架构、通信协议、配置步骤、HAL库编程实战、调试技巧与软件以及应用案例,为读者
评论:0   参与:  0