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

相关推荐
MingYue_SSS2 小时前
开关电源抄板学习
经验分享·笔记·嵌入式硬件·学习
玉树临风江流儿2 小时前
炸鸡派-定时器基础例程
单片机·嵌入式硬件
小宋同学在不断学习3 小时前
stm32-掌握SPI原理(一)
stm32·单片机·spi
is08153 小时前
STM32的 syscalls.c 和 sysmem.c
c语言·stm32·嵌入式硬件
学不动CV了4 小时前
数据结构---链表结构体、指针深入理解(三)
c语言·arm开发·数据结构·stm32·单片机·链表
szxinmai主板定制专家5 小时前
【精密测量】基于ARM+FPGA的多路光栅信号采集方案
服务器·arm开发·人工智能·嵌入式硬件·fpga开发
工业互联网专业8 小时前
汇编与接口技术:8259中断实验
汇编·单片机·嵌入式硬件·8259中断实验
brave and determined8 小时前
国产MCU学习Day6——CW32F030C8T6: I2C功能详解与应用案例
单片机·eeprom·i2c·cw32f030c8t6·cw32·cw32f030·中断读取eeprom
梁山1号9 小时前
【ESP32】3.串口的发送与接受
单片机·物联网
KaiGer6669 小时前
AUTOSAR进阶图解==>AUTOSAR_SWS_V2XFacilities
单片机·汽车·嵌入式·autosar