打印
[应用相关]

STM32的can总线实验心得

[复制链接]
楼主: hehhehee
手机看帖
扫描二维码
随时随地手机跟帖
21
hehhehee|  楼主 | 2021-7-24 22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
对于波特率的设置需要详细学习参考手册对应部分的解释。我们在调试软件的时候可以使用示波器来测试 CANTX 引脚上的波形的波特率,这样可以得到事半功倍的效果,大大的缩短调试学习的时间。

使用特权

评论回复
22
hehhehee|  楼主 | 2021-7-24 22:24 | 只看该作者
// ***************************************************************



//       BaudRate = 1 / NominalBitTime



//       NominalBitTime = 1tq + tBS1 + tBS2



//       tq = (BRP[9:0] + 1) x tPCLK



//       tPCLK = CAN's clock = APB1's clock



// ****************************************************************



也就是BaudRate = APB1 / ((BS1 + BS2 + 1) * Prescaler)



这里注意的是采用点的位置,也就时BS1,BS2的设置问题,这里我也找了一些资料,抄录下来给大家,是 CANopen 协议中推荐的设置。

使用特权

评论回复
23
hehhehee|  楼主 | 2021-7-24 22:27 | 只看该作者
1Mbps 速率下,采用点的位置在6tq位置处,BS1=5, BS2=2



   500kbps 速率下,采用点的位置在8tq位置处,BS1=7, BS2=3



   250kbps 速率下,采用点的位置在14tq位置处,BS1=13, BS2=2



   125k, 100k, 50k, 20k, 10k 的采用点位置与 250K 相同。

使用特权

评论回复
24
hehhehee|  楼主 | 2021-7-24 22:29 | 只看该作者
因此我们需要重视的有软件中的这么几个部分:



// 设置 AHB 时钟(HCLK)



// RCC_SYSCLK_Div1   AHB 时钟 =   系统时钟



RCC_HCLKConfig(RCC_SYSCLK_Div8);



// 设置低速 AHB 时钟(PCLK1)



// RCC_HCLK_Div2   APB1 时钟   = HCLK / 2



RCC_PCLK1Config(RCC_HCLK_Div2);



// PLLCLK = 8MHz * 8 = 64 MHz



// 设置 PLL 时钟源及倍频系数



RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_8);



使用特权

评论回复
25
hehhehee|  楼主 | 2021-7-24 22:29 | 只看该作者
CAN 波特率设置中需要的就是PCLK1 的时钟。



   CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;



   CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;



   CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;



   CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;



   CAN_InitStructure.CAN_Prescaler=5;

使用特权

评论回复
26
hehhehee|  楼主 | 2021-7-24 22:35 | 只看该作者
通过上面部分的时钟设置我们已经可以算出我们的波特率了



CAN_bps = PCLK1 / ((1 + 7 + 8) * 5) = 25K bps

使用特权

评论回复
27
hehhehee|  楼主 | 2021-7-24 22:37 | 只看该作者
大家也可以实际测试中修改时钟值来通过示波器测试我们需要的波特率是否正确例如将PLLCLK 设置降低一半:



// PLLCLK = 8MHz * 4 = 32 MHz



// 设置 PLL 时钟源及倍频系数



RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);



那么我们得到的CAN_bps也会降低一半。

使用特权

评论回复
28
hehhehee|  楼主 | 2021-7-24 22:38 | 只看该作者
接下来还可以修改 HCLK 和 PCLK1 ,其实最终这几个分频和倍频值最终影响的都是 PCLK1。



通过几次试验,相信大家应该很容易掌握波特率的设置了。

使用特权

