【前言】
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可以多了一些双机通讯的例子,这样用户上手就会比较快一些。
---------------------
作者:lulugl
链接:https://bbs.21ic.com/icview-3346754-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。