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

[复制链接]
1505|6
 楼主| 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
9188484c7608268377b39fc427d3518e
3、配置FDCAN参数,配置为1Mbit/s速率。
c7eb761a3ab4d64e0dc928fe7ac54a20
4、配置GPIO为veryHigh的速度
dc4e5262171a40a5bbadfc1a924a83d7
5、生成工程后,添加用户代码:
  1. <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、在主循环里添加发送函数:
  1. <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速度,发送数据后成功返回:
64fa3211b114fc6a030d7b106fa3416d
8、配置中断接收:
fad3a2f2fab289a1f15bd7c45ea9cb6f
9、配置为中断后,会在stm32U5xx_it.c中生成FDCAN1_IRQHandler(void)中断函数。然后我们添加HAL_FDCAN_RxFifo0Callback回调函数,其内容是我们判断是否为RxFifo0的中断如果是,测更新标志位,在main函数中来实现其具体功能:
  1. <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、在配置中增加激活中断的函数:
  1. <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主循环中我们判定是否接收到的数据,如果有,原路返回:
  1. <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分析仪发送数据后,接收到同时的数据:
e369a4018a3bb39de035620fb74221b9
【总结与讨论】
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 | 显示全部楼层
AdaMaYun 发表于 2023-12-13 22:49 | 显示全部楼层
CANFD具体的帧形式跟配置关系大吗
 楼主| lulugl 发表于 2023-12-13 23:05 | 显示全部楼层
AdaMaYun 发表于 2023-12-13 22:49
CANFD具体的帧形式跟配置关系大吗

对的,配置成什么样的就是什么样的功能,还是有点小复杂的。
suncl110 发表于 2024-8-13 15:50 | 显示全部楼层
能给个CAN-FD收发的例程吗?谢谢! suncl110@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

844

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部