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 数据段协议异常

相关推荐
来自晴朗的明天7 小时前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
钰珠AIOT7 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件
代码游侠7 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
代码游侠18 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg200520 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT1 天前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen1 天前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠1 天前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_1 天前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件