CAN_基础知识
2026/5/16 11:16:16 网站建设 项目流程

CAN的介绍

低速CAN(ISO11519)通信速率10~125KbpS,总线长度可达1000米
高速CAN(ISO11898)通信速率125Kbps~1MbpS,总线长度≤40米
CAN总线由两根线(CANL和CANH)组成,允许挂载多个设备节点(低速CAN:2O高速CAN:30)
特点: 多主控制

物理层

使用差分信号,总线电平分为显性电平(逻辑0)和隐性电平(逻辑1)
显性电平具有优先权。发送方通过使总线电平发生变化,将消息发送给接收方。

can 收发器硬件电路

can 协议层

5种类型的帧:
数据帧(Data Frame):用于发送单元向接收单元传输数据的帧
遥控帧(RemoteFrame):用于接收单元向具有相同ID的发送单元请求数据
错误帧(ErrorFrame):用于当检测出错误时向其他单元通知错误的帧
过载帧(OverloadFrame):用于接收单元通知其尚未做好接收准备的帧
间隔帧(Inter Frame Space):用于将数据帧 及遥控帧与前面的帧分离开来的帧

数据帧介绍


帧起始:表示数据帧开始的段,显性信号
仲裁段:表示该帧优先级的段,优先级
控制段:表示数据的字节数及保留位的段
数据段:数据的内容,一帧可发送0~8字节数据
CRC段:检查帧的传输错误的段
ACK段:表示确认正常接收的段
帧结束:表示数据帧结束的段,7个隐性信号,也就是(1111111)

CAN位时序

CAN总线以“位同步”机制,实现对电平的正确采样.
位数据都由四段组成:同步段(SS)、 传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每段又由多个位时序Tq组成。

bxCAN 主要特点
  • 最高波特率:1 Mbps
  • 发送邮箱:3 级
  • 接收 FIFO:2 个,各 3 级深度
  • 过滤器组:最多 28 个(可配置掩码/列表模式,16/32 位)
  • 时间触发通信:内置硬件定时器,可在帧起始采样点生成时间戳
  • 协议支持:CAN 2.0A(标准帧)/ CAN 2.0B(扩展帧)
  • 工作模式:正常、静默、回环、回环静默
    自动完成数据帧的:帧起始检测、仲裁、位填充/去填充、CRC 校验、ACK 处理
CAN 测试模式总结

bxCAN 支持4 种测试模式,主要用于自检、调试和总线监听:

模式工作方式典型用途
正常模式正常收发,参与总线仲裁常规通信
静默模式只收不发,不发送 ACK 和错误帧总线监听,不影响总线
回环模式自发自收,不经过总线硬件自检
回环静默模式自发自收 + 不对外发送完全内部自检,不干扰总线
  • 正常:标准工作
  • 静默:只监听
  • 回环:自己发自己收
  • 回环静默:自己发自己收 + 不外发

注:测试模式下波特率仍受限制,需保证总线负载合理。

CAN内核:
包含各种控制/状态/配置寄存器,可以配置模式、波特率等
发送邮箱 :
用来缓存待发送的报文,最多可以缓存3个报文
接收FIFO :
缓存接收到的有效报文
接收过滤器 :
筛选有效报文

发送处理

接收处理

波特率

波特率 = CAN时钟频率 / (BRP × (BS1 + BS2 + 1))

Tq = BRP / CAN时钟频率

  • BRP:波特率预分频器(Baud Rate Prescaler,1~1024)

  • CAN时钟频率:通常来自 APB1 或 APB 总线时钟(STM32 常见 36MHz / 42MHz / 54MHz)

  • BS1:通常范围 1~16

  • BS2:通常范围 1~8

  • 采样点通常设为 60%~80% 位置:采样点 = (1 + BS1) / (1 + BS1 + BS2)

波特率计算 从 36MHz 到 125kbps 的推导过程
核心公式
125k = 36M / (BRP × (BS1 + BS2 + 1))
移项
BRP × (BS1 + BS2 + 1) = 36M / 125k = 288
分解 288
288 = 18 × 16
赋值
  • BRP = 18
  • BS1 + BS2 + 1 = 16 → 取 BS1=13, BS2=2
结果
36M / (18 × 16) = 36M / 288 = 125k ✅

三步走:除 → 分解 → 赋值,完事。

采样点计算 推荐:60% ~ 80%

采样点 = (1 + BS1) / (1 + BS1 + BS2)
举例(BS1=13, BS2=2)
采样点 = (1 + 13) / (1 + 13 + 2) = 14 / 16 = 87.5%

  • 分子:1 + BS1
  • 分母:1 + BS1 + BS2(即位时间总 Tq 数)
    一句话:采样点 = 相位段1占整个位时间的比例(包含同步段)。

HAL库相关驱动

函数关联寄存器功能
HAL_RCC_CANx_CLK_ENABLE()RCC使能 CAN 时钟
HAL_CAN_Init()MCR, BTR初始化 CAN(模式、波特率等)
HAL_CAN_ConfigFilter()过滤器寄存器配置接收过滤器
HAL_CAN_Start()MCR, MSR启动 CAN 设备
HAL_CAN_ActivateNotification()IER使能 CAN 中断
HAL_CAN_Enable_IT()IER使能特定中断源
HAL_CAN_AddTxMessage()TSR, TIxR, TDTxR添加发送消息
HAL_CAN_GetTxMailboxesFreeLevel()TSR获取空闲发送邮箱数
HAL_CAN_GetRxFifoFillLevel()RF0R, RF1R获取 FIFO 填充数
HAL_CAN_GetRxMessage()RF0R, RF1R, RDLxR, RDHxR读取接收消息
重要结构体
  • CAN_InitTypeDef:初始化参数(模式、BRP、BS1、BS2 等)
  • CAN_FilterTypeDef:过滤器配置(ID、掩码、模式、FIFO 分配)
  • CAN_TxHeaderTypeDef:发送帧头(ID、DLC、RTR 等)
  • CAN_RxHeaderTypeDef:接收帧头

CAN基本驱动步骤

1. CAN 参数初始化
  • 配置:工作模式、波特率等
  • 函数:HAL_CAN_Init()
2. 引脚与时钟(Msp 层)
  • 使能 CAN 时钟
  • GPIO 设为复用功能模式
  • 函数:HAL_CAN_MspInit()
3. 设置过滤器
  • 配置 ID、掩码、FIFO 分配
  • 函数:HAL_CAN_ConfigFilter()
4. 收发数据
  • 发送:HAL_CAN_AddTxMessage()
  • 接收:HAL_CAN_GetRxMessage()
5. 中断(可选)
  • 使能中断:_HAL_CAN_ENABLE_IT()
  • 编写中断服务函数

实战编程

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询