CAN总线协议层
目录
一、CAN总线的4种帧类型
在CAN总线系统中,帧是数据传输的基本单位。帧类型决定了数据在总线上的传输方式和用途。以下是CAN总线的几种主要帧类型及其简要描述:
1、数据帧(Data Frame)
数据帧是CAN总线中最常用的帧类型(有标准格式11位ID和扩展格式29位ID),用于在节点之间传输数据。数据帧由七部分组成:帧起始、仲裁场、控制场、数据场、CRC场、应答场和帧结束。标准格式数据帧可以携带最多8个字节的数据,而扩展格式数据帧可以携带最多64个字节的数据,从发送器传输到接收器。
2、远程帧(Remote Frame)
远程帧用于请求发送具有特定标识符的数据帧(有标准格式11位ID和扩展格式29位ID)。当一个节点需要接收另一个节点的数据时,它会发送一个远程帧。远程帧的结构与数据帧相似,但没有数据场,仅用于请求数据。
3、错误帧(Error Frame)
错误帧用于在检测到总线错误时通知其他节点。任何节点检测到错误(如位错误、形式错误或应答错误)时,都会发送错误帧。错误帧由两个不同的位组成:错误标志和错误界定符。
4、过载帧(Overload Frame)
过载帧用于在连续的数据帧或远程帧之间提供附加的延时,以防止总线过载。当一个节点无法及时处理接收到的数据时,它会发送过载帧,以请求发送方减缓发送速率。
二、数据帧
CAN结构帧由多个关键部分组成,每个部分都承载着特定的功能。以下是对这些部分的详细解析:
1、帧起始
CAN帧的起始部分由一个特殊的位序列标识,称为帧起始(Frame Start)。它由一个显性位(低电平)组成,用于同步接收节点并标识一个新的帧的开始。
2、仲裁段
CAN仲裁段的作用是确定发送的帧类型(数据帧或遥控帧)以及发送的帧格式(标准帧或扩展帧)
(1)标准CAN
它包含标识符(Identifier,简称ID)和远程传输请求位(Remote Transmission Request,简称RTR)。
标识符(ID):标识符用于区分不同的帧和确定它们在总线上的优先级。标准CAN帧使用11位标识符,标识符越小,帧的优先级越高。
远程传输请求位(RTR):远程传输请求位是一个单一位,用于标识帧的类型。如果RTR位为显性(低电平),则帧为数据帧;如果为隐性(高电平),则帧为远程帧。
(2)扩展CAN
它包含了“11位基本ID + 1位SRR + 1位IDE + 18位扩展ID + 1位RTR”。这意味着除了标准帧中的11位ID,扩展帧还增加了一个18位的扩展ID,用于在总线上唯一标识每个节点和它们发送的数据。
IDE位是标识符扩展位,它的作用是指示接下来的标识符是标准的11位还是扩展的29位。如果IDE位为0,那么接下来的标识符就是标准的11位ID;如果IDE位为1,那么接下来的标识符就是29位的,其中前11位为基本ID,后18位为扩展ID。
SRR位是替代远程请求位,它在远程帧中有特殊的作用。当SRR位为1时,它表示这是一个远程请求,用于请求发送方发送一个扩展标识符的数据帧。这允许网络中的节点相互请求和发送数据,实现数据的有效交换。
RTR位是远程发送请求位,它用于区分数据帧和远程帧。当RTR位为0时,表示这是一个数据帧,即包含了实际的数据信息;当RTR位为1时,表示这是一个远程帧,即请求发送方发送数据。
3、控制段
(1)标准CAN
控制段包含数据长度代码(Data Length Code,简称DLC)和保留位。
数据长度代码(DLC):数据长度代码用于指示数据段中的数据字节数。DLC字段的长度为4位,可以表示从0到8字节的数据长度。
保留位:保留位通常用于将来的扩展,目前在标准CAN中未使用,必须设置为隐性位。
(2)扩展CAN
扩展CAN控制段在没有IDE(标识符扩展位)的情况下,仍然由6个位组成,主要用于表示数据段的字节数以及保留位。具体描述如下:
r0、r1:保留位。这两个位通常以显性电平发送,但接收时可以是隐性电平。在扩展帧中,它们位于控制段的前两位。
DLC(数据长度码):由4个数据位组成,用于表示本报文中的数据段含有多少个字节。DLC的取值范围是0~8,表示数据段可以包含0到8个字节的数据。尽管数据的字节数必须为0~8字节,但接收方对DLC=9~15的情况并不视为错误。
4、数据段
(1)标准CAN
数据段包含实际传输的数据。数据段的长度由DLC字段确定,可以是0到8字节。数据以字节为单位传输,每个字节由8个位组成。数据段的内容根据具体的应用场景和通信协议而定。
(2)扩展CAN
扩展CAN的数据场是CAN通信协议中用于传输实际数据的主要部分。与标准CAN帧相比,扩展CAN帧的数据场长度更长,最大可以达到8字节(64位)。这意味着它可以传输更多的数据,适用于需要更大数据传输量的应用场景。在扩展CAN帧中,数据场的内容由发送方根据具体的应用协议和需要传输的数据类型来填充。接收方在接收到扩展CAN帧后,会根据相应的应用协议解析数据场的内容,以获取所需的数据信息。
5、CRC校验段
CRC校验段用于校验数据的正确性。它包含15位的循环冗余校验码(Cyclic Redundancy Check,简称CRC)和1位的CRC界定符。CRC校验码通过对数据段和CRC界定符进行特定的多项式运算得到,接收节点通过计算接收到的数据的CRC并与发送的CRC进行比较,以检测数据在传输过程中是否发生错误。
6、应答段
应答段用于接收节点向发送节点发送应答信号,以表明已成功接收到帧。应答段包含应答间隙(Acknowledgment Gap)和应答界定符(Acknowledgment Delimiter)。发送节点在发送完数据段后等待一段时间(应答间隙),如果接收节点正确接收到帧并准备发送应答信号,则会在应答间隙期间发送一个显性位的应答信号。发送节点通过检测应答信号的存在与否来判断帧是否被成功接收。
7、帧结束
帧结束标志着CAN帧的结束。它由7个连续的隐性位组成,用于界定一个数据帧或远程帧的结束。接收节点通过检测连续的隐性位来判断帧的结束,并开始准备接收下一个帧。
8、帧间隔(Time Quantum)
帧间隔是用来隔离数据帧(或者遥控帧)的,也就是说,数据帧(或者遥控帧)通过插入帧间隔可以将本帧与先行帧(数据帧、遥控帧、错误帧、过载帧)分隔开来。
三、远程帧
远程帧与数据帧的主要差异:
用途:
数据帧:用于在CAN网络上传输实际的数据。
远程帧:用于请求数据,不直接传输数据,而是触发具有匹配ID的节点发送数据帧。
RTR位:
数据帧:RTR位设置为0,表示该帧包含实际数据。
远程帧:RTR位设置为1,表示该帧是远程帧,用于请求数据。
组成结构:
数据帧:包含帧起始、仲裁场、控制场、数据场(包含实际数据)、CRC场、应答场和帧结束。
远程帧:包含帧起始、仲裁场、控制场、CRC场、应答场和帧结束,但没有数据场。
数据传输与请求:
数据帧:传输实际数据。
远程帧:触发具有匹配ID的节点发送相应的数据帧。
网络效率:
数据帧:直接传输数据,适用于数据通信。
远程帧:减少不必要的通信,仅在需要数据时发送请求,提高网络效率。
综上所述,远程帧和数据帧在CAN通信中各自扮演着不同的角色,通过合理使用,它们能够实现高效、可靠的数据传输和请求响应机制。
四、错误帧
在总线通信中,节点在发送和接收报文时若检测到错误,会主动发送错误帧以通知其他节点。错误帧的发送是一种重要的错误检测和纠正机制,旨在确保通信的准确性和可靠性。一旦检测到错误,节点会立即生成并发送错误帧,其中包含错误标志和错误界定符,以便其他节点识别并采取相应的处理措施。这种机制有助于总线上的节点协同工作,共同维护通信的稳定性和数据的完整性。
主动错误标志:6个连续的显性位;
被动错误标志:6个连续的隐性位;
错误界定符:8个连续的隐性位。
在CAN总线通信中,错误帧中的错误标志之后可能跟随0到6位的错误标志重叠部分。这是因为发送错误帧的节点在发送完错误标志后,可能再次检测到错误,从而继续发送额外的隐性位。这部分重叠确保了错误帧的准确传输。
1、位填充原则
在了解CAN总线中的错误检测之前,首先需要了解什么是位填充。CAN协议中规定,当相同极性的电平持续五位时,则添加一个极性相反的位。
对于发送节点而言:
在发送数据帧和遥控帧时,对于SOF~CRC(除去CRC界定符) 之间的位流,相同极性的电平如果持续5位,那么在下一个位插入一个与之前5位反型的电平。
对于接收节点而言:
在接收数据帧和遥控帧时,对于SOF~CRC(除去CRC界定符)之间的位流,相同极性的电平如果持续5位,那么需要删除下一位再接收。
2、CAN总线的5种错误类型
位错误
在CAN总线通信中,节点在发送数据时,会将自己发送到总线上的电平与同时从总线上回读到的电平进行比较。这是一个自我检测机制,用于验证数据的准确性和一致性。如果节点发现发送的电平与回读的电平不一致,它会立即识别出一个位错误。这种位错误检测机制对于确保通信的可靠性和数据的完整性至关重要。当节点检测到位错误时,它会采取相应的措施,如发送错误帧,以通知其他节点并共同处理这个错误。
需要注意有三种情况情况不属于位错误:
在CAN总线的仲裁区,如果节点发送隐性位但回读到显性位,这并不被视为位错误。这种情况表示该节点在ID仲裁中失败,因为总线上有更高优先级的节点发送了显性位。这是正常的仲裁机制,用于决定哪个节点可以优先发送数据,不算是真正的错误。
在CAN总线的ACK槽阶段,如果节点发送隐性位但回读到显性位,这通常表示至少有一个其他节点正确接收了当前发送的报文。这种情况在总线上只有一个节点时尤为常见,因为没有其他节点返回ACK。由于没有其他节点,这种情况不会对总线上的通信造成影响,因此通常不会被视为位错误。这种机制确保了CAN总线通信的可靠性和稳定性。
在CAN总线通信中,当一个节点发送被动错误标志,即连续六个隐性位时,如果回读到的是显性位,这通常不会被认为是位错误。这是因为被动错误标志由六个连续的隐性位组成,根据CAN总线的线与机制,这些隐性位可能会被其他节点发送的显性电平所覆盖。这种情况下,发送被动错误标志的节点(如Node_A)不会因此而被判定为发生位错误。需要注意的是,被动错误的优先级低于主动错误,因此在处理错误时,主动错误会优先被考虑。这种机制有助于确保CAN总线通信的稳定性和可靠性。
ACK错误
在CAN协议中,报文发送后,接收节点若成功接收,需在ACK槽发送显性位应答。若发送节点在ACK槽未回读到显性位,则视为ACK应答错误,表明报文未被任何节点成功接收。这一机制确保了通信的可靠性,因为发送节点能及时发现并处理接收失败的情况。若发生ACK应答错误,发送节点通常会采取重传措施或进行错误计数,以维护通信的稳定性和数据的准确性。
填充错误
CAN协议中的位填充原则是为了确保通信的稳定性和准确性。当在数据帧或遥控帧的起始位(SOF)到循环冗余校验(CRC)序列之间检测到连续五个相同电平时,CAN协议要求插入一个翻转电压,即一个与前面五个位相反的位,这被称为位填充。这样做的目的是为了防止时钟同步错误。如果在执行位填充原则的过程中检测到连续六个相同位,则视为填充错误,表明传输过程中可能出现了问题。
CRC错误
发送节点在发送数据帧或遥控帧时,会计算CRC序列以确保数据的完整性。接收节点接收报文时,也会执行相同的CRC算法。若计算出的CRC值与发送的CRC值不匹配,接收节点将检测到CRC错误,表明数据在传输过程中可能发生了错误或篡改
格式错误
在CAN协议中,发送报文时,如果在预定的字段区域检测到了非法值,就会触发格式错误。这意味着数据帧或遥控帧的格式不符合协议规定的标准。格式错误的检测有助于确保通信的规范性和准确性,避免因数据格式不正确而导致的通信故障。
CAN报文中,预定值区域包括数据帧/遥控帧的CRC界定符、ACK界定符、EOF,以及错误帧的界定符和过载帧的界定符。
3、节点错误状态
CAN协议中,每个节点内设有发送错误计数器(TEC)和接收错误计数器(REC)。节点的错误状态转换依赖于这两个计数器的值。当错误发生时,相应计数器会递增;若节点表现正常,计数器则递减。通过监控计数器的状态,可以判断节点的错误类型并采取相应的错误处理措施。
根据CAN协议的规定,在CAN节点内,有两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)。这两个计数器计得不是收发报文的数量,也不是收发错误帧的数量。TEC和RCE计数值的变化,是根据下表的规定来进行的。
主动错误状态
在CAN通信中,当发送错误计数器(TEC)和接收错误计数器(REC)的值都小于127时,节点处于主动错误状态。在此状态下,如果节点检测到任何错误,它会主动发送一个带有主动错误标志的错误帧。这个主动错误标志由连续六个显性位组成,它在总线上的发送会“覆盖”掉其他节点的通信,从而中断当前正在CAN总线上传输的报文。
当发送节点检测到自己的发送错误时,它会发送主动错误帧来中断自己刚刚发送的报文,以表明这一帧是错误的,接收节点不应将其视为有效数据。而如果是接收节点发现了错误,无论其他节点是否也检测到了这个错误,它都会主动发送错误帧,以通知所有节点这一帧报文存在问题,并中断其传输。这样,所有节点都会知道刚才接收到的报文可能不正确,需要重新发送或进行其他错误处理措施。这种机制确保了CAN总线通信的可靠性和准确性。
被动错误状态
在CAN通信中,当一个节点的发送错误计数器(TEC)或接收错误计数器(REC)的值超过127时,该节点将进入被动错误状态。这意味着该节点在发送错误帧时,会采用被动错误标志,即由连续六个隐性位组成。与主动错误标志不同,被动错误标志不会中断总线上的报文传输。
当节点Node_A处于被动错误状态时,它发送的带有被动错误标志的错误帧不会对其他节点正在发送或接收的报文产生影响。其他节点会继续按照它们的计划进行通信,而Node_A发送的错误帧则被视为一种通知,告诉其他节点它当前处于错误状态。
如果Node_A是在发送报文的过程中进入被动错误状态并发送了错误帧,那么它刚刚正在发送的报文将被视为无效。此时,Node_A不能立即重新发送这个报文。它必须首先发送一个帧间隔,并随后是一个由8位隐性位组成的“延迟传送”段。这样,总线上就会呈现出连续11位隐性位,其他节点可以通过检测这些隐性位来判断总线当前处于空闲状态。
在这种机制下,其他处于主动错误状态的节点将有更高的优先级来使用总线。当总线处于空闲状态时,这些节点可以参与总线竞争,尝试发送自己的报文。如果Node_A能够在竞争中获胜,它就可以继续发送数据;如果未能成功,则需要等待下一次竞争机会。
总关闭状态
当一个节点进入被动错误状态并持续发送被动错误帧,如果发送错误计数器(TEC)的值超过255,该节点将进入总线关闭状态。在总线关闭状态下,节点Node_A既不能发送报文也不能接收报文,它实际上被从总线上隔离了。为了重新获得与总线的连接,节点需要检测到128次连续的11个隐性位。这可以被理解为一种“冷静期”,让节点有时间重置其内部状态并准备重新接入总线。
由于处于总线关闭状态的节点不再与总线交互,它需要通过内部计时器来计算是否已经经过了相当于传送128次11个连续隐性位所需的时间。一旦达到这个时间,节点会将发送错误计数器(TEC)和接收错误计数器(REC)重置为0,从而重新回到主动错误状态。这样,节点就有机会再次尝试与总线通信,但在重新接入之前,它必须确保自己的行为符合CAN协议的规范,以避免再次进入错误状态。
4、错误帧发送流程
当CAN总线上的节点处于主动错误状态时,以下是发生错误检测和处理的详细流程:
位错误检测:发送节点Node_A发送一个显性位,但是它在总线上检测到的是一个隐性位。这种情况下,Node_A会立即检测到一个位错误。
发送主动错误帧:一旦Node_A检测到位错误,它会立即开始发送主动错误帧。这个错误帧由两部分组成:首先是6个连续显性位的主动错误标志,紧接着是8个连续隐性位的错误界定符。
总线电平变化:当Node_A发送主动错误标志时,总线上会呈现出6个连续的显性电平。这是因为所有节点都会识别到这些显性位,并相应地调整自己的输出以匹配总线电平。
其他节点检测填充错误:对于接收节点Node_B和Node_C来说,它们从总线上接收到连续的6个显性位时,会检测到一个填充错误。这是因为它们期望在这些位位置上接收到与Node_A发送的原始报文相匹配的位。由于检测到了错误,Node_B和Node_C也会发送主动错误帧。
总线电平再次变化:随着Node_B和Node_C发送各自的主动错误标志,总线上会再次出现6个连续的显性电平。随后,这些节点发送的错误界定符会导致总线上出现8个连续的隐性电平。
重新发送报文:在发送完错误帧之后,发送节点Node_A会在一个帧间隔之后重新尝试发送刚刚出错的报文。这是为了确保数据能够可靠地传输到总线上的其他节点。
五、过载帧
过载帧由过载标志和过载界定符组成,分别由连续6个显性位和连续8个隐性位构成。当节点检测到接收过载时,会发送过载帧以通知发送节点。过载帧也可能出现重叠,原因与错误帧重叠相似,都是因为多个节点几乎同时发送信息造成的。
在CAN总线通信中,过载帧的发送是由三种情况触发的:
1、接收节点因内部处理延迟或资源占用等原因,无法立即接收下一个数据帧或遥控帧,需发送过载帧以通知发送节点。
2、当接收节点Node_A在帧间隔的间歇段检测到非预期的显性位(正常情况下应为隐性位)时,表明有报文不恰当地发送到了Node_A。由于此时不应有报文发送,Node_A会发送过载帧,以通知其他节点当前通信状态,并协调总线上的数据传输。
3、当CAN节点在错误界定符或过载界定符的最后一位接收到显性位0时,它会判断这是一个异常情况,因为按照CAN协议,这个位置应该是一个隐性位。由于这个错误并非由于发送节点造成,错误计数器不会增加。接收节点Node_A会发送过载帧来响应,以通知其他节点当前的通信状态。
六、帧间隔
帧间隔有两种不同的形式:主动错误状态的帧间隔和被动错误状态的帧间隔。
间隔段:帧间隔的间隔段由连续三个隐性位组成,期间所有节点不得发送数据或遥控帧。若在间隔段检测到显性位,意味着有节点违规发送了数据,此时接收节点会立即发送过载帧,以维护总线通信的秩序。
空闲段:CAN总线在空闲状态下,隐性位的数量可以是0个或多个,持续时间不定。只要总线处于空闲状态,任何节点都有机会竞争总线使用权。这种灵活的机制确保了CAN网络中的节点可以高效、实时地传输数据。
暂停段:只有进入被动错误状态的节点,在发送帧间隔时,会额外在间隔段中插入8个连续的隐性位作为暂停段。这是为了降低这些节点的发送优先级,避免它们在总线上频繁发送数据,从而给其他节点留出更多的通信机会。
主动错误状态的帧间隔
被动错误状态的帧间隔