硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5170|回复: 4
收起左侧

[CAN/FDCAN] STM32H7的CAN FD波特率计算,含常规通信波特率和数据通信阶段的可变波特率

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-3-18 10:51:34 | 显示全部楼层 |阅读模式
1、可变波特率和常规波特率阶段



CAN FD中的FD含义就是flexible data,灵活数据通信,且波特率可以和仲裁阶段波特率不同。

看上面的图,意思就是红色部分可以是一个波特率,蓝色部分也可以是一个波特率。

2、波特率计算公式,看如下的位时间特性图

1.png

1bit的CAN FD数据需要时间由Sync_Seg + Pro_Seg + Phase_Seg1 + Phase_Seg2组成,这些时间的单位就是CAN FD时钟最小分辨率,比如20MHz时钟,那么单位Tq就是50ns。

仲裁阶段波特率对应的HAL库配置如下:
hfdcan2.Init.NominalPrescaler = 0x1;             /* CAN时钟分配设置,一般设置为1即可,全部由PLL配置好,tq = NominalPrescaler x (1/ fdcan_ker_ck) */
hfdcan2.Init.NominalTimeSeg1 = 0x1F;          /* 特别注意这里的Seg1,这里是两个参数之和,对应位时间特性图的 Pro_Seg + Phase_Seg1 */
hfdcan2.Init.NominalTimeSeg2 = 0x8;            /* 对应位时间特性图的 Phase_Seg2 */
hfdcan2.Init.NominalSyncJumpWidth = 0x8;   /* 用于动态调节  Phase_Seg1和 Phase_Seg1,所以不可以比Phase_Seg1和 Phase_Seg1大 */

所以CAN时钟是20MHz时,仲裁阶段的波特率就是CAN FD Freq / (Sync_Seg + Pro_Seg + Phase_Seg1 + Phase_Seg2) = 20MHz / (1+0x1F + 8) = 0.5Mbps

数据阶段波特率对应的HAL库配置如下:
hfdcan2.Init.DataPrescaler = 0x1;                /* CAN时钟分配设置,一般设置为1即可,全部由PLL配置好,tq = NominalPrescaler x (1/ fdcan_ker_ck) */
hfdcan2.Init.DataTimeSeg1 = 0x5;               /* 特别注意这里的Seg1,这里是两个参数之和,对应位时间特性图的 Pro_Seg + Phase_Seg1 */
hfdcan2.Init.DataTimeSeg2 = 0x4;              /* 对应位时间特性图的 Phase_Seg2 */
hfdcan2.Init.DataSyncJumpWidth = 0x4;      /* 用于动态调节  Phase_Seg1和 Phase_Seg1,所以不可以比Phase_Seg1和 Phase_Seg1大 */

所以CAN时钟是20MHz时,数据阶段的波特率就是CAN FD Freq / (Sync_Seg + Pro_Seg + Phase_Seg1 + Phase_Seg2) = 20MHz / (1+5+ 4) = 2Mbps


STM32H7在400MHz情况下,PLL配置输出20MHz的CAN FD时钟(大家可以使用STM32CubeMX来配置的):

  1.                 /* Select PLL2Q as source of FDCANx clock */
  2.         PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
  3.         PeriphClkInitStruct.PLL2.PLL2M = 5;
  4.         PeriphClkInitStruct.PLL2.PLL2N = 80;
  5.         PeriphClkInitStruct.PLL2.PLL2P = 2;
  6.         PeriphClkInitStruct.PLL2.PLL2Q = 20;
  7.         PeriphClkInitStruct.PLL2.PLL2R = 2;
  8.         PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
  9.         PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
  10.         PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
  11.         PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL2;
  12.         if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  13.         {
  14.             Error_Handler(__FILE__, __LINE__);
  15.         }
复制代码




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2021-3-18 13:03:23 | 显示全部楼层
博世文档:
cia99paper.pdf (189.11 KB, 下载次数: 51)
回复

使用道具 举报

23

主题

34

回帖

103

积分

初级会员

积分
103
发表于 2021-3-18 15:35:09 | 显示全部楼层
CAN, FDCAN相互兼容吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2021-3-18 15:43:18 | 显示全部楼层
xxs65 发表于 2021-3-18 15:35
CAN, FDCAN相互兼容吗?

CAN FD可以配置为经典CAN
回复

使用道具 举报

20

主题

114

回帖

174

积分

初级会员

积分
174
发表于 2021-3-19 08:25:19 | 显示全部楼层
a端can,b端canfd:
a端发送,b端可以正常接收。
b端发送,a端不能正常接收。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 20:44 , Processed in 0.259921 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表