学习can总线问题总结

学习can总线问题总结

 

【问题】为什么can两根线之间接120欧姆呢?

——CAN总线在信号传播时我们知道是高低电平的搭配,那么电信号在导线中传播时,线束长度是有限的,那么意味着电信号本来的传播介质是铜线或者铝线,到终点除时就变成了空气,这种介质的转变会产生反射,这就像水面会反射天空的倒影,同样CAN信号的入射波在终点产生反射,而反射波与CAN节点的入射波会产生干涉,就会导致错误帧的出现,错误多了节点就停止发报文了。
在终端加上电阻就好比在终点添加了渐变的介质,让CAN报文能正常收发。

——使终端电阻等于电缆阻抗时可以消除反射,故CAN上使用的双绞线为120Ohm。

 

 

【问题】位填充和发送错误标志帧区别?

——这是总线的一种编码方式,当帧起始、仲裁场、控制场、数据场以及CRC 序列均通过位填充的方法编码时,无论何时发送器只要检测到位流里有5 个连续相同值的位便自动在位流里插入一补充位。因为如果在使用位填充法进行编码的信息中出现了第6 个连续相同的位电平,将检测到一个填充错误,错误计数值加1。

为了避免错位,并不是说每个5位后都有填充,是在出现连续相同的5个位后才需要填充,比如00000、11111后填充一个相反位,如果接收模块连续采样到5个相同位,那么下一位相反则正确,下一位依旧没变,那通信就出问题了,是一种防错的手段。

——位填充的作用是避免总线上出现太多的连续相同码时,收发双方失步,因为CAN总线是NRZ编码的。位填充可以确保至少每6个位时间就会产生跳变沿,这样的话才能让接收端的锁相环保持与发送端同步。

 

不归零码位填充技术(指的是总线上只有2个状态,收发1个bit位之后,其总线状态不需要回到状态0,是相对于归零码位填充技术而言)

 

【问题】总线空闲状态?

——当你一值监测到总线都处于隐性状态(就是两根线电压值差不多)那就说明总线处于空闲状态,如果是显隐交替,那就是总线不处于空闲状态。
不过CAN总线传输速率还是比较快的,拿低速一般125k的来说,就算是一帧扩展帧29位标识符的报文,也大概在130位左右,这样算起来这帧报文只需1ms多一点就传输完了,如果是高速CAN时间就更短。不过应该会有这样的软件可以监测总线的状态的。

判断总线状态可以监测总线电压,简单来说CAN_H和CAN_L之间的差分电压大的(一般在2V左右)就是显性状态,差分电压小的(理论上是0V)就是隐性,当然容错CAN要复杂很多,就不是这样的。当你一值监测到总线都处于隐性状态(就是两根线电压值差不多)那就说明总线处于空闲状态,如果是显隐交替,那就是总线不处于空闲状态。

CAN总线空闲的定义是连续11个位的隐性电平(逻辑为1),一般用于总线关闭时的自动恢复。而CAN的显性电平逻辑为0,一旦有显性就说明肯定至少有1个节点在发送波形,那就不是空闲了。CAN的帧间隙是连续3个以上隐性电平。

 

【问题】当总线空闲时,多个节点同时传输报文,如何防止冲突?

——如果有两个或两个以上的节点开始传送报文,那么就会存在总线访问冲突的可能。但是CAN使用了标识符的逐位仲裁方法可以解决这个问题。

 

【问题】帧ID越小,优先级越高,原因是?

——在仲裁期间,每一个发送器都对发送的电平与被监控的总线电平进行比较。如果电平相同,则这个单元可以继续发送。如果发送的是一"隐性"电平而监视到的是一"显性"电平,那么这个节点失去了仲裁,必须退出发送状态can总线采用“线与”规则进行仲裁,显性电压值为0)

 

【问题】总线上的节点如何知道那些数据是传送给自己的呢?

——发送数据时,帧数据里面的ID就表示要接收数据的ECU。

