jinyitong 发表于 2012-7-27 14:47

CAN总线,没有同步信号,收发双方如何准确交换数据?

最近接触到CAN总线,看了好久了,云里雾里,资料翻了好多,都讲的很抽象,没有一个能用通俗的语言把CAN通信的原理及实现方法讲透的,也许这个协议只适合研究人员进行学术研究。
   但现在的项目又必须搞清楚这个该死的协议怎么工作的,噢-卖糕的!!
我仅代表初学者,向前辈,大侠们,请教如下问题:

1,这个CAN总线共两根线,两根线都是数据线,没有同步信号线,怎么确定“位”?也就是说“高”多久认为是1,超出多少ns认为是11了?如果有很长时间的一个高信号,怎样区分是1和11或111或1111或11111???
2,这个该死的协议用了“报文”这个词,报文里又有 “起始位”+“标志符11或29位”+“数据位”+“效验”,这个“标识符”好像是决定了“谁有发言权”,那挂在总线上的每个分机这个标识符该是多少?如果某个分机A总是发00000000000,哪这个分机A总有对总线的控制权,那别的分机何时才能有“发言权”,我的意思是,各个分机的“标示符”是如何生成的?随机的?还是定好的?还是跟要说的话有关系?如果某个分机总是“平民”,进不来“人*大”,是不是总也说不上话?哪他的“言论”不久无法表达了吗???
3,有的CPU芯片上有两组CAN总线,例如:STM32F107V和英飞凌XC886等,一组都可以并联100多个节点(分机),用得着两组吗?真要用得到两组来交换200多分机的数据,哪数据量也很不小啦,还是说两组CAN总线另有他用??

还有好多不明白的地方,先问这么多吧,一次最多只能给50分,问太多了不合适。下次问再给50分!

jinyitong 发表于 2012-7-27 15:58

顶一下,期待高手解决

HWM 发表于 2012-7-27 16:32

串行异步通讯其收发方都必须约定一定的传输速率(协议的一部分)。

carl_lee 发表于 2012-7-27 17:46

1,如楼上hwm大师所说,can是靠双方约定好的波特率来确定位的
2,标识符是报文的id,一个模块可以有多个报文,id是由用户根据实际应用规定的,在同一时刻,高优先级报文优先发送,发送完后低优先级就可以发送了,所以说优先级低的报文还是可以发出去的,低优先级的报文有可能出现较大延迟

3,一个系统有2个CAN网络的话,一方面是由于系统包括2个完全不同的子系统,比如汽车中的PCAN,和BCAN,前者挂的是与安全息息相关的动力模块,双CAN可以实现安全隔离,使整个系统更加可靠,另一方面,can总线在不同的波特率下支持的模块数量是有限的。

jinyitong 发表于 2012-7-28 10:27

感谢楼上的大师解答!!

关于标示符:
1,这个里边可以包含分站的“身份识别”成份,也就是系统设计者自定义的,可以这样理解吧。
2,两个不同优先级的同时申请发送时,高优先级的先传,之后多久低优先级的可以传?好像协议里只是讲到了仲裁,没看到“高优先”传完“低优先”接着传的这部分内容,如果10个子站同时申请仲裁,那就是由高到低10个分站依次传完,总线空闲下来后再传回应信息,哪子站的接收缓冲溢出了丢数据了怎么办?

ilikerome 发表于 2013-8-10 00:00

jinyitong 发表于 2012-7-28 10:27 static/image/common/back.gif
感谢楼上的大师解答!!

关于标示符:


这都是数据链路层的MAC子层实现的,硬件都搞定了,初级可以不用考虑这些问题,关注节点的状态就可以了。
CAN总线是生产-消费模式,没有什么主从。

sfpxfpcfp 发表于 2013-8-10 19:23

高手很多,,,我来学习

sorryoffline 发表于 2013-8-12 20:41

关于第3个问题
1、显性电平:是指只要总线上只要有任何一个设备发送显性电平,总线就表现为显性电平,例如对于与逻辑,0电平就是显性电平。
2、总线冲突:是指总线上不同设备在某一个位发送的电平不同,导致发送隐性电平的设备出现发送错误,冲突分为有损和无损,CAN
是无损的,所以实时性好,适用于控制。

10个设备同时发送,因为设备的id不重复,那么必然是只有在每次总线冲突中都发显性电平的设备才能发送成功。
如何区分优先级,由设备的id决定,按位比较,以与逻辑举例,先出现0的id优先级高。假设先发高位,数据越小,优先级就越高。
对于CAN来说,高电平是显性位。

lcr52099 发表于 2015-11-19 22:37

那么请问一下
发送节点的报文是通过广播的形式发送的,理论上每个节点都能接收到总线上的信息
但是具体是那个节点去接收总线上的信息,这个是由什么决定的呢

来与君 发表于 2015-11-19 23:56

lcr52099 发表于 2015-11-19 22:37
那么请问一下
发送节点的报文是通过广播的形式发送的,理论上每个节点都能接收到总线上的信息
但是具体是那 ...

理解CAN总线的设计要抛开“主 - 从”思想。

发送节点只管发送,不管有没有另外的节点需要这条报文。当然CAN硬件的ACK机制使得发送的节点能够清楚是否至少有另一个节点成功接收了该报文。

lcr52099 发表于 2015-11-20 12:50

来与君 发表于 2015-11-19 23:56
理解CAN总线的设计要抛开“主 - 从”思想。

发送节点只管发送,不管有没有另外的节点需要这条报文。当然 ...

是的,这一点在书籍上看见过。
但是按照广播的理解,发送节点发送出去的数据每个节点都会接收,
这样的话会不会很浪费这些接收节点的CPU资源呢?
还有就是如果这些节点接收到发送节点发送过来的后,是怎么判断一帧数据是否是它自己需要的呢?

有的资料上说的是通过CAN收发器上面的滤波器过滤掉不需要的信息,那又是怎么实现的?

新人小白,不懂的地方太多了,能不能帮忙解答一下

yizi0000 发表于 2015-11-23 16:47

过滤器里设置了哪些ID的消息不接受,或者接收到了但是后端也不可见。
页: [1]
查看完整版本: CAN总线,没有同步信号,收发双方如何准确交换数据?