OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 26402|回复: 5

STM32 CAN总线的一些心得

[复制链接]

3

主题

17

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2014-3-15
在线时间
2 小时
发表于 2014-4-17 15:25:58 | 显示全部楼层 |阅读模式
好吧,首先我不得不承认这是一篇有关失败实验经历的帖子,但我还是想写出来,因为在此期间还是有一些收获的。先来说说关于CAN总线的实验想法:学习了STM32 的can总线模块后,总想着实现多机通讯,实验室有人用c8051f040芯片搭了一个can总线的双机通讯电路,所以想将STM32的板子加进去,实现三机通讯。有了这个想法后着手去做了,但没有实现。
先来说说我在学习STM32 can总线模块时的一些心得吧:
这部分主要是位时序和过滤器的理解心得:

位时序,就是发送一位所用的时间,在这样一段短暂时间里,又分了四段:同步段、传播段、相位缓冲段1、相位缓冲段2.这些都是在其他总线通信中不曾遇到的,有些初学者看到手册上后面的介绍基本就晕菜了,很难接受和理解,不知道为什么要这么做,其实把这样一小段时间又分成4段就是为了进行同步。

CAN总线的通讯时采用NRZNon-Return to Zero,非归零)码,数据本身并不携带时钟信息,也就是说在每一位的开始或结束没有同步信号,发送单元以位时序同步的方式开始发送帧数据,接收单元根据总线电平的变化进行同步并进行接收。可以这样理解,总线上的发送端和接收端以相同的频率振荡,这个振荡就是时钟信息,很同步,很和谐,这样发送端发个数据,它就这样以同样的频率振啊振的振到接收端,接收端察觉并接收,很完美哈?可这只是理想情况,在实际情况中,发送端和接收端会存在时间误差,传输路径也会有相位误差,这些都可能使二者在收发操作中失去同步关系,这个时候要想再实现通讯,接收端就必须调用同步机制,调整它的操作时序。

CAN bus 有两个同步机制:硬同步和重同步

硬同步:在总线空闲状态时,接收单元检测到SOF就会执行这个同步调整过程,“隐式”电平跳变到“显式”电平的边缘的时间点被认为是接收端位时序的同步段,不用管SJW的值。这种同步在一个帧中只出现一次,就是在开头。

重同步:接收节点在一帧中间如果检测到信号从10 的变换边沿是在传播段或者相位缓冲段1中,则认为自己的位时序提前了,这是因为采样时间点会出现在相位缓冲段12 之间,过早采样会造成采样不准,所以接收端就将这个位时序周期的相位缓冲段1延长;反之,如果检测到边沿在相位缓冲段2中,则将相位缓冲段2缩短,最终让信号变化的边沿变回到同步段,这样,是不是觉得一个位时间分成四段很合理了呢。

对于这个同步机制,我也没有特别深入的研究,如果有谁在这方面有更好的心得,欢迎分享。

再来聊聊过滤器吧。

CAN总线设计了过滤器在芯片里,用于筛选报文,STM32 手册里把过滤器说的云里雾里的,害苦了我们这些初学者,其实很好理解:

我先来简单啰嗦下过滤器的工作方式:

根据配置,每一组的过滤器组可以有1个、2个或4个过滤器

这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上“过”一下,能通过的报文是有效报文,收进FIFO,不能通过的是无效报文,直接丢弃,每一个过滤器是并联的,即一个报文只要通过了一个过滤器,就是有效的报文。

对于这方面的介绍,大家可以戳这个链接http://www.openedv.com/posts/list/20666.htm  是论坛上关于过滤器很详细的一个介绍,借花献佛,和大家分享。

如果大家还是不能很好的理解过滤器,那我们举个例子带大家进入角色:想象一下,你想去寄快件(发报文),但是国家垄断,没有四通一达上门服务,只能去邮局(若干过滤器组),邮局又比较落后只开了2个投送目的地(接收后保存报文的FIFO),但他们不是什么快件都寄,易燃易爆的不给寄,所以就要筛选,开辟了几个窗口进行筛选(激活的过滤器组,最多14个),每个窗口配备人员不同(过滤器组设置),有的是一个连长加一个班长(232位过滤器,工作在屏蔽位模式),有的是两个连长(232为过滤器,工作在标识符列表模式),有的是两个班长加两个士兵(416位过滤器工作在屏蔽位模式),有的是四个班长(416位过滤器工作在列表模式中),这不同的人员配置起到作用不同,官大一级压死人的道理大家都懂,所以你拿去的快件,优先给官大的人筛选,不同级的人员配置中,官大的点头才能寄,平级的谁点头都行,通过之后就存在他们的仓库里了(FIFO中),当然,要是没有你想寄去的地方,你就要去别的邮局看看了,不同邮局寄送的城市不同(寻找下一个节点继续匹配)。

这个例子只是为了形象建立过滤器的工作模式,细节可能有出入,我上面推荐的帖子,非常好。

写到这关于STM32 can总线的学习心得基本就结束了,接下来我想说说我那个失败的实验经历:

实验电路板是两块基于c8051f040 芯片的can通讯电路板和STM32 战舰电路板,实验结果:两块c8051f040 的电路板可以完美通讯,STM32 的板子无法加进去,期间保证了波特率相同,位时序频率相同,传输数据位数相同,id也是匹配的,但是无法通讯,想问下有此方面经验的同僚们,在保证了以上数据相同的前提下,连接两个电路板是不是理论上可以实现通讯?
菜鸟一枚,还请大家批评指正
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-4-17 15:55:00 | 显示全部楼层
回复【楼主位】Daisy:
---------------------------------
谢谢分享
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-17 21:23:12 | 显示全部楼层
谢谢分享。
CAN节点没有都接120R电阻吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

193

帖子

8

精华

金牌会员

Rank: 6Rank: 6

积分
1800
金钱
1800
注册时间
2012-8-23
在线时间
57 小时
发表于 2014-4-17 21:54:07 | 显示全部楼层
1、一个CAN总线网络只能有两个120欧终端电阻
2、每个节点波特率必须匹配
3、可先设置过滤器接收所有数据,这样就不会应该过滤器没设置对而接收不到数据。
5、调试的时候最好能有个USB-CAN适配器来协助调试,好的工具,事半功倍!
回复 支持 反对

使用道具 举报

3

主题

17

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2014-3-15
在线时间
2 小时
 楼主| 发表于 2014-4-18 08:38:36 | 显示全部楼层
回复【4楼】beyond696:
---------------------------------
多谢指点。
菜鸟一枚,还请大家批评指正
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-7-7
在线时间
5 小时
发表于 2017-11-18 16:45:37 | 显示全部楼层
好贴,学习了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 18:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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