打印
[STM32U5]

【NUCLEO-U5A5ZJ-Q测评】CANFD深度体验

[复制链接]
354|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2023-12-9 20:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创#
【前言】
STM32U5系列拥有一个FDCAN,在AN5348中,详细的描述了FDCAN相比于CAN2.0的优势,从原来的支持8个字节,到64个字节的传送。并且提升到2M的传输速。
【实验环境】
  • NUCLEO-U5A5ZJ-Q开发板。
  • CAN转TTL收发器。
  • FDCAN分析仪。

【开发环境】
  • STM32CubeIDE 1.14
  • WIN11
  • FDCAN分析软件

【实现步骤】
1、新建基于NUCLEO-U5A5ZJ-Q的基础工程。
2、配置总线时钟为160MHz,CANFD的时钟为80MHZ

3、配置FDCAN参数,配置为1Mbit/s速率。

4、配置GPIO为veryHigh的速度

5、生成工程后,添加用户代码:
<p>/*##-1 Configure the FDCAN filters ########################################*/</p><p>/* Configure standard ID reception filter to Rx FIFO 0 */</p><p>sFilterConfig.IdType = FDCAN_STANDARD_ID;</p><p>sFilterConfig.FilterIndex = 0;</p><p>sFilterConfig.FilterType = FDCAN_FILTER_MASK;</p><p>sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;</p><p>sFilterConfig.FilterID1 = 0;</p><p>sFilterConfig.FilterID2 = 0;</p><p>if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)</p><p>{</p><p>printf("erro in HAL_FDCAN_ConfigFilter\r\n");</p><p>// Error_Handler();</p><p>}</p><p>sFilterConfig.IdType = FDCAN_EXTENDED_ID;</p><p>sFilterConfig.FilterIndex = 0;</p><p>sFilterConfig.FilterType = FDCAN_FILTER_MASK;</p><p>sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;</p><p>sFilterConfig.FilterID1 = 0;</p><p>sFilterConfig.FilterID2 = 0;</p><p>if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)</p><p>{</p><p>printf("erro in HAL_FDCAN_ConfigFilter FDCAN_EXTENDED_ID\r\n");</p><p>Error_Handler();</p><p>}</p><p>/* Configure global filter on both FDCAN instances:</p><p>Filter all remote frames with STD and EXT ID</p><p>Reject non matching frames with STD ID and EXT ID */</p><p>if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)</p><p>{</p><p>Error_Handler();</p><p>}</p><p>/* Activate Rx FIFO 0 new message notification on both FDCAN instances */</p><p>if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)</p><p>{</p><p>Error_Handler();</p><p>}</p><p>if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_BUS_OFF, 0) != HAL_OK)</p><p>{</p><p>Error_Handler();</p><p>}</p><p>TxHeader.Identifier = 0x123;</p><p>TxHeader.IdType = FDCAN_STANDARD_ID;</p><p>TxHeader.TxFrameType = FDCAN_DATA_FRAME;</p><p>TxHeader.DataLength = FDCAN_DLC_BYTES_64;</p><p>TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;</p><p>TxHeader.BitRateSwitch = FDCAN_BRS_OFF;</p><p>TxHeader.FDFormat = FDCAN_FD_CAN;</p><p>TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;</p><p>TxHeader.MessageMarker = 0x52;</p><p>HAL_FDCAN_Start(&hfdcan1);</p>

6、在主循环里添加发送函数:
<p>while (1)</p><p>{</p><p>if(HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK)</p><p>{</p><p>HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, RxData);</p><p>// memset(RxData,0x0,64);</p><p>// HAL_Delay(200);</p><p>}</p><p>/* USER CODE END WHILE */</p><p>/* USER CODE BEGIN 3 */</p><p>}</p>

7、下载好后打开CAN分析仪,配置为1M速度,发送数据后成功返回:

8、配置中断接收:

9、配置为中断后,会在stm32U5xx_it.c中生成FDCAN1_IRQHandler(void)中断函数。然后我们添加HAL_FDCAN_RxFifo0Callback回调函数,其内容是我们判断是否为RxFifo0的中断如果是,测更新标志位,在main函数中来实现其具体功能:
<p>voidHAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_tRxFifo1ITs)</p><p>{</p><p>if((RxFifo1ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)</p><p>{</p><p>Notification_flag = 1;</p><p>}</p><p>}</p>

10、在配置中增加激活中断的函数:
<p>/* Activate Rx FIFO 0 new message notification on both FDCAN instances */</p><p>if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)</p><p>{</p><p>Error_Handler();</p><p>}</p>

12、在main.c主循环中我们判定是否接收到的数据,如果有,原路返回:
<p>if(Notification_flag ==1)</p><p>{</p><p>printf("recv data\n");</p><p>HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData);</p><p>HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, RxData);</p><p>memset(RxData,0x0,64);</p><p>Notification_flag = 0;</p><p>HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);</p><p>}</p>

【实验现象】
我们用FDCAN分析仪发送数据后,接收到同时的数据:

【总结与讨论】
1、Stm32CubeIDE给我们提供了非常友好的FDCAN图形配置界面,可以直观的看到配置的FDCAN的波特率。同时可以自动生成中断函数。我们只需要对中断回调函数进行重写就可以实现我们需要的功能。
2、但是配置接收到发送,还需要用户进行详细的配置,网上现在提供的资料比较少,我也是从其他的例程或者是其他大佬们分享的资料进行配置。差不多用了1天才弄好。
3、我们值得注意的是先要了解学习FDCAN的配置项,具体过滤器、ID号等需要弄懂才能配置好他。
同时我们对邮箱的配置也非常重要,我在重写中断回调函数时,配置错了fifo,所以接收不到信息,后面经过一步一步调试才找到问题所以。
综上所述,对于FDCAN,跟传统的CAN还有是一定的差别,需要多读官方的文档,学习其他大佬们的作品才能熟悉,再自己进一步的多用,才能掌握他的使用技巧,在当今的汽车时代,应该使用FDCAN会越来越普遍,掌握使用它具体很大的实际意义。
【建议】
官方对FDCAN的示例比较少,我查了一下,只有一个回环实验的例子,如果有可能,对于CAN的example可以多了一些双机通讯的例子,这样用户上手就会比较快一些。

使用特权

评论回复
沙发
myiclife| | 2023-12-12 15:00 | 只看该作者
CANFD和CAN有什么区别吗?         

使用特权

评论回复
板凳
lulugl|  楼主 | 2023-12-12 15:25 | 只看该作者
myiclife 发表于 2023-12-12 15:00
CANFD和CAN有什么区别吗?

CANFD是在CAN上面的升级,向下兼容,主要是可以一次从8bit升级到64bit。速度也有提升。具体的可以看看ST的官方文档,好象是AN5348.

使用特权

评论回复
地板
闻则123| | 2023-12-12 17:27 | 只看该作者

使用特权

评论回复
5
AdaMaYun| | 2023-12-13 22:49 | 只看该作者
CANFD具体的帧形式跟配置关系大吗

使用特权

评论回复
6
lulugl|  楼主 | 2023-12-13 23:05 | 只看该作者
AdaMaYun 发表于 2023-12-13 22:49
CANFD具体的帧形式跟配置关系大吗

对的,配置成什么样的就是什么样的功能,还是有点小复杂的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

137

主题

669

帖子

6

粉丝