本帖最后由 waveforms 于 2019-4-10 16:06 编辑
原贴链接:http://www.openedv.com/forum.php?mod=viewthread&tid=31152
好吧,首先我不得不承认这是一篇有关失败实验经历的帖子,但我还是想写出来,因为在此期间还是有一些收获的。先来说说关于CAN总线的实验想法:学习了STM32 的can总线模块后,总想着实现多机通讯,实验室有人用c8051f040芯片搭了一个can总线的双机通讯电路,所以想将STM32的板子加进去,实现三机通讯。有了这个想法后着手去做了,但没有实现。
先来说说我在学习STM32 can总线模块时的一些心得吧:
这部分主要是位时序和过滤器的理解心得:
位时序,就是发送一位所用的时间,在这样一段短暂时间里,又分了四段:同步段、传播段、相位缓冲段1、相位缓冲段2.这些都是在其他总线通信中不曾遇到的,有些初学者看到手册上后面的介绍基本就晕菜了,很难接受和理解,不知道为什么要这么做,其实把这样一小段时间又分成4段就是为了进行同步。
CAN总线的通讯时采用NRZ(Non-Return to Zero,非归零)码,数据本身并不携带时钟信息,也就是说在每一位的开始或结束没有同步信号,发送单元以位时序同步的方式开始发送帧数据,接收单元根据总线电平的变化进行同步并进行接收。可以这样理解,总线上的发送端和接收端以相同的频率振荡,这个振荡就是时钟信息,很同步,很和谐,这样发送端发个数据,它就这样以同样的频率振啊振的振到接收端,接收端察觉并接收,很完美哈?可这只是理想情况,在实际情况中,发送端和接收端会存在时间误差,传输路径也会有相位误差,这些都可能使二者在收发操作中失去同步关系,这个时候要想再实现通讯,接收端就必须调用同步机制,调整它的操作时序。
CAN bus 有两个同步机制:硬同步和重同步
硬同步:在总线空闲状态时,接收单元检测到SOF就会执行这个同步调整过程,“隐式”电平跳变到“显式”电平的边缘的时间点被认为是接收端位时序的同步段,不用管SJW的值。这种同步在一个帧中只出现一次,就是在开头。
重同步:接收节点在一帧中间如果检测到信号从1到0 的变换边沿是在传播段或者相位缓冲段1中,则认为自己的位时序提前了,这是因为采样时间点会出现在相位缓冲段1与2 之间,过早采样会造成采样不准,所以接收端就将这个位时序周期的相位缓冲段1延长;反之,如果检测到边沿在相位缓冲段2中,则将相位缓冲段2缩短,最终让信号变化的边沿变回到同步段,这样,是不是觉得一个位时间分成四段很合理了呢。
对于这个同步机制,我也没有特别深入的研究,如果有谁在这方面有更好的心得,欢迎分享。
再来聊聊过滤器吧。
CAN总线设计了过滤器在芯片里,用于筛选报文,STM32 手册里把过滤器说的云里雾里的,害苦了我们这些初学者,其实很好理解:
我先来简单啰嗦下过滤器的工作方式:
根据配置,每一组的过滤器组可以有1个、2个或4个过滤器
这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上“过”一下,能通过的报文是有效报文,收进FIFO,不能通过的是无效报文,直接丢弃,每一个过滤器是并联的,即一个报文只要通过了一个过滤器,就是有效的报文。
对于这方面的介绍,大家可以戳这个链接http://www.openedv.com/posts/list/20666.htm 是论坛上关于过滤器很详细的一个介绍,借花献佛,和大家分享。
如果大家还是不能很好的理解过滤器,那我们举个例子带大家进入角色:想象一下,你想去寄快件(发报文),但是国家垄断,没有四通一达上门服务,只能去邮局(若干过滤器组),邮局又比较落后只开了2个投送目的地(接收后保存报文的FIFO),但他们不是什么快件都寄,易燃易爆的不给寄,所以就要筛选,开辟了几个窗口进行筛选(激活的过滤器组,最多14个),每个窗口配备人员不同(过滤器组设置),有的是一个连长加一个班长(2个32位过滤器,工作在屏蔽位模式),有的是两个连长(2个32为过滤器,工作在标识符列表模式),有的是两个班长加两个士兵(4个16位过滤器工作在屏蔽位模式),有的是四个班长(4个16位过滤器工作在列表模式中),这不同的人员配置起到作用不同,官大一级压死人的道理大家都懂,所以你拿去的快件,优先给官大的人筛选,不同级的人员配置中,官大的点头才能寄,平级的谁点头都行,通过之后就存在他们的仓库里了(FIFO中),当然,要是没有你想寄去的地方,你就要去别的邮局看看了,不同邮局寄送的城市不同(寻找下一个节点继续匹配)。
这个例子只是为了形象建立过滤器的工作模式,细节可能有出入,我上面推荐的帖子,非常好。
写到这关于STM32 can总线的学习心得基本就结束了,接下来我想说说我那个失败的实验经历:
实验电路板是两块基于c8051f040 芯片的can通讯电路板和STM32 战舰电路板,实验结果:两块c8051f040 的电路板可以完美通讯,STM32 的板子无法加进去,期间保证了波特率相同,位时序频率相同,传输数据位数相同,id也是匹配的,但是无法通讯,想问下有此方面经验的同僚们,在保证了以上数据相同的前提下,连接两个电路板是不是理论上可以实现通讯?
|