打印
[应用相关]

求教:关于STM32的CAN的波特率设置

[复制链接]
12853|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hzrobin|  楼主 | 2008-8-29 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 关于这个波特率该怎么设置,在例子里面有个100Kb/s有个500Kb/s的,就拿这个500Kb/s的说吧
怎么根据  
  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=1;
  得到500Kb/s的波特率,知道的帮帮忙说声呀
TSCL=2TCLK×BRP=2TCLK×(32BRP.5+16BRP.4+
8BRP.3+4BRP.2+2BRP.1+1BRP.0+1)
tSJW=TSCL×(2×SJW.1+1×SJW.0+1) 
tTSEG1=TSCL×(8×TSEG1.3+4×TSEG1.2+2×TSEG1.1+1×TESG1.0+1)    
tTSEG2=TSCL×(4×TSEG2.2+2×TSEG2.1+1×TESG2.0+1)  
这是有关公式,我觉得怎么这个公式用不大上呢,
高手帮帮我这个小菜鸟!
沙发
hzrobin|  楼主 | 2008-8-30 09:27 | 只看该作者

咋没人说声呢

香主:帮俺这个菜鸟看看吧

使用特权

评论回复
板凳
starm| | 2008-8-30 09:58 | 只看该作者

得到500Kb/s的波特率

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=1;

每一位的Tq数目 = 1 (固定SYNC_SEG) +  8 (BS1) + 7 (BS2) = 16

如果CAN时钟是 8 MHz : (8M / 1 ) / 16 = 500K

其中:
1 为分频系数
16 为每一位的Tq数目

为了设置为 100K, 把分频系数改为5即可, BS1 BS2 不变

每一位的Tq数目 = 1 (固定) +  8 (BS1) + 7 (BS2) = 16
如果CAN时钟是 8 MHz : (8M / 5 ) / 16 = 100K

如果想得到 1M 的波特率, CAN时钟仍然是 8 MHz的情况下, 分频系数不变

应该改变 BS1 BS2

CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;

每一位的Tq数目 = 1 (固定) +  5 (BS1) + 2 (BS2) = 8
如果CAN时钟是 8 MHz : (8M / 1 ) / 8 = 1000K




另外尽可能的把采样点设置为 CiA 推荐的值:

75%     when 波特率 > 800K
80%     when 波特率 > 500K
87.5%   when 波特率 <= 500K

所以对于 100K 的波特率(假定使用 8MHz 时钟) 
可以修改该BS1 BS2 为:

CAN_InitStructure.CAN_Prescaler=5;
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;

(1+13) / (1+13+2) = 87.5%

所以对于 500K 的波特率(假定使用 8MHz 时钟) 
可以修改该BS1 BS2 为:

CAN_InitStructure.CAN_Prescaler=1;
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;

(1+13) / (1+13+2) = 87.5%

所以对于 1000K 的波特率(假定使用 8MHz 时钟) 
可以修改该BS1 BS2 为:

CAN_InitStructure.CAN_Prescaler=1;
CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;

(1+5) / (1+5+2) = 75%

个人见解, 仅供参考。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xiao2na + 1
地板
hzrobin|  楼主 | 2008-8-30 15:53 | 只看该作者

感谢

谢谢楼上这么仔细的回答,谢谢啦

使用特权

评论回复
5
zhxlx| | 2008-9-16 15:21 | 只看该作者

马上去试一下。

使用特权

评论回复
6
zhxlx| | 2008-9-16 16:27 | 只看该作者

不对

好像应该是
baudrate = 36M / prescaler / (sjw + bs1 + bs2)

使用特权

评论回复
7
starm| | 2009-4-14 15:57 | 只看该作者

baudrate = 36M / prescaler / (sjw + bs1 + bs2)

本帖最后由 STARM 于 2013-2-1 11:34 编辑

baudrate = 36M / prescaler / ( 1 + bs1 + bs2)

使用特权

评论回复
8
xiao2na| | 2010-4-9 16:33 | 只看该作者
Starm说得对呢!
是baudrate = 36M / prescaler / (1 + bs1 + bs2)

使用特权

评论回复
9
xiepeilin| | 2010-5-31 16:52 | 只看该作者
xiexiehehhe!

使用特权

评论回复
10
xiepeilin| | 2010-5-31 16:55 | 只看该作者
难道每个都是baudrate = 36M / prescaler / (1 + bs1 + bs2)这样计算的吗?知道其他的不知道bs1和bs2那么bs1和bs2怎么确定呢?

使用特权

评论回复
11
hualy| | 2010-10-31 22:47 | 只看该作者
好**,收藏了,TKS,LZ

使用特权

评论回复
12
jy02326166| | 2013-1-30 16:27 | 只看该作者
嗯 很有帮助~

使用特权

评论回复
13
jy02326166| | 2013-1-30 16:32 | 只看该作者
starm 发表于 2009-4-14 15:57
baudrate&nbsp;=&nbsp;36M&nbsp;/&nbsp;prescaler&nbsp;/&nbsp;(1&nbsp;+&nbsp;bs1&nbsp;+&nbsp;bs2)

CAN的频率怎么算 , 就是APB1的频率吗?
CAN时钟开启以后默认的频率为多少?

使用特权

评论回复
14
深夜星空| | 2013-4-13 16:50 | 只看该作者
好帖,谢谢强人们的回复,很有帮助

使用特权

评论回复
15
hawksabre| | 2013-4-13 19:44 | 只看该作者
好帖子   真的不错   呵呵   顶一个   应用这一块还是需要好好研究研究的   呵呵

使用特权

评论回复
16
闲来找无事| | 2013-9-30 15:53 | 只看该作者
mark

使用特权

评论回复
17
斜阳草树| | 2015-1-13 10:35 | 只看该作者
非常感谢,很有帮助

使用特权

评论回复
18
sicau123| | 2015-10-26 11:13 | 只看该作者
STARM的回答牛X,解决了和大问题。谢谢啦、

使用特权

评论回复
19
sicau123| | 2015-10-26 11:14 | 只看该作者
20
sicau123| | 2015-10-26 11:15 | 只看该作者
starm 发表于 2008-8-30 09:58
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS ...

牛X。解决了大问题。感谢。

使用特权

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

本版积分规则

7

主题

45

帖子

0

粉丝