打印
[CAN-bus/DeviceNet]

CAN总线空闲会不会和数据冲突?

[复制链接]
1477|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
13400013591|  楼主 | 2020-2-27 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我理解的仲裁,3个NODE同时发,ID最小的那个会赢得仲裁

NODE1     32F         011    0010    1111        第二个退出仲裁

NODE2     33F         011    0011    1111        最先退出仲裁

NODE2     32D        011    0010    1101        赢得仲裁

-----------------------------------------------------------------------------------------------------------

这是同时发送的情况,仲裁很好理解,那么如果不是同时发送呢


一个NODE想要发送,条件是总线空闲,也就是11个bit  的逻辑1.

仲裁域11bit ,数据域有64bit最大,那么如果NODE1的数据域包含了11个逻辑1,会不会被NODE2认为是总线空闲?

总线被误认为空闲后,NODE2发出仲裁域数据,假设特别巧,正好NODE1的数据域里面的数据和NODE2的仲裁ID相同,那么NODE2岂不是以为自己赢得了仲裁?


如下:
NODE2的仲裁ID是011    0011    1111,NODE1的数据域中包含了111   1111   1111   011    0011    1111

NODE1先发送,因为NODE1占了总线,NODE2等待总线空闲,注意下面的红色部分,会不会让NODE2误认为总线空闲?


NODE1    【仲裁域】-----略-------【数据域-----111   1111   1111                   011    0011    1111】----------略------------

NODE2                  准备发送-------------------------总线看上去空闲------------NODE2仲裁ID和NODE1的数据恰好一致  


这时候是不是就会出错了?
如果知道的大佬麻烦说两句,非常感谢!


使用特权

评论回复

相关帖子

沙发
sjnh| | 2020-2-27 11:18 | 只看该作者
你说的这种情况是不存在的,仲裁是一开始NODE1和NODE2都认为总线是空闲的,然后2个节点开始发送;
而你说的这个情况,NODE1已经发送了,这个时候NODE2已经是接收总线的数据,知道总线被占了,只要NODE1没发送完成或总线出了错误,NODE2还处于接收状态,还没到去判断空闲的状态;这个时候NODE2根本不会开启发送

使用特权

评论回复
板凳
13400013591|  楼主 | 2020-2-27 11:58 | 只看该作者
本帖最后由 13400013591 于 2020-2-27 11:59 编辑
sjnh 发表于 2020-2-27 11:18
你说的这种情况是不存在的,仲裁是一开始NODE1和NODE2都认为总线是空闲的,然后2个节点开始发送;
而你说的 ...

老哥,可能我没说清楚。
最关键的是,NODE1和NODE2不是同时开始发数据。
NODE1发到数据域了,NODE2才准备发。

那么这时NODE2就会看总线是否空闲吧?
数据域里面的数据是用户数据,可以是任何值,如果NODE1的数据域正好有11bit 的逻辑1 ,那么NODE2是不是就认为总线空闲了?
然后NODE2发仲裁域,刚好NODE1的数据域里面的数据正好等于NODE2的ID,那么NODE岂不是认为自己仲裁成功了?

使用特权

评论回复
地板
13400013591|  楼主 | 2020-2-27 12:06 | 只看该作者
sjnh 发表于 2020-2-27 11:18
你说的这种情况是不存在的,仲裁是一开始NODE1和NODE2都认为总线是空闲的,然后2个节点开始发送;
而你说的 ...

老哥,或者我简略的问问啊

判断总线空闲:总线11bit 逻辑1  ; 这个对吧?
NODE1的数据域里面,刚好有11bit 逻辑1,其他NODE这个时候会不会以为总线空闲了?

使用特权

评论回复
5
dalarang| | 2020-2-27 12:22 | 只看该作者
不要钻牛角尖,11bit逻辑1是判断总线空闲的必要条件,但不是唯一条件。当总线上有一个节点在发送数据时,其它节点是可以监控到数据帧是否结束的,在结束前不会去判断总线是否空闲。

使用特权

评论回复
6
sjnh| | 2020-2-27 12:33 | 只看该作者
本帖最后由 sjnh 于 2020-2-27 12:37 编辑
13400013591 发表于 2020-2-27 12:06
老哥,或者我简略的问问啊

判断总线空闲:总线11bit 逻辑1  ; 这个对吧?

你再看看协议,协议里规定只要有5个连续的相同位,就会强制插入一个补码位

使用特权

评论回复
7
13400013591|  楼主 | 2020-2-27 13:00 | 只看该作者
dalarang 发表于 2020-2-27 12:22
不要钻牛角尖,11bit逻辑1是判断总线空闲的必要条件,但不是唯一条件。当总线上有一个节点在发送数据时,其 ...

搞通信找bug不就是要考虑极端特定条件嘛,不是钻牛角尖

使用特权

评论回复
8
13400013591|  楼主 | 2020-2-27 13:01 | 只看该作者
sjnh 发表于 2020-2-27 12:33
你再看看协议,协议里规定只要有5个连续的相同位,就会强制插入一个补码位 ...

好的非常感谢,我去查查协议。
如果有这条做支撑就会不会出现前面说的数据域里面连续11个bit1 了

使用特权

评论回复
9
13400013591|  楼主 | 2020-2-27 13:28 | 只看该作者
13400013591 发表于 2020-2-27 13:01
好的非常感谢,我去查查协议。
如果有这条做支撑就会不会出现前面说的数据域里面连续11个bit1 了 ...

Whenever a transmitter detects five consecutive bits ofidentical value in the bit-stream to be transmitted, it automatically inserts a complementary bit inthe actual transmitted bit-stream.
五个连续相同bit ,加入一个补码
老哥太感谢,文档实在太多,就算中文的我也不可能都看到,提点一下搜关键字马上找到了。

使用特权

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

本版积分规则

16

主题

56

帖子

1

粉丝