电气特性
- 高速CAN:电压差为0V时表示逻辑1(隐性电平),电压差为2V时表示逻辑0(显性电平),速率:125Kbps~1Mbps。
- 低速CAN:电压差为-1.5V时表示逻辑1(隐性电平),电压差为3V时表示逻辑0(显性电平) 速率:10~125Kbps。
高速CAN传输速度快,但是传输距离只有几十米、低速CAN传输距离远,可达1000多米。
帧格式
- 数据帧:
CAN数据帧的Data段是高位先行的,即先发送数据的高位。
标准格式:
空闲状态时,总线逻辑电平为1,当要发送数据时,先是发送SOF(低电平0)帧起始位,仲裁段为11位ID+1位RTR,描述了帧ID,后续1位RTR(远程请求标志位),0表示数据帧,1表示遥控帧;下面是控制段五位,其中IDE为ID扩展标志位,用于区分标准格式还是扩展格式,0表示标准格式,1表示扩展格式。r0必须是显性电平0,是保留位,后面是DLC(4位),表示数据段Data长度的字节数,所以后面的数据段长度是0~64位可变。后面是CRC段,使用CRC进行校验。后面是ACK段,其中ACK槽占1位,目的是当发送方发送完数据后,释放掉总线,使得总线变成默认的高电平1,如果接收方成功接收到数据,接收方会主动将总线变为低电平0,这是发送方读取总线发现总线已被拉低,表明发送已被接收。随后是一个固定为1的ACK界定符,最后是长度7位的EOF帧结束(注意,这里的7位1不是由发送方发送的,而是发送方和接收方均释放了总线的控制权,由默认高电平1保持7位时间长度)。
扩展格式:
首先第一位还是低电平0的SOF(注意图中中间的区域连接线),随后是高11位的ID,随后的SRR是为了兼容标准格式并且固定为1方便与标准格式中RTR进行仲裁时,让出总线,再后面IDE用于区分标准格式还是扩展格式,为1表示扩展格式,随后是低18位的ID,再后面跟一位RTR,0表示数据帧,1表示遥控帧。在后面r1和r0保留位,随后4位DLC表示数据段的长度字节数,在后面就是可变的Data段,然后CRC段,CRC界定符、ACK槽、ACK界定符、EOF。
- 遥控帧
遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同。
错误帧
过载帧
帧间隔
位填充
位同步
保证每次跳变都在ss同步段上,即可保证每一位的采样点(PBS1和PBS2之间)是准确的。
位填充的目的就是确保不会长时间不出现跳变沿,而跳变沿可以用来再同步。根据ss段比跳变早还是比跳变迟而决定是加长PBS1段还是缩短PBS2段。
仲裁
-
先占先得
为何是11个隐性电平(逻辑1)?因为数据帧和遥控帧的ACK界定符固定为1,后面是7个EOF固定为1,再加上一个3位的帧间隔固定为1,一共11位。 -
非破坏性仲裁
主要依靠线与特性,id小的首先到达0位置,而其他设备由于发送的帧id较大,此时还是发送1,因为0与其他设备发送的1线与得到0,所以总线电平还是表示0,当发送较大id的帧的设备回读总线时,会发现读到的不是发出的1,说明有其他设备正在发送id较小的帧,本设备让出总线,转为接收状态。注意id是帧id,而不是设备id。
数据帧和遥控帧之间可以id一样,但是各自内部不允许id重复。
扩展格式中SRR固定为1就是此目的,为何和标准格式中RTR为0时进行仲裁,让出总线。
同样还有标准遥控帧和扩展数据帧之间的仲裁,当高11位ID完全相同时,标准遥控帧的RTR是1,扩展数据帧的SRR也为1,两者取法区分,但是各自下一位都是IDE就会有所不同,标准遥控帧的IDE是0,扩展数据帧的IDE是1,所以还是标准遥控帧优先获得总线。
错误处理
当有设备检测到总线上的数据存在以上错误时,会发送错误帧破坏当前总线上的帧传输。
处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它检测到,正因为如此,整个总线才允许它破坏正在发送中的报文。
处于被动错误状态,说明这个节点目前是不可靠的,出现错误的原因可能是它本身的问题,即刚刚检测到的错误可能只有它自己检测到,正因为如此,整个总线不会信任它的报告,从而只允许它发送6个连续的隐性位,这样才不会拖累其他节点。
处于总线关闭状态的节点不允许发送和接收任何形式的帧报文。且只能通过用户请求或者128个11位连续的隐性位(1)进行恢复。
字节序和位序
字节序(Byte Order)在数据传输中的应用
数据在发送过程中,字节序决定了多字节数据(如整数、浮点数等)如何按照字节顺序传输。常见的字节序有:
大端字节序(Big Endian):高字节首先发送。
小端字节序(Little Endian):低字节首先发送。
在某些通信协议(如网络协议)中,字节序是有规定的,通常会采用一种标准的字节序,以保证不同系统之间能够正确理解数据。最常见的标准字节序是 网络字节序,它使用的是 大端字节序。
位序(Bit Order)在数据传输中的应用
位序是指在每个字节内,数据的各个位是如何顺序传输的。位序影响的是字节内部位的顺序,而字节序影响的是字节之间的顺序。
在数据传输时,位序有两种常见的方式:**摩托罗拉位序(Motorola Bit Order)**和 Intel位序(Intel Bit Order)。
摩托罗拉位序(Motorola Bit Order):
这种位序方式是 大端位序(MSB First),即一个字节的最高有效位(MSB)首先传输。
在摩托罗拉位序中,字节内的位是从左到右按顺序传输的。
例如,字节 0xF0(二进制为 11110000)在摩托罗拉位序中会被传输为:
1 1 1 1 0 0 0 0
Intel位序(Intel Bit Order):
这种位序方式是 小端位序(LSB First),即一个字节的最低有效位(LSB)首先传输。
在Intel位序中,字节内的位是从右到左按顺序传输的。
例如,字节 0xF0(二进制为 11110000)在Intel位序中会被传输为:
1 1 1 1 0 0 0 0 → 0 0 0 0 1 1 1 1(反转)