智能车制作

 找回密码
 注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: 尕玍紿
打印 上一主题 下一主题

有人懂CAN总线协议吗?它是怎么实现一对一通讯的?

[复制链接]

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
11#
 楼主| 发表于 2014-5-27 11:30:16 | 只看该作者
lf1286 发表于 2014-5-24 19:05
搞定了就好。

额,又有个问题想问下。
之前我是用STM32+MCP25210+A82C250实现CAN通讯的。(STM32自带的CAN被USB占用了)
现在要换成K60的FlexCAN + A82C250来实现CAN通讯,查了下两个芯片的数据手册,有个问题不确定,关于电平兼容的。我的问题是:K60输出高电平‘1’;A82C250能识别吗?不能的话,该怎么解决?把K60的IO上拉5V的电源这样解决行吗?  详细数据见下文,IO口的电平要求都列出来了。对K60的输出电平描述看不懂。

K60兼容A82C250的输入:
A82C250:
电源:5V
输出高电平范围:4V < V(oH) < 5.3V
输出低电平范围:0V < V(oL)  <1V
K60:
电源:3.3V
输入高电平要求:2.4V < V(oH) < 无最大值(即多大都行)
输入低电平要求:无最小值(即多小都行) < V(oL) <1.155V

A82C250能兼容K60的输入吗????(低电平能兼容,高电平我不懂)
K60:
电源:3.3V
输出高电平范围:2.8V < V(oH) < 无最大值 (这里的无最大值是什么意思呢?会自行根据负载调节输出电压吗?不可能吧,3.3V的电源再怎么也不可能输出比3.3还大的吧???)
输出低电平范围:无最小值(这又是什么意思?)< V(oL) <0.5V
A82C250:
电源:5V
输入高电平要求:3.5V < V(oH) < 5.3V
输入低电平要求:-0.3V < V(oL) <1.5V

数据手册原图:
K60:



A82C250:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

1

主题

302

帖子

0

精华

知名人物

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
21886

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
11271
贡献
7521
兑换币
7086
注册时间
2011-1-26
在线时间
1547 小时
12#
发表于 2014-5-27 18:09:59 | 只看该作者
上拉是可以的,也可以用转换芯片来实现。
回复 支持 反对

使用道具 举报

50

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1393
威望
690
贡献
439
兑换币
386
注册时间
2013-3-6
在线时间
132 小时
毕业学校
北京师范大学珠海分校
13#
 楼主| 发表于 2014-5-31 14:19:47 | 只看该作者
本帖最后由 尕玍紿 于 2014-5-31 14:20 编辑
lf1286 发表于 2014-5-27 18:09
上拉是可以的,也可以用转换芯片来实现。

我之前弄的是:STM32+MCP2510+A82C250 与 STM32+MCP2510+A82C250 进行CAN通讯,已经调通了。现在在弄:K60 + A82C250 与 STM32+MCP2510+A82C250,将K60的CAN输出上拉后还是没能成功,不知道是什么原因。
现在有一个疑问:
不管什么协议的通讯,双方的波特率设置要一样这是必须的,但是CAN这里的波特率设置在细节上面我有一个问题:
CAN的波特率设置是基于“最小时间分量TQ”对不同段位的位时间长度进行配置从而得到了一个波特率的。我现在的情况是通讯双方的最终波特率是一样的,都设置为125Kbps了;但是他们在细节上的配置是不一致的(即TQ不等、不同段位的位时间长度也不尽相同),这样的配置行得通吗?

以下是具体配置:
STM32+MCP2510+A82C250的波特率配置:
write_mcp2510_oneByte(CNF1,0x07); // 8分频:TQ= 2 * 1/(16/8) = 1us
write_mcp2510_oneByte(CNF2,0x90); // Pseg=1TQ,PS1=3TQ
write_mcp2510_oneByte(CNF3,0x02); // PS2=3TQ
//时钟源Fosc=16MHz ; 预分频数:BRP=7(8分频) ; 即:最小时间分子TQ = 2*(1/Fosc)*(BRP+1);
//(再同步补偿时间长度)Sync Seg=1TQ ;       (传播段的位时间长度) Prop Seg=1TQ ;
//(相位段1的位时间长度)Phase Seg1=3TQ ;  (相位段2的位时间长度)Phase Seg2=3TQ ;
//所以波特率就为 Bus speed = 1 / ((Total of TQ) * TQ) = 125Kbps


K60+A82C250的波特率配置:
CAN_CTRL1_REG(CANBaseAdd) |= CAN_CTRL1_CLKSRC_MASK; //选择时钟源:外设时钟,由PLL分频得到:48MHz
CAN_CTRL1_REG(CANBaseAdd) = ( 0 | CAN_CTRL1_PROPSEG(1)      /*设置传播段位时间长度=2TQ*/
                                                   | CAN_CTRL1_RJW(1)             /*设置再同步补偿时间长度=2TQ*/
                                                   | CAN_CTRL1_PSEG1(3)          /*设置相位段1位时间长度=4TQ*/
                                                   | CAN_CTRL1_PSEG2(3)          /*设置相位段2位时间长度=4TQ*/
                                                   | CAN_CTRL1_PRESDIV(31) );  /*32分频:TQ=1/(48/32)=0.67us*/

//所以波特率就为 Bus speed = 48M / 32分频 /12个TQ = 125Kbps
        

回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-1 13:13 , Processed in 0.038780 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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