硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2611|回复: 1
收起左侧

[其它] CAN总线相关例程的小BUG和修改方案

[复制链接]

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-4-10 22:08:34 | 显示全部楼层 |阅读模式
最近项目要使用CAN总线通信,传输数据,研究了下V5单板的CAN相关的例程。结果抓取CAN总线,没有数据产生。
晕乎好久才发现,有个小问题。
微信图片_20180410220327.jpg
按照描述,应该是得到500Kbps的通信速率,结果计算是按照1Mbps算的
结果没在意配置的参数,发现按照那个参数计算出来的结果居然是1.4Mbps,好像超过了1Mbps的最大速度

实际程序中,计算波特率的公式是对的。如果想要得到500Kbs的速率,需要调整下参数,结果如下:
微信图片_20180410220324.jpg

测试网络数据抓包分析为
微信图片_20180410220315.jpg



新手的时候容易晕,给新人一个小小提示。哈哈~
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2018-4-11 01:22:57 | 显示全部楼层
感谢楼主发帖说明,之前忘了跟你说了:


======================================================
开发板是这么注释的,计算波特率时候跟SJW参数没问题,SJW应该用固定数值1来代替

    /*
        CAN 波特率 = RCC_APB1Periph_CAN1 / Prescaler / (SJW + BS1 + BS2);
        
        SJW = synchronisation_jump_width
        BS = bit_segment
        
        本例中,设置CAN波特率为1 Mbps        
        CAN 波特率 = 42000000 / 2 / (1 + 12 + 8) / = 1 Mbps        
    */
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
    CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
    CAN_InitStructure.CAN_Prescaler = 2;
    CAN_Init(CAN1, &CAN_InitStructure);
=======================================================
正确的应该是:

    /*
        CAN 波特率 = RCC_APB1Periph_CAN1 / Prescaler / (1+ BS1 + BS2);
        
        SJW = synchronisation_jump_width
        BS = bit_segment
        
        本例中,设置CAN波特率为1 Mbps        
        CAN 波特率 = 420000000 / 2 / (1 +12 + 8) / = 1 Mbps        
    */


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 09:15 , Processed in 0.167782 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表