STM32F407与STM32F105 CAN通讯失败的定位解决

  • 问题的发现
    • 问题的现象
  • 测试过程
    • 硬件调整测试
    • 软件调整测试
  • 结论
    • 基本结论
    • 结论扩展验证

问题的发现

在STM32 CAN总线的应用过程,遇到STM32F407与STM32F105的CAN通讯失败问题,经过一系列的测试分析,发现并解决问题,实现正常的CAN通讯。

问题的现象

  1. STM32F407 板上安装25MHz晶体,作为HSE时钟,内部配置到168MHz,配置CAN速率为250Kbps,实现CAN LOOP测试正常,两块同样的STM32F407板子,实现CAN NORMAL通信测试正常;
  2. STM32F105板上安装8MHz晶体,作为HSE时钟,内部配置到72MHz,配置CAN速率为250Kbps,实现CAN LOOP测试正常,两块同样的STM32F105板子,实现CAN NORMAL通信测试正常;
  3. STM32F407板子向STM32F105板子CAN发送,无法接收成功;
  4. STM32F105向STM32F407板子CAN发送, 无法接收成功;
  5. 将一块STM32F105板子重焊为25MHz晶体,调整系统时钟配置后,CAN部分配置不变,与8MHz晶体的STM32F105板子CAN通讯失败;
  6. 将一块STM32F407板子重焊为8MHz晶体,调整系统时钟配置后,CAN部分配置不变,与25MHz晶体的STM32F407板子CAN通讯失败;
  7. STM32F407和STM32F105 CAN部分的SJW, BS1和BS2相同;
  8. 最终体现为采用8MHz晶体的STM32与采用25MHz晶体的STM32 CAN通讯不成功;
  9. 串口配置为115200bps和PC通讯正常。

测试过程

硬件调整测试

  1. 用万用表检查测试过程中的连接,无问题;
  2. 通过示波器简单查看CAN发送信号波特率,似乎也很接近250Kbps;

软件调整测试

  1. 波特率调整测试,重新配置CAN的波特率为更高500Kbps,更低50Kbps,25M晶体的板子和8M晶体的板子,双板CAN测试依旧不通;
  2. CAN的速率配置需要较严格的一致,因为采用不同晶体的板子,CAN配置部分相同,继续上升到系统时钟SYSCLK和CAN时钟PCLK1层面进行调查。
  3. 在8MHz晶体的STM32F105板子的主文件main()函数里增加时钟频率测试部分代码:

RCC_ClocksTypeDef get_rcc_clock;
RCC_GetClocksFreq(&get_rcc_clock);

此方式为STM32库函数支持, RCC_ClocksTypeDef的定义如下:
typedef struct
{
uint32_t SYSCLK_Frequency; /*!< returns SYSCLK clock frequency expressed in Hz /
uint32_t HCLK_Frequency; /
!< returns HCLK clock frequency expressed in Hz /
uint32_t PCLK1_Frequency; /
!< returns PCLK1 clock frequency expressed in Hz /
uint32_t PCLK2_Frequency; /
!< returns PCLK2 clock frequency expressed in Hz /
uint32_t ADCCLK_Frequency; /
!< returns ADCCLK clock frequency expressed in Hz */
}RCC_ClocksTypeDef;

下载程序后,通过调试看get_rcc_clock结构体变量内的SYSCLK_Frequency(72MHz)和PCLK1_Frequency(36MHz)频率情况。或者通过串口将频率数据输出进行查看。

发现时钟异常,SYSCLK不是72000000Hz,而是82285713Hz,而PCK1不是36000000Hz,而是41142785Hz,所以可能是时钟部分锁相配置异常所致,此时对应的系统时钟配置部分是:

/* PLL2 configuration: PLL2CLK = (HSE / 1) * 8 = 64 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 8 = 8 MHz */RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV1 | RCC_CFGR2_PLL2MUL8 |RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV8);
/* Enable PLL2 */
RCC->CR |= RCC_CR_PLL2ON;
/* Wait till PLL2 is ready */
while((RCC->CR & RCC_CR_PLL2RDY) == 0)
{
}
/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;

貌似时钟分频倍频配置计算没有问题。仍然进行调整,将原有的配置的分频和倍频部分进行调整,如下:

/* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 40 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
/* Enable PLL2 */
RCC->CR |= RCC_CR_PLL2ON;
/* Wait till PLL2 is ready */
while((RCC->CR & RCC_CR_PLL2RDY) == 0)
{
}
/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;

测试后发现,8MHz晶体的STM32板子和25MHz晶体的STM32板子CAN通讯正常,问题解决。

结论

基本结论

STM32系统时钟配置部分的锁相环分频和倍频,并非所有计算正确的配置都是运行正确,具有一定的有效选择性,所以对锁相环部分做了配置或更新后,需要用 RCC_ClocksTypeDef结构体实现验证时钟配置有效性。

结论扩展验证

采用STM32CUBE工具,也能更直观的看到ST对时钟配置有效性的提醒:

  1. STM32F105的时钟配置,针对本问题对应的时钟配置,ST在软件工具里,显示出了异常;

  1. STM32F105的时钟配置,针对本问题对应的时钟配置,做了修改调整后,ST在软件工具里,未显示出异常。