(在Can总线系统中,TBox也是一个ECU,其标志为0x49B)

CAN报文包含一个ID场的部分,每个报文在总线上广播,节点收到报文后比较ID,如果是该节点应该接受的报文ID,该节点则完成接受;

 

【问题】本地过滤,指的是什么?

——应该是硬件功能?

 

【问题】CAN消息机制的各个帧的功能和作用?

CAN消息机制—四种消息类型

CAN标准定义了四种消息类型,每条消息用一种叫做比特位仲裁(Arbitration)机制来控制进入CAN总线,并且每条消息都标记了优先权。另外CAN标准还定义了一系列的错误处理机制。

CAN报文的四种消息类型:

· 数据帧:数据帧将数据从发送器传输到接收器。

· 远程帧:总线单元发出远程帧,请求发送具有同一标识符的数据帧。

· 错误帧:任何单元检测到总线错误就发出错误帧。

· 过载帧:过载帧用在相邻数据帧或远程帧之间的提供附加的延时。

备注:数据帧的发送器和接收器,是针对收发对象而言的,并非指的是can芯片的收发器。目前这个项目上只用到了数据帧,远程帧没有用到。

只用了数据帧,can总线上的数据有相同的ECU的数据,不会导致冲突;因为设计map表时,将远程控制天窗ECU、车况查询天窗ECU设计为不同的ID号,故不会出现数据冲突情况。

远程帧大部分用在总线唤醒的场景。

 

 

 【问题】数据帧和远程帧的区别?作用?

——CAN 远程帧是一个空数据场的帧, 关键是在它的ID场和远程帧标志位,当远程帧标志位为1时他就是远程帧,数据场必须为空,被请求节点通过ID场的辨识来响应,发送被请求的帧到总线上,具体举例BCM需要知道车门的状态,一个远程帧过去,车门把自己的状态发回来

——远程帧后面是不带数据字节的,数据帧后面必然会带1到8个字节数据。
远程帧就是CAN数据流中的RTR位为1,为0时是数据帧,具体位置要查CAN标准,在寄存器中的位置要看相关的芯片手册

 

【问题】过载帧和帧间空间区别?

——过载帧,是由硬件系统自动产生的;

 

 

【问题】当总线的某一个节点检测到错误,如何检测到错误?

——CAN总线错误帧长得啥样?怎么产生?

前两天,帮一个客户调试CAN总线,他的板子发数,USBCAN接收,但是总是调试不成。我接上示波器,量一下CANH与CANL之间的波形,发现他板子不连接USBCAN接口卡时,波形是正确的;可是一旦连接上USBCAN以后,波形就成了以下这个样子:

 

    就是刚发了第一个显性位之后,就有个阶梯的电压下降,然后保持几个位后,恢复到隐性电平,过了一会,才有正常的波形出来,可是这个帧只剩下一半了,肯定不可能发送成功

    我开始以为是收发器不匹配,换了几个收发器都是一样的。突然我想到这个很像错误帧。既然有错误帧,那就说明可能波特率不对。仔细看了程序,发现波特率是12M下算出来的,而晶振却用了16M。立马调整波特率,OK。通讯成功。 那个阶梯的波形也没有了。

    所以可以肯定,那就是一个错误帧。但为什么有个阶梯呢?答案很简单,因为CAN通讯的两个节点的收发器的电源不同,比如,发送节点的电压稍微高点,那么其CANH被拉高时电压也高,故显性位输出时,差分电压也高。所以当发送节点发送的显性位被接收节点接收后,接收节点发现波特率不匹配,则马上发出错误帧(6个位的显性电平),但是接收节点电压稍微低,故差分电压也小一点,所以产生了一个“阶梯”。

    下面为错误帧的定义:

 

     错误帧是节点收到信息,被认为错误时,而向总线广播的一种帧。比如前面这个错误帧的作用就是:接收节点通知发送节点:你的发送有主动错误,你的发送错误计数器要加8;同时接收节点的接收错误计数器要加1。

     这样,不同波特率的总线下,少数不同波特率的发送节点总是先退出总线(错误计数器达256时,进入总线关闭状态),保证了其他节点的正常通讯。

 

 

