||
相信很多人都用485总线开发过通讯程序,而Can作为一种总线通讯方式也逐渐获得了广泛的应用,本文主要写给那些从以前开发过485总线通讯而准备转向Can总线通讯的开发者。
先说说Can和485总线的共同点,由于两者从物理曾上来说都是采用了差分传输方式,因此有如下共同点:
1.Can本质上是差分传输所以需要两根线一根是CanH,一根是CanL.这点和485总线类似在硬件连接上都至少需要两根通讯线。
2.既然是串行总线通讯就必然有波特率的问题,接收和发送的波特率必须一致才能正常通讯,两者的工作方式也有类似之处都是在一定时间内采样总线上的电平变化来判断传输信息。
与485相比can的传输过程更复杂一些。从硬件设计上需要考虑如下几点不同:
a.485总线波特率设定比较简单,采样的频率决定了波特率,Can的波特率设定比较复杂。一个bittime可以分成4段,SYNC_SEG,PROP_SEG,PHASE_SEG1,PHASE_SEG2,其中PROP_SEG和PHASE_SEG1的时间需要同时设定,具体的设置方法可以参考各种外设的工作手册。
b.Can总线本身就是为多主系统设计的,可以在一根总线上有多个主站。而485本身只能是单主的,只能通过其他的办法(如令牌)来变成一个多主系统。这是由硬件特点决定的。485总线上如果有两个节点同时都发送了信号,总线状态无法不确定的,即发送的报文可能已经被破坏了,为了解决这个问题,在某一时刻只能有一个站点主动发起通讯,其他站点都可看成从站。而Can的对比的主要优点在于可以实现非破坏仲裁,为此在硬件上进行了特殊设计,从总线可以看成是一个线与的结构,如果两个或以上节点发送信号电平不一致,总线电平显示为显性,这意味着至少有一个站点的报文没有被破坏。为了仲裁节点在发送信号的同时还在监测总线,如果发送和检测不一致则认为本节点发送报文已经被破坏。节点会自动退出发送状态等待发送结束以后开始下一次发送。而报文始终正确的站点最终取得总线控制权。
cCan有一个自动重发机制。如果报文发送不成功会自动重发报文。在发送报文的结尾会由其他的接受从站附加一个ACK位,当检测到此位的时候主站认为发送成功。
dCan的外设通常有一个错误计数器,对发送和接收的错误进行累加,如果超过一定的值就会报错。而进入一种总线关闭状态,这样做的目的是避免由于节点自身的问题而影响总线上其他设备的正常通讯。
由于Can有这些特点在进行软件设计时和485总线对比也要做一些修改
从编程模式来说,485和Can的外设在接收数据方面都会把总线接收数据放到一个区域再发生中断由主程序读取,而发送时也是写入一个区域再通知外设来发送。而Can的数据是按照帧来组织的,而485的数据通常按照字节来组织。
由于Can总线是通过起始的地址位来仲裁传输数据的优先级因此在编程的过程中不需要一个确定的主站作为每次通讯的发起方。每个节点都可以主动发起通讯,这样在一些场合比如几个节点需要读取的数据频率相差很大的时候
采用
采用Can的效率就很高,主节点可以一次配置从节点的数据产生速度,由从节点自动发送。而如果采用485的话只能用轮询的方式,每个从节点分配的时间一样,相对而言效率就低多了,另外为了防止优先级比较高的节点始终占有总线,最好再定一个禁止时间,在禁止时间之内不要发送报文,这样优先级低的报文也可以保证获取传输权力。同时错误计数器也可以帮助程序调整发送的频率或者产生报警信号。