评论回复
29
hehhehee|  楼主 | 2021-7-24 22:39 | 只看该作者
设置完波特率我们直接测试函数:



   /* CAN transmit at 100Kb/s and receive by polling in loopback mode*/



   TestRx = CAN_Polling();



   if (TestRx == FAILED)



   {



/* Turn on led connected to PA.00 pin (LD1) */



GPIO_SetBits(GPIOA, GPIO_Pin_0);



   }



   else



   {



/* Turn off led connected to PA.00 pin (LD1) */



GPIO_ResetBits(GPIOA, GPIO_Pin_0);



   }



   /* CAN transmit at 500Kb/s and receive by interrupt in loopback mode*/



   TestRx = CAN_Interrupt();



   if (TestRx == FAILED)



   {



/* Turn on led connected to PA.01 pin (LD2) */



GPIO_SetBits(GPIOA, GPIO_Pin_1);



   }



   else



   {



/* Turn off led connected to PA.01 pin (LD2) */



GPIO_ResetBits(GPIOA, GPIO_Pin_1);



   }

使用特权

评论回复
30
hehhehee|  楼主 | 2021-7-24 22:40 | 只看该作者
将CAN 软件仿真模拟器调用出来.

使用特权

评论回复
31
hehhehee|  楼主 | 2021-7-24 22:41 | 只看该作者

使用特权

评论回复
32
hehhehee|  楼主 | 2021-7-24 22:41 | 只看该作者
大家可以仿真程序,当程序中 Test 等于 Passed 那么说明 Loopback 模式测试通过了。

使用特权

评论回复
33
hehhehee|  楼主 | 2021-7-24 22:42 | 只看该作者
并且在 CAN 通讯框中我们可以看到发送和接收到的数据:

使用特权

评论回复
34
hehhehee|  楼主 | 2021-7-24 22:42 | 只看该作者
并且在 CAN 通讯框中我们可以看到发送和接收到的数据:

使用特权

评论回复
35
hehhehee|  楼主 | 2021-7-24 22:46 | 只看该作者

使用特权

评论回复
36
hehhehee|  楼主 | 2021-7-24 22:52 | 只看该作者
回循模式下的源代码, 基于 MDK3.5http://www.mystm32.com/bbs/attachment.php?aid=502&k=58076f879d134e9c3cbd69f6bf8e2e34&t=1257839460&sid=9421STfeLU4gI4CXqbJ9yj9hC9Feqy9%2BVleNJ8zF3WKOlro

使用特权

评论回复
37
hehhehee|  楼主 | 2021-7-24 22:53 | 只看该作者
到此时说明如果大家只有一块CAN模块的时候学习可以告一个段落了,不过这个并不代表大家就已经掌握了 CAN 了,正真要掌握它,大家还是需要看大量的 CAN 部分的资料,参考手册部分的也是不够的,市面上有几本专门介绍现场总线和CAN总线的书,推荐大家买来经常翻翻看看,这样到需要实际应用的时候才可以做到 如鱼得水。

使用特权

评论回复
38
hehhehee|  楼主 | 2021-7-24 22:55 | 只看该作者
(五) 正常模式


完成了 loopback 模式的测试之后接下来我们需要学习的就是多机通讯了,当然由于我们的 Mini-STM32 没有将 CAN 接口引出来, 所以我们没有办法在板子上面做这部分的试验了,只能在 RealView MDK 的软件中进行模拟。

使用特权

评论回复
39
hehhehee|  楼主 | 2021-7-24 22:55 | 只看该作者
如果您拥有两块带 CAN 硬件的 STM32 的板子,您需要自己构建硬件的物理层的连接, 使用三根线将 CANH,CANL,GND 三根线直连,当然你要接好终端电阻才能保证通讯的正常通讯,当两块板子都跳好后我们使用万用表测量下 CANH和CANL之间的电阻是否为 60 欧姆。多块板子多机通讯的是否你只需要在总线的主机端和最后一端接上终端电阻就可以了.

使用特权

评论回复
40
hehhehee|  楼主 | 2021-7-24 23:01 | 只看该作者
如果您拥有两块带 CAN 硬件的 STM32 的板子,您需要自己构建硬件的物理层的连接, 使用三根线将 CANH,CANL,GND 三根线直连,当然你要接好终端电阻才能保证通讯的正常通讯,当两块板子都跳好后我们使用万用表测量下 CANH和CANL之间的电阻是否为 60 欧姆。多块板子多机通讯的是否你只需要在总线的主机端和最后一端接上终端电阻就可以了.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则