1、CAN错误检测(Error Detection)
CAN网络具有严格的错误诊断功能,该功能已固化在硅片之中,一旦错误被检测,正在传送的数据帧将会立即停止而待总线空闲时再次重发直至发送成功,该过程并不需要CPU的干涉除非错误累计该发送器退隐(Bus Off)。CAN控制器可检测如下五种错误:
   √ 位错误(Bit Check Error)
   发送器在发送比特流的同时也对发出的比特流采样回收,若送出的bit与所期待的bit不合,则会检测到一个Bit Check Error;

 

   
   √ 位填充错误(Bit Stuff Error)
   在需要执行位编码规则的位流序列中检测到第6个连续的极性相同的位序流时,则检测到一个Bit Stuff Error;
  
   √ CRC 错误(CRC Error)
   发送端送出的CRC序列由发送器算出,接收器执行同样的CRC算法,若计算结果与接收到的CRC序列不符,一个CRC Error被检测到,由发送端送出;

 

  
   √ 帧格式错误(Frame Check Error)
   当一个固定形式的位场含非法位,则检测到一个Frame Check Error(接收端检测到帧结束最后一位为显性时帧错误忽略);

 

   
   √ 应答错误(Acknowledgment Error)
   ACK SLOT采样为隐性,则检测到一个Acknowledgement Error;



  

2、CAN错误界定(Error Confinement

   CAN控制器内置两个错误计数器:Receive Error Counter及Tranmit Error Counter(错误计数器的计数规则后附)。当某个计数器的当前值达到128时,CAN控制器将进入“Error Passive Mode”,此时该节点仍然参与CAN通讯,检测到错误时只能发送“Error Passive Flag”,且错误帧发送完毕重启下一个发送之前有8bits位时的挂起状态;当Tranmit Error Counter当前值为255接着又一个错误被检测到时,CAN控制器将进入“Bus Off Mode”,此时该节点与总线完全脱离,整个瘫痪;计数器当前值均小于128时,CAN控制器被标识为“Error Active Mode”,CAN节点可正常通讯并检测到错误时发送“Error Active Flag”。这三种状态之间关系为:

 

3、LPC2294中的CAN控制器错误处理

   LPC2294内置的CAN控制模块完全符合CAN Spec 2.0B,当CAN控制器被迫进入BusOff状态后:CANGSR寄存器中的BS位置位;CANICR中的BEI位置位,若CANIER寄存器的BEIE使能,将引发CAN中断;CANMOD中的RM置位,CAN控制器处于复位状态;同时发送错误计数器被设置为127,接收错误计数器清零。CAN控制器进入BusOff状态后必须由软件复位RM位,以恢复通讯;RM清零进入Normal Operation状态后,当检测到总线上11bits的连续隐性位流出现128次之后,发送错误计数器清零,CANGSR中的BS、ES位清零,同时若中断允许,将产生中断,CAN控制器重返CAN通讯。

 

 

【问题】那些情况下,会引起过载帧?间歇字段是什么?

——过载帧是接收节点用来向发送节点告知自身接收能力的帧。

过载帧跟错误帧结构类似包括过载标志和过载定界符,有3种情况会引起过载:

· 接收器内部的原因,它需要延迟下一个数据帧或是远程帧。

· 在间歇字段(看下面的帧间空间)的第一位和第二位检测到一个显性位(间歇字段都是隐性位的)

· 如果CAN节点在错误界定符或是过载界定符的第八位(最后一位)采样到一个显性位逻辑0,节点会发送一个过载帧,错误计数器不会增加。

 

猜你喜欢

转载自blog.csdn.net/llzhang_fly/article/details/80003767
今日推荐