`
cgp681ws
  • 浏览: 18499 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

CAN总线学习笔记(转)

 
阅读更多

CAN总线学习笔记(转)
2011年06月19日
  CAN笔记(转)
  事先声明:以下文字全文摘抄自网络,来源我忘记了。因为个人感觉写的比书上的内容容易理解所以发上来。仅供参考。欢迎交流讨论。
  1、CAN协议(Conroller Area Network Protocol)为Robert Bosch公司开发(1982年),最初应用于汽车内部网络的通讯。CAN通讯具有严格的错误检测机制、高传输速率,兼低成本、易于实施,特别适合节点之间关键数据传输的小型嵌入式网络通讯;
  2、CAN网络各节点平等竞争,无所谓主从,CAN通讯基于生产/消费者模型,一个节点生产(发送)的数据可同时为网络上的一个或几个节点同时消费也即接收(本人强烈鄙视某些教科书上将CAN网络描述为多主方式!!);
  3、CAN协议严格的规范了OSI模型中的数据链路层,并未对物理层作出强硬的约束,因此,CAN帧msg可传输在各种物理介质上,比较常见的为双绞线信号传输;
  4、CAN总线上的逻辑电平:CAN-bus采用差分电压信号驱动,用显性电平(逻辑0)、隐性电平(逻辑1)标识,当CAN-bus表现为显性时,CAN-bus为差分电压驱动状态,CANL电平为“Gnd”偏上,CANH电平为“Vcc”偏下;当CAN-bus表现为隐性状态时,CAN-bus为未驱动空闲状态,此时CANL、CANH电平均为“Vcc”的一半,比如:假设Gnd=0V,Vcc=5V,则CANH=CANL=2.5V。总线上的先行隐性电平会被显性电平所改写;
  
  5、CAN-bus上的位流序列:仲裁场-CANID最高位最先发送;数据场-Data0最先发送,Data7最后传输,对应每一个字节,高位msb将会先发送;
  位填充规则:位流序列中一旦出现五个连续的显性位将插入一个隐性位,如下图示;同时位流序列中一旦出现五个连续的隐性位将插入一个显性位。
  
  位编码规则:
  1、错误帧和过载帧形式固定,并不通过位填充编码;
  2、数据帧或远程帧的CRC界定符、应答场、帧结束等位场形式固定,不通过位填充编码;
  3、数据帧或远程帧的帧起始、仲裁场、控制场、数据场、CRC序列等位场,均通过位填充规则编码。
  6、关于CAN协议规范,可标识为三种,它们最基本的区别为:
  V2.0A          操作11位标识符
  V2.0B Passive  V2.0A的增强版,操作11位标识符
  V2.0B Active   可操作29位标识符
  当满足不同CAN规范的CAN控制器同时出现与一个CAN网络中时,这些CAN控制器各自的表现为:
  
  CAN笔记续
  [ 2007-5-10 1:56:00 | By: CANopen ]
  1、Message一词在CAN通讯中有特殊的内涵:首先它是一个位流序列,有固定的长度,并且有固定的格式;
  2、通常用一个ID(IDENTIFIER)来标识一个CAN-bus上的Message,在同一个CAN-bus上(如一条双铰线)传输的Message必须具有不同的ID;
  3、一个以某ID值标识的CAN Message也称一个CAN帧(CAN ),当这个CAN帧的ID用11位二进制来标识时为一个标准帧(Standard ),用29位二进制来标识时为一个扩展帧(Extended );
  4、CAN通讯严格执行“非破坏性仲裁”机制,最低优先级的CAN帧具有最高的ID二进制值,因为CAN-bus采用差分驱动,同时写入总线上的显性电平、隐性电平仅表现为显性电平;
  5、标准帧的优先级高于扩展帧,后续将会阐释为什么;
  6、数据帧和远程帧用ID标识,错误帧和过载帧并不占用ID标识符,因为程序员不可能向CAN网络发送错误帧或过载帧,这两种帧由CAN控制器单独编码解码,CAN控制器内部集成错误、过载检测机制,一旦检测到传输错误或过载,CAN控制器会自动发送错误帧或过载帧,程序员只能查询CAN控制器状态位观察网络状态(是什么错误或者是否出现过载);
  7、数据帧和远程帧:
  
  扩展帧ID标识符为ID28-ID0,标准帧ID标识符取扩展帧的高11位(ID28-ID18);
  CAN通讯通过规约IDE位作为对标准帧和扩展帧的标识,在标准帧中该位为显性电平(0),扩展帧中该位为隐性电平(1),接收器检测位流序列的IDE位以识别接收的是标准帧还是扩展帧;
  CAN通讯通过规约RTR位作为对数据帧和远程帧的标识,在数据帧中该位为显性电平(0),远程帧中该位为隐性电平(1),接收器检测位流序列的RTR位以决定对接收状态寄存器中的RTR位置位/复位,而对状态位RTR是否作出响应由程序员决定;
  不管在标准帧还是扩展帧,IDE在位序流中的位置不变,标准帧的RTR位被扩展帧的SRR位替代,SRR位在扩展帧中必须为隐性位,扩展帧的RTR位被置于保留为r1前。这样,当一扩展帧和一标准帧同时出现在网络并且扩展帧的高11位与标准帧相同时,若该标准帧为数据帧,则RTR为显性而对应的扩展帧中SSR位为隐性,于是标准帧竞争总线成功继续发送而扩展帧对应节点竞争失败转为接收节点;
  若该标准帧为远程帧,RTR位与SRR为同为隐性,不存在冲突两帧继续发送IDE位,标准帧中IDE为显性而扩展帧中IDE为隐性,同样标准帧竞争成功继续享用总线而扩展帧对应的节点竞争总线失败转为接收器;
  这也就是标准帧的优先级总高于扩展帧的原因。
  远程帧除不具有数据帧的数据场之外,其它各位场与数据帧一致。
  8、错误帧:
  
  错误帧包括两个位场:Error Flag(错误标识场)和Error Delimiter(错误界定场)。Error Delimiter为八个连续的隐性位;
  CAN通讯的Default Confinement(故障界定)机制会自动的将网络上进入错误状态的节点划入三个不同的等级:Error Active,Error Passive,Bus Off。处于Bus Off状态的节点完全和总线脱离,这里先鄙视它。因此,Error Flag也就仅有两种不同的形式(位编码):ACTIVE ERROR FLAG及PASSIVE ERROR FLAG;
  ACTIVE ERROR FLAG由处于Error Active状态的节点发出,编码为六个连续的显性位;
  PASSIVE ERROR FLAG由处于Error Passive状态的节点发出,编码为六个连续的隐性位;
  处于ErrorActive和ErrorPassive状态的CAN节点都会一丝不苟的执行CAN通讯的Error Dectection(错误检测)机制,一旦检测到错误就会立即发出相应的Error Flag报告;
  ErrorActive状态下节点发出的ErrorFlag破坏了位填充规则,并且不能被改写因此一旦发出其他节点会立马识别出这是一个错误帧;个人觉得ErrorPassive状态下节点发出的ErrorFlag有一种瞎搅乎的味道,它并不驱动总线,其它节点还以为总线空闲而启动传输哩,呵呵;
  ErrorActive节点检测到错误发出六个连续的显性位随即发送隐性位,直至检测CAN-bus也表现为隐性,接着发送7个连续的隐性电平,错误帧发送完毕;
  ErrorPassive节点检测到错误后发出连续的隐性位,若检测CAN-bus出现六个连续的显性位或隐性位则PassiveErrorFlag发送完成,接着继续发送隐性位至检测CAN-bus也表现为隐性,最后送出7个连续的隐性位,错误帧发送完毕。
  注意:由于错误叠加,最终表现在CAN-bus的ActiveErrorFlag会有6-12bits不等。
  错误帧的发出时刻:一旦节点检测到位错误、或位填充错误、或帧格式错误、或应答错误,错误帧立即在比特流的下一个bit发出;若接收节点检测CRC错误,该错误帧在应答界定位处发出,除非之前上述四种错误如应答错误或位错误已经发出。
  9、过载帧:
  
  有三种情况会发送过载帧:
  1、接收端:上次接收的数据未被CPU读取就已经被再次滤波进来的CAN数据改写;
  2、CAN节点检测到帧间隔的第一位或第二位为显性位;
  3、CAN节点采样到错误帧的错误界定场或过载帧的过载界定场有显性位;
  OverloadFlag及OverloadDelimiter与ActiveErrorFlag及ErrorDelimiter一致,不赘述。
  过载帧的发出时刻:(1、)必须、只能在其接收的数据帧结束后马上发出,而且必须、只能在帧间歇的第一个位时间发出;(2、3、)在检测到显性位后马上发出。
  10、帧间隔(Inter Spacing):
  CAN通讯规范:数据帧和远程帧在发送前必须有一个帧间隔,错误帧和过载帧可连续发送无帧间隔限制。帧间隔期间,CAN-bus表现为隐性未驱动状态。
  根据CAN节点所处的故障界定等级及之前为发送器还是接收器,其帧间隔位时也不同:
  对于ErrorActive节点(不管之前为发送器还是接收器),其发送数据帧或远程帧必须在上一个CAN帧结束后等待至少3个隐性位(这三个隐性位被称为Intermission);
  对于ErrorPassive节点,若之前为发送器,其发送数据帧或远程帧必须在上一个CAN帧结束后等待至少11个隐性位方可继续发送;若之前为接收器,其发送数据帧或远程帧在上一个CAN帧结束后等待至少3个隐性位。
  帧间隔(Inter Space)之后CAN-Bus若仍表现为隐性未驱动状态,该总线状态被标识为Bus Idle。
  CAN笔记再续
  [ 2007-5-10 4:15:00 | By: CANopen ]
  1、当同一个CAN网络中出现相同的CANID时
  CAN总线的非破坏性仲裁机制不允许两个(多个)相同ID的CAN帧存在同一网络,当这种情况出现时,就存在一种可能:两个CAN帧同时参与总线竞争,要不同时竞争失败,要不同时竞争成功均获得总线使用权,一旦这两个具有相同ID的CAN帧同时享用总线,仲裁场发送完毕接着发送控制场、数据场……当然这两个位流序列不可能完全相同于是位错误(Bit Check Error)必将同时被两节点检测到,两节点同时发出错误帧接着CAN-bus重启两个CAN帧重新参与竞争…………有一种可能,网络上将出现死循环,所以必须小心!!
  2、以标准帧(数据帧)为例,拆解CAN帧位序流
  
  SOF(Start Of ):显性位(0),必须在Bus Idle状态发出,网络上所有节点在“下降沿”执行一次同步;
  Identifier Field:11bits,CANID;
  RTR(Remote Transmission Request Bit):显性位(0),隐性(1)时标识该帧为远程帧;
  IDE(Identifier Extension Bit):显性位(0),标识该帧为标准帧;
  r0(reserved bit):保留位,发送器必须发送显性位,但接收器检测到该位表现为不敏感,不会激发bit error错误;
  DLC(Data Length Code):4bits,标识数据场的数据字节数,DLC=0时,数据场无数据,DLC>=0x1000时,数据场为8字节数据;
  Data Field:将要发送的过程数据,0-8字节,具体有DLC确定,Data0先发送,Data0的Msb先发送;
  CRC Sequence:循环冗余检测序列,校验和,15bits,由CAN控制器硬件完成CRC算法并位场填充;
  CRC Delimiter:CRC界定符,1bit,必须为隐性;
  Ack Slot:应答间隙,1bit,发送器端送出隐性电平,接收端送出显性位标识握手信号,发送器检测该位为隐性将激发应答错误;
  Ack Delimiter:应答界定符,1bit,必须为隐性;
  End Of :发送端送出7个隐性电平,标识数据帧结束。
  CAN笔记再再续
  [ 2007-5-10 5:53:00 | By: CANopen ]
  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被检测到,由发送端送出;
  
  √ 帧格式错误( Check Error)
  当一个固定形式的位场含非法位,则检测到一个 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通讯。
  4、CAN2.0B(Active)规范的错误计数器的计数规则:
  1. When a RECEIVER detects an error, the RECEIVE ERROR COUNT will be increased by 1, except when the detected error was a BIT ERROR during the sending of an ACTIVE ERROR FLAG or an OVERLOAD FLAG.
  2. When a RECEIVER detects a ’dominant’ bit as the first bit after sending an ERROR FLAG the RECEIVE ERROR COUNT will be increased by 8.
  3. When a TRANSMITTER sends an ERROR FLAG the TRANSMIT ERROR COUNT is
  increased by 8.
  Exception 1:
  If the TRANSMITTER is ’error passive’ and detects an ACKNOWLEDGEMENT ERROR because of not detecting a ’dominant’ ACK and does not detect a ’dominant’ bit while sending its PASSIVE ERROR FLAG.
  Exception 2:
  If the TRANSMITTER sends an ERROR FLAG because a STUFF ERROR occurred during ARBITRATION, and should have been ’recessive’, and has been sent as ’recessive’ but monitored as ’dominant’.
  In exceptions 1 and 2 the TRANSMIT ERROR COUNT is not changed.
  4. If an TRANSMITTER detects a BIT ERROR while sending an ACTIVE ERROR FLAG or an OVERLOAD FLAG the TRANSMIT ERROR COUNT is increased by 8.
  5. If an RECEIVER detects a BIT ERROR while sending an ACTIVE ERROR FLAG or an OVERLOAD FLAG the RECEIVE ERROR COUNT is increased by 8.
  6. Any node tolerates up to 7 consecutive ’dominant’ bits after sending an ACTIVE ERROR FLAG, PASSIVE ERROR FLAG or OVERLOAD FLAG. After detecting the 14th consecutive ’dominant’ bit (in case of an ACTIVE ERROR FLAG or an OVERLOAD FLAG) or after detecting the 8th consecutive ’dominant’ bit following a PASSIVE ERROR FLAG, and after each sequence of additional eight consecutive ’dominant’ bits every TRANSMITTER increases its TRANSMIT ERROR COUNT by 8 and every RECEIVER increases its RECEIVE ERROR COUNT by 8.
  7. After the successful transmission of a message (getting ACK and no error until END OF is finished) the TRANSMIT ERROR COUNT is decreased by 1 unless it was already 0.
  8. After the successful reception of a message (reception without error up to the ACK SLOT and the successful sending of the ACK bit), the RECEIVE ERROR COUNT is decreased by 1, if it was between 1 and 127. If the RECEIVE ERROR COUNT was 0, it stays 0, and if it was greater than 127, then it will be set to a value between 119 and 127.
  9. A node is ’error passive’ when the TRANSMIT ERROR COUNT equals or exceeds 128, or when the RECEIVE ERROR COUNT equals or exceeds 128. An error condition letting a node become ’error passive’ causes the node to send an ACTIVE ERROR FLAG.
  10. A node is ’bus off’ when the TRANSMIT ERROR COUNT is greater than or equal to 256.
  11. An ’error passive’ node becomes ’error active’ again when both the TRANSMIT ERROR COUNT and the RECEIVE ERROR COUNT are less than or equal to 127.
  12. An node which is ’bus off’ is permitted to become ’error active’ (no longer ’bus off’) with its error counters both set to 0 after 128 occurrances of 11 consecutive ’recessive’ bits have been monitored on the bus.
  Note:
  An error count value greater than about 96 indicates a heavily disturbed bus. It may be of advantage to provide means to test for this condition.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics