硬汉嵌入式论坛

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

[CAN/FDCAN] FDCAN中问题

  [复制链接]

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-5-12 12:59:02 | 显示全部楼层 |阅读模式
H7中已经支持FDCAN了,但是看了下FDCAN的源码对比了下寄存器,发现还是有问题的。
TIM图片20190512125546.png
这里是对SIDFC的寄存器说明。
但是在库函数中对SIDFC寄存器配置的函数只有下面两句
  1.   /* Standard filter list start address */
  2.   MODIFY_REG(hfdcan->Instance->SIDFC, FDCAN_SIDFC_FLSSA, (hfdcan->msgRam.StandardFilterSA << 2));

  3.   /* Standard filter elements number */
  4.   MODIFY_REG(hfdcan->Instance->SIDFC, FDCAN_SIDFC_LSS, (hfdcan->Init.StdFiltersNbr << 16));
复制代码
也就是只是配置我上图红框部分的配置,其他的功能目前如果使用库函数是无法使用的。

是否还有其他问题,在往下发掘一下。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-5-12 13:04:30 | 显示全部楼层
请教一个问题就是 消息RAM怎么理解
TIM截图20190512125904.png
这里说了最大是2560个字。那么RX FIFO0 RXFIFO1 RXBUFF区域相加就已经超过2560了。
但是这几个区域的的elements 相加远远达不到2560。

这里是否理解成 有多少elements 就占据多大的空间,后面的words表示最大可以占到多大空间。但是累计相加不得超过2560words.

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2019-5-13 02:04:43 | 显示全部楼层
王海靖 发表于 2019-5-12 13:04
请教一个问题就是 消息RAM怎么理解

这里说了最大是2560个字。那么RX FIFO0 RXFIFO1 RXBUFF区域相加就已 ...

CANFD还没有还是研究,过几天整教程,我们交流
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-5-13 08:44:26 | 显示全部楼层
eric2013 发表于 2019-5-13 02:04
CANFD还没有还是研究,过几天整教程,我们交流

好的好的
回复

使用道具 举报

28

主题

274

回帖

358

积分

高级会员

积分
358
发表于 2019-5-13 09:35:47 | 显示全部楼层
顶一下
回复

使用道具 举报

0

主题

32

回帖

32

积分

新手上路

积分
32
发表于 2019-5-13 14:31:54 | 显示全部楼层
期待大侠研究成果
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-5-15 19:36:57 | 显示全部楼层
给ST发邮件得到了回复。

RAM message空间总共就那么多,可以安排给那些section。具体怎么安排,根据实际应用,遵照各个section的空间限制和总空间限制即可。
比方我只用RX FIFO0,大小为2个字,RX_BUFFER 设置为20个字。

TIM截图20190515193154.png
这里做了说明:没有必要配置每个部分,也没有任何顺序限制。

FDCAN 不会检查消息 RAM 的配置是否存在错误。因此配置不同部分的起始地址以及各部分 的元素数时必须多加留意,以免造成数据入侵或丢失

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2019-5-16 02:18:25 | 显示全部楼层
王海靖 发表于 2019-5-15 19:36
给ST发邮件得到了回复。
RAM message空间总共就那么多,可以安排给那些section。具体怎么安排,根据实际应 ...

谢谢告知这个问题。
回复

使用道具 举报

1

主题

33

回帖

36

积分

新手上路

积分
36
发表于 2019-5-19 10:12:14 | 显示全部楼层
我最近在调试FDCAN时就遇到了这个问题。特别是在使用了2个FDCAN时,第二个FDCAN是需要调整RamOffset这个参数的。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-5-19 14:49:11 | 显示全部楼层
本帖最后由 王海靖 于 2019-5-19 16:05 编辑
andre_king 发表于 2019-5-19 10:12
我最近在调试FDCAN时就遇到了这个问题。特别是在使用了2个FDCAN时,第二个FDCAN是需要调整RamOffset这个参 ...

我只测试了FDCAN1。
RamOffset这个变量在FDCAN_CalcultateRamBlockAddresses函数中被调用
  1.   /* Standard filter list start address */
  2.   MODIFY_REG(hfdcan->Instance->SIDFC, FDCAN_SIDFC_FLSSA, (hfdcan->msgRam.StandardFilterSA << 2));

  3.   /* Standard filter elements number */
  4.   MODIFY_REG(hfdcan->Instance->SIDFC, FDCAN_SIDFC_LSS, (hfdcan->Init.StdFiltersNbr << 16));
复制代码
可以看到这个变量最后的作用是去配置了SIDFC寄存器。
通过手册参看SIDFC寄存器的作用
TIM截图20190519160027.png
左移16位 标准滤波器的列表大小,且最大为128
左移2位  标准滤波器的起始地址
这里就明白了,如果你使用FDCAN2的滤波器这个地方要按照实际的情况去设置 MessageRAMOffset

回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-5-23 14:04:55 | 显示全部楼层
andre_king 发表于 2019-5-19 10:12
我最近在调试FDCAN时就遇到了这个问题。特别是在使用了2个FDCAN时,第二个FDCAN是需要调整RamOffset这个参 ...

用了两个FDCAN,初始化时怎么配置呢,可以看看你的初始化配置代码吗?
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2019-5-23 14:08:54 | 显示全部楼层
andre_king 发表于 2019-5-19 10:12
我最近在调试FDCAN时就遇到了这个问题。特别是在使用了2个FDCAN时,第二个FDCAN是需要调整RamOffset这个参 ...

