(四) CAN 波特率设置
4、我们需要搞明白CAN波特率的设置,这个章节也是使用CAN的最重要的部分之一,因为这实际应用中我们需要根据我们实际的场合来选择 CAN 的波特率。 一般情况下面1M bps 的速率下可以最高可靠传输 40 米以内的距离。 在 50K 以下的波特率中一般可以可靠传输数公里远。
对于波特率的设置需要详细学习参考手册对应部分的解释。我们在调试软件的时候可以使用示波器来测试 CANTX 引脚上的波形的波特率,这样可以得到事半功倍的效果,大大的缩短调试学习的时间。
// *************************************************************** // 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 协议中推荐的设置。
1Mbps 速率下,采用点的位置在6tq位置处,BS1=5, BS2=2 500kbps 速率下,采用点的位置在8tq位置处,BS1=7, BS2=3 250kbps 速率下,采用点的位置在14tq位置处,BS1=13, BS2=2 125k, 100k, 50k, 20k, 10k 的采用点位置与 250K 相同。
因此我们需要重视的有软件中的这么几个部分:
// 设置 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);
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;
通过上面部分的时钟设置我们已经可以算出我们的波特率了 CAN_bps = PCLK1 / ((1 + 7 + 8) * 5) = 25K bps
大家也可以实际测试中修改时钟值来通过示波器测试我们需要的波特率是否正确例如将PLLCLK 设置降低一半:
// PLLCLK = 8MHz * 4 = 32 MHz // 设置 PLL 时钟源及倍频系数
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
那么我们得到的CAN_bps也会降低一半。
接下来还可以修改 HCLK 和 PCLK1 ,其实最终这几个分频和倍频值最终影响的都是 PCLK1。
通过几次试验,相信大家应该很容易掌握波特率的设置了。
设置完波特率我们直接测试函数:
/* 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); }
将 CAN 软件仿真模拟器 调用出来.
大家可以仿真程序,当程序中 Test 等于 Passed 那么说明 Loopback 模式测试通过了。 并且在 CAN 通讯框中我们可以看到发送和接收到的数据:
回循模式下的源代码, 基于 MDK3.5:
Example7.1-CAN LoopBack Mode.rar (493.79 KB)
到此时说明如果大家只有一块CAN模块的时候学习可以告一个段落了,不过这个并不代表大家就已经掌握了 CAN 了,正真要掌握它,大家还是需要看大量的 CAN 部分的资料,参考手册部分的也是不够的,市面上有几本专门介绍现场总线和CAN总线的书,推荐大家买来经常翻翻看看,这样到需要实际应用的时候才可以做到如鱼得水。
(五) 正常模式
完成了 loopback 模式的测试之后接下来我们需要学习的就是多机通讯了,当然由于我们的 Mini-STM32 没有将 CAN 接口引出来, 所以我们没有办法在板子上面做这部分的试验了,只能在 RealView MDK 的软件中进行模拟。
如果您拥有两块带 CAN 硬件的 STM32 的板子,您需要自己构建硬件的物理层的连接,
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库MINI-STM32 开发板入门教程(8)在线全文阅读。
相关推荐: