初级会员

- 积分
- 194
- 金钱
- 194
- 注册时间
- 2020-1-27
- 在线时间
- 19 小时
|
本帖最后由 hhhh63 于 2020-12-24 19:59 编辑
因为CAN设备太多,需要配置STM32H743双CAN,开始不知道要分配内存,结果CAN2总收到CAN1的消息,以为是干扰或PCB问题,各种接线测试,不成功,上网学习,发现要分配内存(坑一天)。 m_hFdcan.Init.MessageRAMOffset = pFdcan1->m_hFdcan.msgRam.EndAddress - SRAMCAN_BASE;
所有网站都是这么写的,加入上面的语句后,测试CAN1和CAN2能独立工作,但是有新的问题,分配发送和接收缓存后,10K内存不够用,继续上网学习,没有答案,查看官方源码,发现了问题
hfdcan->msgRam.StandardFilterSA = SRAMCAN_BASE + (hfdcan->Init.MessageRAMOffset * 4U);
计算新地址时把起始地址翻了4倍,于是把我的程序改为
m_hFdcan.Init.MessageRAMOffset = (pFdcan1->m_hFdcan.msgRam.EndAddress - SRAMCAN_BASE) / 4; // 独家
运行正常(坑半天)
坑点分析:MessageRAMOffset 的单位是字,STM32的一个字是4个字节,而msgRam.EndAddress和SRAMCAN_BASE的单位是字节,所以要除以4,有官方源码为证
StartAddress = (hfdcan->msgRam.EndAddress - SRAMCAN_BASE) / 4U;
其它注意的地方
1. m_hFdcan.Init.StdFiltersNbr = 1; //所有Nbr结接尾的参数是数量,不是编号。
2. m_hFdcan.Init.FrameFormat = FDCAN_FRAME_CLASSIC; // 传统模式,设置为其它两种模式也能与CAN通信
3. m_hFdcan.Init.AutoRetransmission = DISABLE; // 关闭自动重传!传统模式下一定要关闭!!!,实测ENABLE也能用
以上是个人体会,不对的地方请指正
|
|