把RxFifo0分配给FDCAN1,把RxFifo1分配给FDCAN2不就行了吗?MessageRAMOffset是干啥用的呢?
  1. /* FDCAN1 init function */
  2. void MX_FDCAN1_Init(void)
  3. {

  4.   hfdcan1.Instance = FDCAN1;
  5.   hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
  6.   hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
  7.   hfdcan1.Init.AutoRetransmission = DISABLE;
  8.   hfdcan1.Init.TransmitPause = DISABLE;
  9.   hfdcan1.Init.ProtocolException = DISABLE;
  10.   hfdcan1.Init.NominalPrescaler = 10;
  11.   hfdcan1.Init.NominalSyncJumpWidth = 8;
  12.   hfdcan1.Init.NominalTimeSeg1 = 31;
  13.   hfdcan1.Init.NominalTimeSeg2 = 8;
  14.   hfdcan1.Init.DataPrescaler = 10;
  15.   hfdcan1.Init.DataSyncJumpWidth = 4;
  16.   hfdcan1.Init.DataTimeSeg1 = 5;
  17.   hfdcan1.Init.DataTimeSeg2 = 4;
  18.   hfdcan1.Init.MessageRAMOffset = 0;
  19.   hfdcan1.Init.StdFiltersNbr = 1;
  20.   hfdcan1.Init.ExtFiltersNbr = 0;
  21.   hfdcan1.Init.RxFifo0ElmtsNbr = 1;
  22.   hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
  23.   hfdcan1.Init.RxFifo1ElmtsNbr = 0;
  24.   hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
  25.   hfdcan1.Init.RxBuffersNbr = 0;
  26.   hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
  27.   hfdcan1.Init.TxEventsNbr = 0;
  28.   hfdcan1.Init.TxBuffersNbr = 0;
  29.   hfdcan1.Init.TxFifoQueueElmtsNbr = 1;
  30.   hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  31.   hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
  32.   if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  33.   {
  34.     Error_Handler();
  35.   }

  36. }
  37. /* FDCAN2 init function */
  38. void MX_FDCAN2_Init(void)
  39. {

  40.   hfdcan2.Instance = FDCAN2;
  41.   hfdcan2.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
  42.   hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
  43.   hfdcan2.Init.AutoRetransmission = DISABLE;
  44.   hfdcan2.Init.TransmitPause = DISABLE;
  45.   hfdcan2.Init.ProtocolException = DISABLE;
  46.   hfdcan2.Init.NominalPrescaler = 10;
  47.   hfdcan2.Init.NominalSyncJumpWidth = 8;
  48.   hfdcan2.Init.NominalTimeSeg1 = 31;
  49.   hfdcan2.Init.NominalTimeSeg2 = 8;
  50.   hfdcan2.Init.DataPrescaler = 10;
  51.   hfdcan2.Init.DataSyncJumpWidth = 4;
  52.   hfdcan2.Init.DataTimeSeg1 = 5;
  53.   hfdcan2.Init.DataTimeSeg2 = 4;
  54.   hfdcan2.Init.MessageRAMOffset = 0;
  55.   hfdcan2.Init.StdFiltersNbr = 1;
  56.   hfdcan2.Init.ExtFiltersNbr = 0;
  57.   hfdcan2.Init.RxFifo0ElmtsNbr = 1;
  58.   hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
  59.   hfdcan2.Init.RxFifo1ElmtsNbr = 0;
  60.   hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
  61.   hfdcan2.Init.RxBuffersNbr = 0;
  62.   hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
  63.   hfdcan2.Init.TxEventsNbr = 0;
  64.   hfdcan2.Init.TxBuffersNbr = 0;
  65.   hfdcan2.Init.TxFifoQueueElmtsNbr = 1;
  66.   hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  67.   hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
  68.   if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
  69.   {
  70.     Error_Handler();
  71.   }

  72. }
复制代码
回复

使用道具 举报

1

主题

33

回帖

36

积分

新手上路

积分
36
发表于 2019-5-24 09:38:50 | 显示全部楼层
我用的方法是:  hfdcan2.Init.MessageRAMOffset = (hfdcan1.msgRam.EndAddress - hfdcan1.msgRam.StandardFilterSA)/4;
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
 楼主| 发表于 2019-5-24 09:54:00 | 显示全部楼层
andre_king 发表于 2019-5-24 09:38
我用的方法是:  hfdcan2.Init.MessageRAMOffset = (hfdcan1.msgRam.EndAddress - hfdcan1.msgRam.Standard ...

不是很明白你的消息RAM结束地址 - 滤波器起始地址然后除以 4的操作
回复

使用道具 举报

1

主题

33

回帖

36

积分

新手上路

积分
36
发表于 2019-5-24 10:40:02 | 显示全部楼层
这个就要你实际去Debug后计算这个MessageRAM的地址了。
回复

使用道具 举报

8

主题

28

回帖

52

积分

初级会员

积分
52
发表于 2020-12-2 22:33:15 | 显示全部楼层
我是按照这个公式去DEBUG出来的。

hfdcan2.Init.MessageRAMOffset = hfdcan1.msgRam.EndAddress-SRAMCAN_BASE;

两个CAN能正常工作。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 22:33 , Processed in 0.326786 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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