[CAN-bus/DeviceNet] 关于CAN总线各种类型帧的发送和接受的理解

[复制链接]
6103|8
 楼主| hhh489 发表于 2008-10-7 14:03 | 显示全部楼层 |阅读模式
关于CAN总线各种类型帧的发送和接受的理解:<br />&nbsp;&nbsp;&nbsp;&nbsp;初学CAN总线,对CAN总线上数据的发送和接受有一点自己的理解,不知道对不对,写出来请各位达人拍砖。每个节点都有自己的ID,验收代码寄存器和验收屏蔽寄存器。这三个寄存器构成了一套该节点自己的报文滤波规则。只要是总线上的帧满足该节点的滤波规则,那么总线上的数据就会被接收,反之,则放弃该帧。<br />&nbsp;&nbsp;&nbsp;&nbsp;举例说明:假设总线上现在有三个节点A,B,C;他们之间需要互相传发送数据,请求数据;如果节点A要给节点B发送数据,那么在节点A&nbsp;要发送的的帧里面的标志域(ID)的设置上就要满足节点B的滤波要求,而与节点A本身的ID没有关系;如果三个节点之间只是存在点对点的数据传送,而不存在一点对多点的同时数据传送(广播),那么这三个节点的滤波条件的设置即ID,验收代码寄存器和验收屏蔽寄存器,不能完全相同。<br />&nbsp;&nbsp;&nbsp;&nbsp;不知道我的理解对不对?
caycat 发表于 2008-10-13 00:30 | 显示全部楼层

还得继续看书

ID还是总线用于仲裁用的,CAN芯片首先侦听网络,发现总线空闲,就通过ID可以发数据,如果同时都侦听到了总线,ID低的具备优先的权利,接收的话是根据其他节点的要求,选择屏蔽位。
cocobat 发表于 2008-10-22 11:05 | 显示全部楼层

Leon的一些理解:

Leon的一些理解:<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN网络在进行数据传输时,支持多主机结构,只要网络空闲,各个节点都可以发送数据,如果发生两个节点以上同时发送数据而导致冲突,那么所有的节点都停止发送,回到监听总线状态,直到冲突结束,再继续发送。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于冲突的处理,由仲裁机构来解决,根据识别符来判断各个节点的优先级,优先级高的重新发送,低的退出发送。<br /><br /><br /><br />欢迎探讨&nbsp;&nbsp;http://www.soon-now.com/bbs/dispbbs.asp?boardid=13&id=126&page=1&star=1<br />
xhtxzxw 发表于 2008-12-4 22:25 | 显示全部楼层

嘿嘿

LS:<br />&nbsp;CAN网络在进行数据传输时,支持多主机结构,只要网络空闲,各个节点都可以发送数据,如果发生两个节点以上同时发送数据而导致冲突,<br /><br />&quot;那么所有的节点都停止发送,回到监听总线状态,直到冲突结束,再继续发送。&quot;<br /><br />加引号的说法是错误的.应该是:<br />那么只有优先级最高的节点继续发送,其他所有节点都停止发送,回到监听总线状态,直到冲突结束,再继续竞争总线。<br /><br />
王敬 发表于 2008-12-16 13:13 | 显示全部楼层

问一下

那如果没有使用优先级呢,ID都一样,会出现什么情况?
王敬 发表于 2008-12-16 13:18 | 显示全部楼层

补充

当出现总线仲裁中断时,是系统自动解决仲裁问题,还是需要人为写代码解决呢&nbsp;?怎样解决?
xhtxzxw 发表于 2008-12-16 20:41 | 显示全部楼层

嘿嘿

硬件完全自动做的,不需要人为参与的.<br />打个比方吧,&nbsp;N个人闭着眼睛呆在只能通行一人的走廊两侧的房间里,&nbsp;相当于N个CAN节点吧.<br /><br />类比:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN节点&nbsp;====&nbsp;呆在屋子里的闭着眼的人<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN总线&nbsp;====&nbsp;走廊<br />&nbsp;&nbsp;CAN使用权总线竞争&nbsp;====&nbsp;走廊通行权竞争<br />CAN节点往总线上发ID&nbsp;====&nbsp;人往门外扔鞭**<br />&nbsp;&nbsp;ID里面的一个隐性位&nbsp;====&nbsp;扔一个哑**<br />&nbsp;&nbsp;ID里面的一个显性位&nbsp;====&nbsp;扔一个响**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总线空闲&nbsp;====&nbsp;一段时间里走廊上没有人走动的声音也没有**声<br /><br />仲裁规则:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发出去的ID和自己收到的ID一样则赢得总线使用权&nbsp;====&nbsp;扔出去的**该响的响了该哑的哑了则赢得走廊通行权<br /><br />当发出一个隐性位却收到一个显性位就不需要继续发ID了&nbsp;===&nbsp;当扔出去一个哑**却听见有**声就不用继续扔**了<br /><br /><br />
littlef 发表于 2008-12-18 20:00 | 显示全部楼层

问个弱相关问题

&nbsp;&nbsp;&nbsp;&nbsp;我现在只有一个CAN&nbsp;模块,没有其他的CAN模块和我通信,如果我编程把CAN设置为发送数据帧,那么CAN能把数据发送出去吗?我怎样来判断我是否发送成功了呢?<br />&nbsp;&nbsp;&nbsp;比如有两个节点A,B.A发送,B接受,是不是A是否发送成功还要取决于B啊,单独的A是无法发送数据的,是吗?<br />&nbsp;&nbsp;&nbsp;希望高手赐教啊,我刚接触CAN.
xhtxzxw 发表于 2008-12-20 01:47 | 显示全部楼层

嘿嘿

回LS<br />一般来说,至少需要两个CAN节点才可以做你所说的测试.<br /><br />原因:<br />CAN通信成功的最后一步是:发送方收到了接收方回送的ACK.如果没有这个ACK,发送方就认为这次发送失败了,一般就会不停的反复重发(当然一般也可以设置不自动重发).<br /><br />有一部分CAN器件,比如SJA1000可以配置工作在&quot;自发自收&quot;模式(自己给自己回ACK,有点象自慰呵呵).这样,如果你的测试装置里有比较方便的人机界面,就可以通过查询SJA1000里面的状态寄存器并通过你的人机界面显示出来,间接的知道CAN的工作是否异常了.<br /><br />不幸的是,并不是所有的CAN器件都支持&quot;自发自收&quot;模式.这样的话,就必须有至少俩节点了!<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部