注:以下大部分内容摘抄B站视频:https://www.bilibili.com/video/BV1gD4y1U7bJ?p=1
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。can的发明最初是为了减少汽车上的线束,随着汽车上通讯节点的增多,使用总线形式的通讯网络可以大大减少各个节点线束的连接,因此,can技术孕育而生。can总线发展经历了can 2.0、can fd、can xl,分别于1991年发布can2.0标准,2015年发布can FD标准,2020年发布can XL标准。
图1.1是早期使用端到端形式连接车上的各个设备,这样需要更多的线束,图1.2是使用can总线的形式连接车上的各个设备,每个设备都可以挂到can总线上,这样使得整个汽车网络特别清晰。
图1.1 早期ecu的连接线束
图1.2 使用can总线连接
can总线是为了解决汽车上各个设备互联问题,汽车上设备节点繁多,有些设备节点比如油门,刹车灯需要实时响应,所以这就要求can总线要具备支持多节点、高可靠、高速度、低延时、低成本要求。由于现在汽车上要求通讯带宽越来越高,通讯速度越来越快,特别是智能电动汽车的发展为can总线提出了更高要求。can特点如下:
1、它的电气特性和rs485一样采用差分信号,差分信号保证了can总线通讯的可靠性和远距离通讯。
2、can总线采用多主通讯模式,每个can节点都能自主收发数据,不像rs485和i2c采用主从模式。
3、can总线采用短报文形式,can2.0数据段最多8字节,can fd 数据段最大64字节。
4、有id仲裁机制,id小的优先级高,保证优先级高的数据实时传输。
5、can的通讯方式是异步半双工,通讯前双方要约定波特率。
6、距离在40m一下通信速度能达到1Mb/s,距离10km速度能达到5kb/s。一般汽车中用到的速度是250kb/s和500kb/s居多
can采用应用层+数据链路层+物理层的模型,如下所示:
应用层是软件实现部分,数据链路层主要是实现can协议部分,具体见第三节。can物理层主要功能是将数据链路层的TTL信号转换为can差分信号。在soc中得can控制器就是工作在can数据链路层,还需要外接一个can收发器,收发器就是工作在can物理层,至于为什么不把can物理层集成到soc中,可能是因为物理层是有模拟电路实现体积较大,不好集成。这个和以太网的数据链路层和物理层相似,具体见链接:https://www.cnblogs.com/YYFaGe/p/16289035.html
can物理层最重要的功能就是TTL信号和差分信号的相互转换,那么TTL信号和差分信号是如何对应的呢?can2.0总线有iso11898和iso11519标准,如果没有特殊说明,一般都是iso11898标准。如下所示,
CAN_H - CAN_L = 2V表示显性,代表逻辑0,CAN_H - CAN_L = 0V表示隐性,代表逻辑1.
为减少信号在can总线上的反射,需要在总线两端各加一个终端电阻,一般是120欧姆。如下所示:
can数据链路层实现了can协议的大部分内容,包过发送竞争机制,校验等。
can 2.0报文分为以下几种:
can报文中用的最多的就是数据帧,数据帧可分为标准数据帧和扩展数据帧。标准帧的帧ID长度道是11位,也就是帧ID的范围是000-7FF。扩展帧内的帧ID长度是29位,也就是帧ID的范围是0000 0000-1FFF FFFF。
can报文数据帧的格式如下所示:
一帧完整的数据帧包含帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束。一帧报文是传输的基本单位,每次都收发一帧完整的帧报文。
1、帧起始:帧起始由一位显性位组成,can总线在空闲的时候为隐形,如果摸个节点要通讯,就把总线拉低成显性,表示通讯的开始,这时总线上的所有节点就开始同步接收。
2、仲裁段:仲裁段可设置id过滤,总裁端各个细分位作用如下所示
RTR:远程帧标志位,显性(0)代表数据帧,隐性(1)代表远程帧
SRR:替代远程帧标志位,与RTR功能一致
IDE:扩展帧标志位,显性(0)代表标准帧,隐性(1)代表扩展帧
3、控制段:控制段中主要是说明数据段的数据长度,数据段数据长度可以是1~8个字节。
4、数据段:can总线的数据段可以是1~8个字节
5、CRC校验段:CRC段有16bit组成,1~15bit存放从起始到数据段的校验值,第16bit是CRC界定符。如下所示:
6、ACK段:ACK段有两个bit组成,第一个bit是应答结果,第二个bit是ACK的界定符。对于发送节点ACK端段发送隐性电平,接受节点则发送线性电平作为应答。
7、帧结束:帧结束有连续7bit隐性位组成
远程帧用于请求对方数据,因此,远程帧只是一个请求,并没有数据内容。远程帧的格式如下所示:
can fd物理层与can 2.0基本一致
can fd没有了远程帧,其它与can 2.0一致。
canfd 设计上完全兼容can 2.0,can fd的帧格式和can 2.0一样分为帧起始、仲裁段、控制段、CRC段、ACK段、帧结束。
1、帧起始:与can 2.0一致,由一位显性位组成
2、仲裁段:can fd 的仲裁段与can 2.0一致
RRS:远程帧标志位,与can 2.0的RTR一致,,显性(0)代表数据帧,隐性(1)代表远程帧
SRR:替代远程帧标志位,与RRS功能一致
IDE:扩展帧标志位,显性(0)代表标准帧,隐性(1)代表扩展帧
3、控制段:
FDF:区分can 2.0还是can fd,隐性位can fd,显性位can 2.0。
res:保留位
BRS:是否为可变波特率,隐性表示为可变波特率
ESI:错误指示标志位,隐性表示节点处于错误状态
DLC:数据长度
4、数据段:
can fd的数据段将can 2.0的8字节扩展到64字节
5、校验段
6、ACK应答段:应答段与can 2.0有些不一致,两位都为显示也表示接收到正常数据
7、帧结束:帧结束有连续7bit隐性位组成,与can 2.0一致
can总线上 的节点都是自由发送数据的,各个节点是何时才能发送数据能?各个节点只有在总线空闲的时候才能发送数据。上面的can报文结构中可以看到,每帧can报文都有连续7bit隐性位组成的帧结束段。帧结束段后还有3bit的隐性位组成帧间隔,ACK段中又有1bit的隐性位,所以一帧can报文结束后总共有11bit隐性位。如下所示:
当can节点检测到连续11bit的隐性位后就代表总线空闲,可以发送报文。如果数据段中也有连续11bit的隐性位岂不是会发生误判?在2.3节中,can协议有填充位的规定,所以can报文中不会出现连续5个以上相同的电平。
can总线上的所有节点都能自由的向can总线发送数据,这样就存在发送数据竞争问题,有竞争就会有仲裁。can总线是非破坏性的仲裁机制,不会对数据造成破坏。can总线的仲裁发生在can数据帧的仲裁段,采用“线与”机制,id越小的can报文优先级越高。can节点在发送数据同时会监听总线上的数据,如果总线上的数据与自己发送的不一致就退出竞争。例如A、B两个节点同时向总线发送数据,根据线与机制,如果A和B同时发送1则实际发送1、若有一个发送0,则实际发送0。假设A节点发送数据的id为0010 0011(b),B节点发送数据的ID为0011 0101(b),can总线发送的bit顺序是MSB,也就是由左往右发送。前三个bit 两个节点都一样都是 0 0 1,因此根据线与机制,总线上实际电平也是0 0 1,发送到第四个bit时,A发送的是,0而B发送的是1,根据线与机制,实际发送的是0,节点在发送数据同时也会将总线上的数据取回来跟自己发送的进行对比,这时A发现自己发送的和总线上的一样,都是0,而B节点则发现自己发送的跟总线上的不一样,则B就认为自己总线竞争失败,转换为接收模式。从这里也可以看出,为什么id小的节点优先级高。
为减少波特率误差带来的通讯错误,can协议规定,在信号的跳变沿时刻进行同步,保证波特率的准确性。如果数据出现连续的隐性位或者显性位,那么不就无法同步了么?为解决这个问题,can协议规定当出现连续5个相同电平时就插入一个相反电平的填充位。比如出现了连续5个显性电平,就在5个显性电平后面插入一个隐性电平。接收端也按照这个规则过滤出去填充位。
例如波特率为500kbps,那么1bit电平的持续时间为2us。在这持续2us电平中何时采样呢?是t1时刻还是t2时刻?这就涉及采样点的问题。can协议中,将1bit的电平分为四段:
同步段(sync_seg )
传播时间段(prop_seg )
相位缓冲段1(phase_Seg1 )
相位缓冲段2(phase_Seg2)
以上将1bit电平时间分为10等分,1等分称为1个Time Quantum(Tq).为方便编程,很多厂家将prop_seg和Phase_Seg1合在一起为TSEG1,phase_Seg2称为TSEG2.如下所示:
sync_seg通常是固定的1Tq,在配置can控制器时就是通过设置TSEG1和TSEG2的值来设置波特率,位时间=(1+TSEG1+TSEG2)*Tq。波特率=1/位时间。设置TSEG1和TSEG2时需要遵循一定的规则:
1、TSEG1>TSEG2
2、TSEG2>SJW(同步跳转宽度)
3、一般采样点设置在85%位置左右。
采样点和波特率可以通过一些公式计算:
采样点=(1+TSEG1)/(1+TSEG1+TSEG2)
can波特率 = (can时钟频率)/(1+TSEG1+TSEG2)
例如:can时钟频率为8MHZ,要将波特率设置为500kbps,可以设置TSEG1=12,TSEG2=3.带入公式
采样点=(1+12)(1+12+3) = 81%
波特率 = (8*1000)/(1+12+3) = 500kbps
采样点可以参考链接:http://www.eepw.com.cn/article/202004/411611.htm
can报文的字节顺序格式分为Intel格式和Motolola格式。例如A向B发送0x12A0,对于Inter格式来说先发送0xA0再发送0x12。对于Motolola格式则先发送0x12,再发送0xA0.Inter模式相当于小端模式,Motolola模式相当于大端模式。
1、波特率不匹配
2、终端电阻没接或不匹配
3、can协议不一致,一个是can 2.0 另一个是can fd
1、can fd的数据长度有can 2.0的8字节扩展到64字节
2、can fd的通讯速度支持可变方式,分为标称比特率(Nominal Bit Rate)和数据比特率(Data Bit Rate),标称比特率也叫仲裁比特率,是在仲裁段使用的比特率,最高和can 2.0一样也是1Mbps,而数据比特率最高可以提高到5Mbps。
联系客服