文章目录
一、前言
终极方案的配置如下:
- FDCAN1与FDCAN2同时工作
- FDCAN的工作模式为普通CAN(可以跑CANopen协议)
- 每路FDCAN有32个接收FIFO
- 每路FDCAN有32个发送FIFO
- 通讯波特率:1M
- 接收中断+水印中断(防止FIFO溢出)
- 滤波器设置:接收标准帧,接收所有范围的ID
STM32工程:
链接:https://pan.baidu.com/s/1eo-ob49Vt-MGZFVzN0gRcg
提取码:9u9a
二、CubeMX
2.1、Clock Configuration
系统时钟设置480M。
通过分频,将FDCAN的时钟源设置成20M。
2.2、FDCAN1
FDCAN2
三、代码
3.1、添加BSP
之前写好的代码,封装成BSP(在STM32工程里复制即可)。往工程添加如下文件:
- bsp_fdcan.c(中断回调函数,中断配置等代码都在这个文件里)
- bsp_fdcan.h
- bsp.c
- bsp.h
fdcan.c
首先,在CubeMX生成的函数MX_FDCAN1_Init( )设置水印。计算FDCAN2的messageRAMOffset是可选的,不一定要加这个代码。
3.3、main.c
在main.c里运行了如下代码:
- 初始化FDCAN滤波器。
- 开启FDCAN控制器。
- 初始化FDCAN中断。
因为这个工程运行了RTOS,开启FDCAN中断必须在消息队列后面。所以如果没有RTOS的话,直接在fdcan1.rx_Filter_Init( )后直接调用fdcan1.rx_Interrupt_Init()即可。
四、调试FDCAN
4.1、测试发送CAN报文
thread_LED_App函数每500ms执行一次。
从CAN分析仪观察是否收到报文。
从以上的测试看来,FDCAN1与FDCAN2都正常发送CAN报文了。
4.2、测试接收CAN报文
4.2.1、FDCAN1接收
使用CAN分析仪的CAN0(连接FDCAN1)发送报文。在Keil软件上将fdcan1添加到Wathc1窗口上,可以从变量fdcan1看到CAN报文的内容,跟CAN分析仪上的一样。所以,FDCAN1成功接收CAN报文。
4.2.2、FDCAN2接收
使用CAN分析仪的CAN1(连接FDCAN2)发送报文,在Keil软件上将fdcan2添加到Watch1窗口上,可以从变量fdcan2里看到CAN报文的内容,跟CAN分析仪上的一样。所以,FDCAN2成功接收CAN报文。
五、细节补充
5.1、FDCAN中断回调函数
在接收中断函数里,如果是裸机的话(没有RTOS系统),直接将这些代码删除即可。以FDCAN1的接收中断函数为例: