STM32 CANFD 基础知识留档

讲得比较细的文章但可能有问题自行判定

附1
附2

前言

CAN2.0 协议中数据段波特率和仲裁段波特率默认是一致,因此只需要关注传输波特率即可

CANFD 协议是向下兼容 CAN2.0 的数据通讯,因此实际使用中需要配置

STM32H7 系列支持的标准是 Compliant with CAN protocol version 2.0 part A, B and ISO 11898-1: 2015, -4

协议结构说明



要点一:仲裁段,数据段 速率可以根据自己的需求设定,其中 仲裁段最大 1Mb/s,数据段最大8Mb/s(实际工况基本都是 2Mb/s左右)

要点二:CAN-FD 长度表示如图2,超过8字节内容需要按照规定设置发送长度

模拟 CAN2.0 部分
1. CubeMX 配置


参数说明自行检索即可

其中 FrameFormat 和 Mode 这两个部分按标准模式类型,这种情况下仲裁段和数据段波特率会保持一致,主要配置【Bit Timings Parameters】部分的内容
CAN 时钟频率是 120M

计算公式 120/24/(1+7+2) = 500Kb/s

2. RX 过滤 & FDCAN 启用
c 复制代码
// 指定ID过滤范例,还有很多模式自行探索
static void can_set_filter(void)
{
    FDCAN_FilterTypeDef  sFilterConfig; 

    sFilterConfig.IdType = FDCAN_STANDARD_ID;
    sFilterConfig.FilterIndex = 0;
    sFilterConfig.FilterType = FDCAN_FILTER_DUAL;
    sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    sFilterConfig.FilterID1 = CAN_SYNC_TIME_INFO_ID;
    sFilterConfig.FilterID2 = CAN_IMU_CTRL_ID;
         
    if(HAL_FDCAN_ConfigFilter(&NOR_CAN, &sFilterConfig) != HAL_OK)  
    {  
        Error_Handler();  
    }  

    sFilterConfig.FilterIndex = 1;
    sFilterConfig.FilterID1 = CAN_IMU_UPDATE;
    if(HAL_FDCAN_ConfigFilter(&NOR_CAN, &sFilterConfig) != HAL_OK)  
    {  
        Error_Handler();  
    } 

    HAL_FDCAN_ConfigGlobalFilter(&NOR_CAN, FDCAN_REJECT, FDCAN_REJECT, DISABLE, DISABLE);
}

// 启用范例
    /// 设置过滤函数
    can_set_filter();
    /// 设置中断使能
    ///< 断线自动恢复 默认功能
    HAL_FDCAN_ActivateNotification(&NOR_CAN, FDCAN_IT_BUS_OFF | FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_RX_FIFO0_FULL, 0);

    /// 启动 CAN
    HAL_FDCAN_Start(&NOR_CAN);
CAN-FD 部分
1. CubeMX 配置 (未启用自动重发)

仲裁段参数名

Nominal Sync Jump With

Nominal Prescaler

Nominal Time Seg1

Nominal Time Seg2
数据段参数名

Data Prescalr

Data Sync Jump With

Data Time Seg1

Data Time Seg2

  • 收发双方确保这三项一致比较合理,1. 仲裁波特率 2. 数据波特率 3. 采样点比例
  • 截图是 120M 时钟,仲裁 500Kb/s 数据段 2Mb/s 采样点 0.8
  • Sync Jump With 这个主要是动态调整通讯长度的不能比 Seg1和 Seg2 大一般默认跟最小的一致

计算(数据中的1,实际上是 Sync_Seg 默认就是 1)

波特率计算 时钟/Pre/(1+Seg1+Seg2) 采样点 (1+Seg1) / (1 + Seg1 + Seg2)

仲裁段 120M/24/(1+7+2) = 500Kb/s, 采样点 (1+7) / (1 + 7 + 2) = 0.8 (80%)

数据段 120M/6/(1+7+2) = 2Mb/s 采样点 (1+7)/(1+7+2) = 0.8 (80%)

2. Tx 发送 & FDCAN 启用
复制代码
 // 发送 64 字节
 {
    static FDCAN_TxHeaderTypeDef Tx_Header;
    static uint32_t _id;

    va_list args;
    va_start(args, size);
    _id = va_arg(args, uint32_t);

    Tx_Header.Identifier = _id;
    Tx_Header.IdType = FDCAN_STANDARD_ID;
    Tx_Header.TxFrameType = FDCAN_DATA_FRAME;
    Tx_Header.DataLength = FDCAN_DLC_BYTES_64;
    Tx_Header.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
    Tx_Header.BitRateSwitch = FDCAN_BRS_ON;
    Tx_Header.FDFormat = FDCAN_FD_CAN;
    Tx_Header.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
    Tx_Header.MessageMarker = 0;
    
    if (HAL_FDCAN_AddMessageToTxFifoQ(&FDCAN, &Tx_Header, buff) == HAL_OK) {
        return;
    }
    }
3. 是否异常查看寄存器 IR

PEA 仲裁段协议异常

PED 数据段协议异常

相关推荐
Tel1992530800411 分钟前
旋转变压器型编码器转多种绝对值协议 旋变转SSI/BISS-C/ENDAT2.2 RS422RTU协议+增量 转换器
单片机·自动化·工业自动化·仪器仪表·工控设备
国科安芯16 分钟前
LEO卫星里的IO脉冲事件通信,毛刺误触发解析及处理方案
单片机·嵌入式硬件·fpga开发·低轨卫星·商业航天·抗辐射
2501_9226395818 分钟前
率能半导体 SS6813H双通道H桥驱动芯片:40V/2.5A,覆盖POS打印机、安防相机、办公自动化、游戏机、机器人五大应用场景
单片机·嵌入式硬件·硬件工程
智购科技无人售货机厂家1 小时前
自动售货机物联网平台为什么会出现在线状态不一致?~YH
python·单片机·嵌入式硬件·django·pygame
zhangrelay10 小时前
新版|-|单片机原理与接口技术-2026持续改进优化-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈
笔记·单片机·嵌入式硬件·学习
comyccccc11 小时前
STM32F103C8T6最小系统板设计全解析学习笔记
单片机·1024程序员节
Industio_触觉智能11 小时前
把NPU检测直接嵌进采集终端|RK3576 AI采集终端全链路拆解教程-下
嵌入式硬件·ai·硬件架构·npu·ai视觉·rk3576·采集终端
en.en..11 小时前
STM32 GPIO ODR 与 BSRR 寄存器完整对比详解
单片机·嵌入式硬件
HQB202614 小时前
EG1182|屹晶微电子 60V 内置高压管异步降压 DC‑DC
嵌入式硬件·硬件工程
LCG米15 小时前
STM32硬件SPI驱动SSD1306 OLED实测:上电黑屏排查、页寻址模式与取模扫描方向陷阱
stm32·单片机·嵌入式硬件·嵌入式