–End–

STM32F407与STM32F105 CAN通讯失败的定位解决相关推荐

  1. 与基础事务管理器通讯失败

    今天技术研发部告诉我 出现  与基础事务管理器通讯失败 的错误 ,经过排查,重启 IIS中的 应用程序池  解决了. 转载于:https://blog.51cto.com/mirwhite/64768 ...

  2. 高德地图 定位失败,10: 定位服务启动失败 解决办法

    问题: 在使用高德地图的时候,根据官方API的代码写出demo后,定位服务无效,并且提示 定位失败,10: 定位服务启动失败.如下图: 解决办法: 在AndroidManifest中添加 <se ...

  3. 手机斗鱼tv显示与服务器通讯失败,热门手机知识:斗鱼直播加载失败如何解决?解决斗鱼直播加载失败操作步骤...

    手机这种移动通讯设备闲置已经相当的普及了,大多数的手机用户,对手机的相关知识都不了解.现在各种各样的数码设备在我们的生活当中几乎可以说是无处不在,平时我们使用的手机,IP,电脑等等这些都属于数码设备, ...

  4. 江南百景图显示服务器错误,江南百景图通讯失败请保持网络畅通并重试

    江南百景图出现了通讯失败请保持网络畅通并重试的报错,导致许多玩家一直进不去游戏,遇到通讯失败的情况该怎么办呢?下面小编就向大家带来江南百景图通讯失败的解决办法汇总,赶快来看下吧. 江南百景图通讯失败请 ...

  5. wincc与西门子1500plc通讯失败

    正常安装完毕西门子wincc与西门子1500通讯不上,问了周边的人说,那个通讯很容易啊,奈何新手,一个通讯失败折磨了自己两天,为了解决这个问题百度了两天,高手应该就是这样练成的,不断的发现问题,不断的 ...

  6. AS608与单片机握手失败、与上位机通讯失败

    简言:本人在使用AS608模块时遇到了握手失败.通讯失败的问题,尝试网上各种方法未果后,换了一个AS608模块,问题解决. 一.与单片机握手失败 检查代码中的波特率是否为9600,再通过上位机将AS6 ...

  7. modbus通讯失败_【分享】Modbus通讯失败后数据一直保持不变,差点引起事故,检查Modbus通讯失败次数...

    已经不是第一次碰到业主提出这样的问题: Modbus通讯读取的数据存放到PLC的DB块后,当通讯丢失了以后,WinCC上任然显示的是最后一次通讯正常录入DB数据块的一个正常值,让操作人员和维护人员都误 ...

  8. wordcloud安装失败原因和解决方法

    wordcloud安装失败原因和解决方法 参考文章: (1)wordcloud安装失败原因和解决方法 (2)https://www.cnblogs.com/Lynn123/p/11907440.htm ...

  9. mysql启动失败的一个解决方法

    mysql启动失败的一个解决方法 参考文章: (1)mysql启动失败的一个解决方法 (2)https://www.cnblogs.com/notfresh/p/mysqlStartError.htm ...

最新文章

  1. java.lang.IllegalStateException: Cannot modify managed objects outside of a write transaction. in /U
  2. python 局域网通讯_python3 实现tcp/udp局域网通信
  3. Java并发编程高级篇(八):在执行器中取消任务
  4. python中的浮点数用法_如何利用Python在运算后得到浮点数值的方法详解
  5. 电动力学每日一题 2021/10/10
  6. python3.9特性_Python3.9的7个特性
  7. SpringBoot中整合Mail实现发送邮件
  8. Ocelot简易教程(三)之主要特性及路由详解
  9. 汇付 支付,痛苦的接入过程
  10. Element UI table组件源码分析
  11. Jenkins中使用scm拉取代码
  12. 微信小程序的微信开发者工具的快捷键查找和设置
  13. 【bioinfo】bbtools:bbmerge 二代测序reads合并工具了解
  14. 使用FME进行GIS与CAD转换
  15. 【刘文彬】【源码解读】EOS测试插件:txn_test_gen_plugin.cpp
  16. R 中关闭科学记数法
  17. 高仿网易云音乐一(可扫描本地音乐播放)
  18. 高斯分布-sklearn.mixture.GaussianMixture()
  19. lftp的使用以及常见的指令
  20. 2010年江蘇省第六次人口普查

热门文章

  1. 第07章 图形操作 · 7.2 绘制图形(2)
  2. 一分钟让你明白OKR考核
  3. 如何选择云服务器配置?怎么买最划算?
  4. C#文本阅读器,C#文本朗读器,Text文档朗读器开发
  5. “东数西算”浪潮将至,IDC龙头宝信软件却面临危机?
  6. 抠图大师:TouchRetouch for mac
  7. js刷新页面和刷新打开自己的父页面
  8. 水印,数字水印,频域水印(隐形水印)很麻烦!用这个分分钟搞定!
  9. php属于什么职类,老师属于什么职业类别
  10. 【Unity3D从入门到进阶】专栏文章导读清单