CANcan总线协议延迟是广播类型的can总线協议延迟这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文但是,CAN硬件能够提供本地过滤功能让每个节点对报文有选择性地做出响应。
can总线协议延迟使用不归零位填充模块以线与逻辑连接到can总线协议延迟:如果只有一个节点向can总线协议延迟传输逻辑0,那么不管有多少个节点向can总线协议延迟传输逻辑1整个can总线协议延迟都处于逻辑0状态。
CAN标准定义四种不同的报文类型报文使用逐位仲裁智能方案来控制对can总线协议延迟的访问,每条报文都带有优先级标记
CAN标准还为错误處理和消除定义了详细的方案,这在第9节“CAN错误处理”(第23页)中有更详细的说明
在本教程第8页讨论位时序和时钟同步。见此页面您鈳以用它来计算CANcan总线协议延迟参数和寄存器设置。
CAN可以使用不同的物理层来实现(第5页)这里阐述其中一些。而且可以使用许多不同種类的连接器。我们还为对报文细节感兴趣的用户提供了许多示波器图片(第6页)
CANcan总线协议延迟是广播类型的can总线协議延迟。这意味着所有节点都可以侦听到所有传输的报文无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文。但是CAN硬件能够提供本地过滤功能让每个节点对报文有选择性地做出响应。
CAN使用短报文 – 最大实用负载是94位报文中没有任何明确的地址;相反,鈳以认为报文是通过内容寻址也就是说,报文的内容隐式地确定其地址
CANcan总线协议延迟上有四种不同的报文类型(或“帧”):
概要:“大家好,这是一些标签为X的数据希望满足您的需要!”
数据帧是最常见的报文类型。由下列主要部分组成(出于简洁性目的忽略了┅些细节):
注1:请注意can总线协议延迟上存在应答位不表示任何目标地址已經收到报文。唯一表示的是can总线协议延迟上的一个或多个节点已经正确收到报文。
注2:仲裁字段中的标识符不一定标识报文的内容尽管其名字会让人如此认为。
概要:“大家好有没有人能够生成标签为X的数据?”
远程帧与数据帧十分相似但是有两个重要的区别:
远程帧的预期目的是征求传输相应的数据帧例如,如果节点A传输一个仲裁字段设置为234的远程帧那么节点B(如果已经正确初始化)可能通过一个仲裁字段也设置为234的数据帧进行响应。
远程帧可以用来实现can总线协议延迟通信管理的请求-响应类型但是,远程帧在实践中很少使用还有一点值得注意的是,CAN标准没有规定这里列出的特性大部分CAN控制器都可鉯进行编程自动响应远程帧或通知本地CPU。
关于远程帧的一个注意事项:数据长度代码必须设置成预期响应报文的长度否则仲裁将不起作鼡。
有时据称响应远程帧的节点会在识别标识符后立即开始传输从而“填充”空的远程帧。但是事实并非如此
远程帧(2.0A类型):
概要:“大家好(大声),让我们重新试一下”
简单地说错误帧是一种违背CAN报文帧规则的特殊报文。一个节点咋在检测到故障时传送错误帧这将导致所有其它节点也检测到故障,它们也将发送错误帧然后传送节点将自动尝试重传报文。有一种精准的错误计数器方案可以確保节点无法通过重复传输错误帧来破坏can总线协议延迟通信。
错误帧包含一个错误标志这个错误标志是6位长的相同值(因此违背位填充規则)和一个错误定界符(8个隐性位)。错误定界符提供一些空间以便can总线协议延迟上其它节点在检测到第一个错误标志时可以发送它們的错误标志。
概要:“我是非常繁忙的小型82526您可以稍等片刻吗?”
这里我们仅仅出于知识完整性目的而提及过载帧。在格式方面過载帧与错误帧非常相似,并且由会变得重荷的节点传送过载帧并不常用,因为当今的CAN控制器会非常智能化地避免使用过载帧事实上,会生成过载帧的唯一一种控制器是现在已经过时的82526
最初,CAN标准把仲裁字段中标识符的长度定义为11位后来,客户的需求推动了该标准嘚延伸新格式通常称为扩展CAN,标识符不允许少于29位为了区分这两种帧类型,在控制字段中使用了一个保留位
如今的新型CAN控制器通常是2.0B类型1.x或2.0A类型的控制器如果接收到29个仲裁位的报文会很麻烦。2.0B被动型控制器容许这些报文如果它们正确的话会进行应答,然后抛弃这些报文2.0B主动型控制器既可传送也可接收这些报文。
实现2.0B和2.0A(和1.x)的控制器相互兼容并且可以在同一can总线协议延迟上使用它们,则只要实现2.0B的控制器鈈发送扩展帧即可!
有时候人们说标准CAN“优于”扩展CAN因为扩展CAN报文会产生更多的间接费用。这种说法未必正确如果您使用仲裁字段来傳送数据,那么扩展CAN实际上的发生的间接费用可能比标准CAN少
术语“基本CAN”和“完整CAN”源自CAN的初创年代。历史上曾经有Intel 82526 CAN控制器它为程序員提供DPRAM型接口。然后出现了Philips 82C200 CAN控制器它使用面向FIFO(队列)的编程模型和有限制的过滤功能。为了区分这两种编程模型人们出于某些原因紦Intel的模型称为“完整CAN”,把Philips的模型称为“基本CAN”如今,大多数CAN控制器同时支持这两种编程模型所以没有理由继续使用术语“基本CAN”和“完整CAN”。事实上这些术语可能会令人迷惑,应当尽量避免
当然,“完整CAN”控制器可以和“基本CAN”进行通信反之也可。不存在任何兼容性问题
报文仲裁(两个或多个CAN控制器协商确定谁使用can总线协议延迟的过程)对于数据传送中真正可用的带宽非常重要。
任何CAN控制器嘟可能在检测到空闲can总线协议延迟时开始传送数据这可能会导致两个或多个控制器(几乎)同时开始传送报文。通过下述方法解决这种沖突传送节点在发送报文时监视can总线协议延迟。如果节点在自身发送隐性位时检测到显性位它将立即退出仲裁过程并转变成接收方。仲裁针对整个仲裁字段进行当该字段已经被发送时,can总线协议延迟上恰好只剩一个传送节点这个节点就像什么都没发生那样继续传送。其它潜在的传送节点将在can总线协议延迟下次空闲时尝试重传它们的报文仲裁过程不会消耗时间。
这种逐位仲裁成功的重要条件是两个節点不会传送相同的仲裁字段这个规则有一个例外:如果报文不包含任何数据,那么任何节点都可传送该报文
因为can总线协议延迟采用線与逻辑,并且显性位是逻辑0所以包含数值最低仲裁字段的报文将赢得仲裁。
问:如果一个节点是can总线协议延迟上的唯一节点并且试图進行传送会发生什么情况?
答:当然节点将赢得仲裁并顺利地进行报文传送。但是当进行应答的时候,没有任何节点将在应答时隙(ACK时隙)发送显性位所以传送节点将检测到ACK错误,发送错误标志将传送错误计数器加8并开始重传。这将发生16次然后传送节点将进入錯误被动状态。通过错误限制算法的特殊规则如果节点为被动错误并且错误是ACK错误,则传送错误计数器不再增加所以节点将一直继续傳送,至少要到有人应答报文
再次提醒,CAN报文中无显式地址每个CAN控制器都会检查can总线协议延迟上的所有通信,并使用硬件过滤器和软件的组合来确定是否对该报文“感兴趣”
事实上,CAN中没有报文地址的概念报文的内容由存在于报文中某处的标识符进行标识。CAN报文被稱为“内容寻址”的报文
常规的报文地址类似于“这是发给节点X的报文”。而内容寻址的报文类似于“这是包含标签为X的数据的报文”这两个概念之间的区别很小但是非常重要。
根据标准仲裁字段的内容用来确定can总线协议延迟上报文的优先级。所有CAN控制器还将在硬件過滤过程中使用整个(一些控制器将只使用一部分)仲裁字段作为主键
标准没有规定仲裁字段必须用作报文标识符。但是不管怎样这昰一种常见情况。
我们说过标识符可以是11位(CAN 2.0A)或29位(CAN 2.0B)。这不完全正确出于与某种老式CAN控制器(猜猜是哪种)兼容的原因,标识符鈈得把7个最高有效位都设置为1所以,对于11位标识符只剩下0到2031,29位标识符可以使用个不同的值
注意,所有其它CAN控制器都接受“非法”標识符所以现代CAN系统标识符2032到2047可以自由使用。
CANcan总线协议延迟使用不归零(NRZ)的位填充有两种不同的信令状态:显性(逻辑0)和隐性(邏辑1)。这些信令状态对应于所在物理层(存在几种不同的物理层)的某种电平模块以线与逻辑连接到can总线协议延迟:哪怕只有一个节點发送逻辑0使得can总线协议延迟处于显性状态,那么不管有多少隐形状态的节点传送则整个can总线协议延迟都处于显性状态。
物理层定义can总線协议延迟上的电平和信令方案、缆线阻抗和类似的方面
规则规定鈈同的物理层不能交互操作某些组合可能在良好的条件下工作,或看上去可以工作例如,在同一条can总线协议延迟上同时使用“高速”囷“低速”收发器有时可以工作。
一种常见的收发器类型是82C250它实现ISO 11898定义的物理层。82C251是一种改进的版本
按照标准,CANcan总线协议延迟的最夶速度是1 Mbps然而,一些CAN控制器能够处理比1Mbps更快的速度可以在特殊应用场合中使用。
单线CAN在标准模式下可高达约50kbps并且如果使用特殊的高速模式,诸如用于ECU编程可以高达约100kbps。
注意一些can总线协议延迟收发器不允许低于特定的比特率。例如使用82C250或82C251时,低于10kbps不会有问题但昰,如果使用TJA1050则不能低于大约50kbps。请查阅数据表
如果速度为1Mbps,可以使用的最大线缆长度大约为40米(130英尺)这是因为仲裁方案要求信号嘚峰值可以到达最远的节点并且在位采样之前再次返回。换言之线缆长度受光速限制。曾有人提出提高光速但是因为这会产生时空交錯而被驳回。
其它的最大线缆长度是(这些是近似值) –
如果使用光耦合器来提供电隔离那么最大can总线协议延迟长度会相应地减小。提礻:使用快速光耦合器并通过设备查看延迟而不是采用指定的最大比特率。
ISO 11898 CANcan总线协议延迟必须进行端接 通过在can总线协议延迟各端点使鼡120欧姆的电阻达到这个要求。端接可以达到两个目的:
鈈管速度快慢ISO 11898 CANcan总线协议延迟始终都必须进行端接。我将重复这一点:不管速度快慢ISO 11898 CANcan总线协议延迟始终都必须进行端接。对于实验性工莋一个端接器可能就已足够。如果没有连接任何端接器但是您的CANcan总线协议延迟仍然能够正常工作,那么您只是比较幸运而已
注意,其它物理层(例如“低速CAN”、单线缆CAN和其它物理层)不一定需要进行端接但是您的常用高速ISO 11898 CANcan总线协议延迟总是需要至少一个端接器。
请參考获取关于CANcan总线协议延迟端接的更多信息
ISO11898规定线缆阻抗标称值为120欧姆,但允许[108-132]欧姆区间的阻抗
现今市场上满足这种要求的线缆并不哆。允许的阻抗区间将来很有可能会扩大
ISO 11898针对屏蔽或非屏蔽的双绞线而定义。单线缆标准SAE J2411的相关工作正在进行之中
对于CANcan总线协议延迟連接器,根本没有任何标准!通常每种高层协议都会定义一种或一些首选的连接器类型。常见的类型包括
这是一幅来自最普通的ISO11898CANcan总线协议延迟的图片以1Mbps速率运行。收发器是82C251也就是说,物理层昰由ISO 11898指定的
测量在CAN_H(CAN高位)和GND(接地)之间进行。注意静态和隐性can总线协议延迟电压在2.5 V左右。传送显性位时电压升高到3.5V左右。
以下昰同一个can总线协议延迟但是测量在CAN_L(CAN低位)和GND(接地)之间进行:
这是另一个以125 kbps比特率发送的报文。报文的(11位)标识符是300(十六进制徝为12c)如果仔细察看,您应该能够识别报文中前面的位
这是一幅更复杂的图片。它显示与上面例子相同的报文仍然是11位标识符300,比特率仍然是125kbps但是CANcan总线协议延迟上没有端接。CAN线缆是短扁平带状线缆
经验提示:始终端接CANcan总线协议延迟!反射不一定有害但是损坏的边缘形状将破坏通信。
这里是同一个CANcan总线协议延迟在另一个时间刻度中的情况:
CANcan总线协议延迟大约2分米(8英寸)长信号的下冲和振铃均可见,但是在这種情况中无关紧要这次,平缓的上升斜率是问题所在
这里是相同的设置,但是这次传送节点和接收节点都是错误主动型:
这里是另一幅图片。在此设置中CANcan总线协议延迟上只有一个节点(正确端接)。该节点试图传送一条报文但是沒有其它节点在侦听。
那么会发生什么情况?
所以上图表示,一条报文被传送然后短暂停顿(时间为错误标志、错误定界符、间歇和挂起传送的总和)。然后报文被不断重传……
推荐使用这种连接器布局是事实上的工业标准。
CAN_Lcan总线协议延迟线路(显性低位) |
CAN_Hcan总线协议延迟线路(显性高位) |
KVASER用户:请注意文档“LAPcan硬件指南”中阐述了如何在KVASER DRVcan驱动器线缆上使用这些引脚,可以该文档
如果如果供电,电压范围应该为+7至+13 V额萣电流为100 mA。模块提供一个公接头内部必须连接引脚3和6。
引脚编号适用于接头侧视图的公接头或焊接侧视图的母接头为了方便记住引脚編号,可留意CAN_LOW的引脚号小而CAN_HIGH的引脚号大。
和都使用这种接头并且这两种协议碰巧兼容。
模块含公接头输入电压为24V+/-1%。
注意:在DeviceNet规范版夲1.x中图9.13中母接头的编号顺序错误。规范2.0及后续版本的编号顺序正确
CANHUG建议用在移动液压应用场合中。
模块端为公接头can总线协议延迟端為母接头。对于输入电压目前没有建议的值。
出于时序目的CANcan总线协议延迟上的每个位都划分成至少4个时间份额。时间份额逻辑上划分荿四个组或段-
以下是CAN数据位的图片:
指定输入频率和can总线协议延迟速度计算所有可能的CANcan总线协议延迟参数集
同步段始终是一个时间份额长用于时钟同步。can总线协议延迟上的数据改变时预计会出现一个位边沿。
传播段用来补偿can总线协议延迟线路中的延迟
如有必要,相位段可以缩短(相位段1)或延长(相位段2)以保持时钟同步。
在相位段1和相位段2之间的边沿上对can总线协议延迟电平进行采样
大部分CAN控制器还提供选项可以在一个位期间进行三次采样。这种情况中在采样点之前的两个时间份额的边沿上进行采样,择多译码(至少82527是这样)
为了调整片上can总线协议延迟时钟,CAN控制器可以将位的长度缩短或延长整数倍个时间份额这些位时间调整的最大值称为同步跳变宽度(SJW)。
硬同步在起始位从隐性到显性转换时产生位时间从该边沿重新开始。
重新同步是在报文的同步段中不发生位边沿时产生一个相位段被缩短或延长,其缩短值或延长值取决于信号中的相位误差可以使用的最大值由同步跳变宽度参数决定。
大部分CAN控制器允许程序员使鼡下列参数设置位时序:
通常为此提供两个寄存器:btr0和btr1但是,不同控制器之间略有差异因此请仔细閱读数据表。
恩智浦(恩飞公司)82c200和SJA1000的寄存器布局如下:
0 |
注意:这些参数的实际值比写入寄存器的值大1
示例:如果提供给SJA1000的振荡器信号是16MHz,我们想要250kbps的比特率采样点接近整个位的62%,以及SJW为2个时间份额那么我们可以设置 –
TSEG1 = 5,指定采样点之前有5个时间份额以及
TSEG2 = 3,指定采样点之后有3个时间份額
错误处理内建在CAN协议中,对CAN系统的运行十分重要错误处理的目标是检测CANcan总线协议延迟上出现的报文中的错误,从而传送器可以重传絀错的报文can总线协议延迟上的每个CAN控制器都会尝试检测报文中的错误。如果发现错误发现节点将传送一个错误标志,从而中断can总线协議延迟通信其它节点将检测错误标志导致的错误(如果它们尚未检测到初始错误)并采取合适的措施(例如丢弃当前报文)。
每个节点維护两个错误计数器:传送错误计数器和接收错误计数器有几个规则规定这些计数器怎样增加和/或减少计数。总的来讲检测到故障的傳送器增加其传送错误计数器比侦听节点增加其接收错误计数器要快。这是因为很有可能是传送器发生了故障!当任何错误计数器增加箌超过某个值时,节点将首先进入“错误被动”也就是说,它在检测到错误时不会积极地阻止can总线协议延迟通信然后“离开can总线协议延迟”,这意味着节点根本不参与can总线协议延迟通信
使用错误计数器,CAN节点不但可以检测故障而且可以执行错误限制。
CAN协议定义了五種以上不同的方法来检测错误其中两种工作在位层次,另外三种工作在报文层次
CANcan总线协议延迟上的每个传送器都会监视(也就是回读)传送的信号电平。如果真正读到的位电平与传送的位电平不同会发出信号指示位错误(仲裁过程中不会发出位错误)。
节点连续发送伍个具有相同电平的位后将在发送出去的位流中加上第六个相反电平的位。接收方将删除这个额外的位这样做是为了避免can总线协议延遲上出现过度的直流电成分,但它同时也给予了接收方检测错误的额外机会:如果can总线协议延迟上出现五个以上相同电平的连续位会发絀信号指示填充错误。
CAN报文的一些部分具有固定的格式也就是说,标准明确定义了何种电平和何时出现这种电平(CRC定界符、ACK定界符、帧結束以及间歇但是间歇还有一些另外的特殊错误检查规则)。如果一个CAN控制器在这些固定字段中的一个中检测到无效值将发出组成错誤。
can总线协议延迟上正确接收报文的所有节点(不管这些节点是否对报文内容“感兴趣”)预期将在报文中所谓的应答时隙中发送一个显性电平这是,发送方将发送一个隐性电平如果发送方无法在应答时隙中检测到显性电平,会发出应答错误的信号
每个报文都包含一個15位的循环冗余校验和(CRC)。节点如果在报文中检测到与自己计算所得不同的CRC将发出CRC错误的信号。
can总线协议延迟上的每个CAN控制器都将在烸个报文中尝试检测以上列出的错误如果发现错误,发现节点将发送一个错误标志从而停止can总线协议延迟通信。其它节点将检测到由錯误标志引发的错误(如果它们尚未检测到原始错误)并采取恰当的措施(也就是丢弃当前报文)
每个节点维护两个错误计数器:传送錯误计数器和接收错误计数器。有几个规则规定这些计数器怎样增加和/或减少计数总的来讲,检测到故障的传送器增加其传送错误计数器比侦听节点增加其接收错误计数器要快这是因为很有可能是传送器发生了故障!
节点开始时处于主动错误模式。当两个错误计数器中嘚任何一个的计数超过127时当两个错误计数器中的任何一个计数超过127时,节点将进入称为被动错误的状态当传送错误计数器达到255以上时,节点将进入can总线协议延迟离线状态
增加和减少错误计数器的规则略显复杂但是原理比较简单:传送错誤的步进为8个错误点数,而接收错误的步进为1个错误点数正确传送和/或接收的报文会减小计数器值。
示例(稍加简化):假设can总线协议延迟上的节点A运气不好不管什么时候A发送报文都发生失败(由于种种原因)。每次失败时它的传送错误计数器增加8并发送主动错误标誌。然后它将尝试重传报文但是一直失败。
当传送错误计数器超过127时(也就是在16次尝试之后)节点A进入被动错误模式。区别在于它現在将在can总线协议延迟上传送被动错误标志。被动错误标志包含6个隐性位不会影响其它的can总线协议延迟通信,所以其它节点不会侦听到囿关can总线协议延迟错误的反馈但是,A继续增加其传送错误计数器当计数值超过255时,节点A最终放弃传送并进入can总线协议延迟离线模式
其它节点怎样响应节点A?对于A传送的每个主动错误标志其它节点将为其接收错误计数器增加1。当A进入can总线协议延迟离线状态时其它节點的接收错误计数器的计数大大低于错误被动的限制值(127)。每次正确收到一条报文这个计数值将减1。但是节点A将停留在can总线协议延遲离线状态。
大部分CAN控制器将为两种状态提供状态位(和相应的中断):
一些控制器(但不是所有)还为被动错误状态提供一个位一些控制器还可以直接访问错误计数器。
CAN控制器在发生錯误时自动重传报文的特性有时候会很烦人市场上至少有一种控制器(飞利浦公司生产的SJA1000)允许对错误处理完全人工控制。
ISO 11898标准列出了CANcan總线协议延迟线缆的几种故障模式:
对于故障1-6和9建议减小S/N比率保持can总线协议延迟继续工作。对于故障8建议保持产生的子系统继续工作。对于故障7可以选择减小S/N比率继续工作。
实践中使用82C250类型收发器的CAN系统无法在发生故障1-7时继续工作,茬发生故障8-9时可能无法继续工作
但是,存在诸如TJA1053等容错能力强的驱动程序可以处理所有故障通常,获得这种容错能力的代价是最大速喥受到限制对于TJA1053,最大速度是125kbps
CAN标准定义的是硬件(物理层 – 有几种)和通信的基本层面(数据链路层)。CAN协议本身只规定如何使用共享的通信介质将小型数据包从A点传输到B点为了管理系统中的通信,需要一种高层协议(HLP)