stm32h743 FDCAN驱动踩坑记录

先放一张FDCAN控制框图镇贴:

 can 使用的是专门的外设时钟,所以要有相应的外设时钟配置和选择。

关于波特率计算:与时钟频率、分频系数、1bit中的tq数量有关

 代码中把位时序中的 BS1 和 BS2 段分别设置成了 31Tq 和 8Tq,再加上 SYNC_SEG段(固定为1Tq),一个 CAN 数据位就是 40Tq 了,加上 CAN 外设的分频配置为 1 分频, CAN 所使用的
总线时钟 fPLL1Q = 40MHz,于是我们可计算出它的波特率:

1Tq = 1/(40M) = 1/40 us
T1bit = (31+8+1) x Tq = 1us

波特率 = 1/T1bit = 1Mbps

关于验收筛选器配置:

1、一开始看的某原子的例程,但是滤波功能根本就不管用。后来查阅一番才知道,使用筛选器要设置筛选器数量。是标准帧就设置StdFilterNbr,是扩展帧就设置ExtFiltersNbr。

2、最终成功设置要使用两个API:HAL_FDCAN_ConfigFilter、HAL_FDCAN_ConfigGlobalFilter

后者是打开筛选器的全局开关,必须要有!!

3、滤波模式选择用掩码模式:它把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收 FIFO。若掩码的各个位均为 1,则只有筛选出的 ID 与接受的ID 段一致,该数据才会被接受到 FIFO 中,否则则会被舍弃。若ID和掩码都是0,则表示不滤波。

 关于CAN1、CAN2一起使用消息RAM:

一个CAN的时候,你不需要在意这个专有内存的问题,但是两个CAN一起来的时候你就要关心了,因为你不能把两个CAN用的内存重合在一起,一定要分开用,一段给CAN1,另一段给CAN2.前代的bxCAN是芯片内部帮我们分开了,但是这一代ST把这个权力交给了开发者,所以一点要注意,在初始化完CAN1后,记录下你的消息RAM的结尾地址,让CAN2接着CAN1的内存继续用!!!!这个非常关键,因为不这样,过滤表会有问题,至少目前我的理解和实际测试,重合在一起是有问题的。
具体解释可以看下面两个帖子:

STM32H743 FDCAN双CAN过滤表设置_一只爱做笔记的码农-CSDN博客

STM32H743+CubeMX-计算FDCAN2上的MessageRAMOffset(使两路FDCAN正常工作)_wallace89的博客-CSDN博客

踩坑记录:

1、刚开始逻分仪一直采不到数据:

在回环模式下用逻分仪抓取转换器TXD脚数据,发现啥都没有,而CAN1_TX(PA12)是有数据的; 进而怀疑CAN1_TX(PA12) 是否接到了转换器的TXD。
用万用表一测发现两者并不相通。测CAN2_TX(PB13)和转换器的TXD,发现是相通的。
进而程序中把相关配置改成CAN2后,在回环模式下用逻分仪抓取CAN2_TX(PB13)数据,发现是有的;抓取TXD数据也是有的;
切换成正常模式,发现此时逻分仪抓到的数据和回环下的不一样(这是因为板子电源没插。。插上去就一样了)
此时再接can盒,顺利获取到发送来的数据了。

2、can1  can2单独测试都可以,并联测试,can1 不能发也不能收,can2 可以。

找了好久原因,发现CAN1 CAN2 初始化的第一步是先DeinitCAN设备,所以CAN2的初始化就造成CAN1 不可用

3、上面问题解决之后,开始测试能不能两路CAN 都接收。

现象是都不能接收了。

原因是开了接收中断,但是没有实现中断服务函数,导致一接收系统就挂。

4、调通的裸机代码移到系统里,发现CAN1正常,CAN2发送可以,中断接收没反应(逻分仪抓CAN2_RX 是有数据的):

是因为筛选器没配置。CAN1 不配也可以,CAN2 不配无法接收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值