CAN通信物理层(采样点、大端小端)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tyhaotingdege/article/details/79787589

        KEL15与KEL30存在电压范围的区别和功能上的区别:KEL30是指提供基本功能的供电电压,功能很少:KEL15是指提供多功能的供电电压。其中KEL15又称:IG ON。

        终端电阻:由于信号传输会产生回波、反射(驻波)等干扰,终端电阻就是抵消干扰。大约120欧( 线束的阻抗是120欧,终端电阻120欧就跟导线一样,这样就没有反射)。

        ECU不等距离分布也是为了减少驻波。(所以说懂硬件才6比,什么是驻波???)。

        数据帧要求为8个字节,这是在CAN网中传输的数据的长度。

        can帧:标准帧、远程帧和数据帧,远程帧没有数据域。标准帧由11位标识符,扩展帧有29位标识符。

        数据帧格式:

typedef struct

{

     uint32_t StdId;  //标准帧ID,如果您要发送扩展帧。可以不管它
     uint32_t ExtId;  //扩展帧ID,如果您要发送标准帧。可以不管它
     uint8_t IDE;     //您是想发送标准帧还是扩展帧?
     uint8_t RTR;     //您是想发送数据帧还是远程帧?
     uint8_t DLC;     // 您想发送数据的长度。
     uint8_t Data[8]; //您想要发送的数据。
} CanTxMsg;

        在CAN网中是如何发送数据给特定标准帧ID和扩展帧ID决定的节点?

        首先知道STM32有14个过滤组,每个过滤组由2个32位可配置寄存器组成。每个节点会配置自己的过滤组,来过滤掉不想接收的标准帧ID和扩展帧ID,过滤方式有两种:

  1. 屏蔽模式:CAN_FxR1和CAN_FxR2两个寄存器最后一个字节的1、2位(0开始)为11:CAN_FxR1用来设置想要的ID;CAN_FxR2用来设置要屏蔽的位。当CAN_FxR2中的某一位为1,表示收到ID与CAN_FxR1对应位要匹配才能防问到该节点,若CAN_FxR2中的某一位为0,表示收到ID与CAN_FxR1对应位不要求一定要匹配也可访问该节点。
  2. 列表模式: CAN_FxR1和CAN_FxR2两个寄存器最后一个字节的1、2位(0开始)为00:CAN_FxR1、CAN_FxR2两个寄存器分别表示两个ID,这样就只有含有这两个ID的数据帧才能访问到该节点。

        CAN控制器

        用于将欲收发的信息转换为符合CAN规范的CAN帧信号,其中转换为CAN帧的步骤是由软件来完成的,之后将信号通过CAN收发器在CAN_bus上传输。

        CAN收发器

        将CAN控制器的逻辑电平转换为CAN总线的差分电平。

        CAN总线上逻辑电平:

        平时总线是隐性(逻辑1)。显性优先级高于隐性。

        逻辑电平0、1不是对地而言的,是由两线上电压差决定的。逻辑0代表显性,逻辑1代表隐性。

        显性(逻辑0)指:CAN_H3.5v/CAN_L1.5v。

        隐性(逻辑1)指:CAN_H2.5v/CAN_L2.5v

        数据帧:由7个内容组成:1.帧开始SOF(低电平)   2.仲裁域   3.控制域   4.数据域   5.CRC域   6.ACK域  7.帧结束。其中仲裁域表示帧优先级,RTR位为隐性电平;控制域(6bit)表示保留位长度和数据长度;ACK域(2bit)表示一帧信号已被正常接受,发送方发送两位低电平 ,接收方若正常接收则以slot位为高电平发送一帧信号;

        错误帧:表示传输错误,由can硬件发送;

        过载帧:由节点发出表示没准备号接受数据;

        遥控帧:接收单元请求发送单元发送信息,它的仲裁域中RTR位为显性电平。

        大小端

        大端(Motorola):高字节或字位放在内存低地址。

        小端(Intel):低字节或字位排放在内存低地址。

        对位上的处理是硬件处理的,而且在ram不分大小端,在flash才有大小端。

        下面是大端和小端跨字节的数据在内存的分布图:

        大端:

               

        小端:

               

        CRC校验:见计算机网络笔记-数据链路层。

        CAN通信传输方式:异步传输。

     

        CSMA/CD:载波监听多点接入/冲突检测,在计算机网络中介绍过这里不重复,只介绍一种冲突的解决方法,解决方法不止一种,这里说can线中“非破坏性仲裁 ”的方法,仲裁机制使用标识符为判断依据,标识符二进制数越小的优先级越高,让后就直接收优先级高的报文数据。但是这里有个疑问待以后解决:信号冲突了信号不就受损了吗?上述解决方法的怎么可行?。

        CAN总线信号同步方式(位外)

        当数据出现多个连续的0或1时,按照波特率每秒钟对信号进行多次采样,可能漏掉或者多几个0或1出来, 使用数据链路层笔记里有讲到曼切斯特编码,可以有效的得到正确使信号,这叫作信号同步。但在CAN传输中由于曼切斯特编码会是传输速率变慢所以就使用了NRZ编码。NRZ编码(不归零码):0表示低电平,1表示低电平。它的缺点就是上述同步问题没法解决,所以我们就想了一个办法:发送时每5位(位数多了就也可能会有上述现象,位数少了和数据碰巧一致的概率会很大)相同电平就插入一位相反电平,接受时就反其道而行之。

        CAN总线信号同步方式(位内)

        首先得了解以下知识:接收端是按照约定波特率每秒钟进行多次的采样,也就是每隔一段时间采样一次将采样的结果作为当时状态。接收时检测每一位的时间是灵活的,在下文中说明。

        位时序:每1秒可以发送多位数据,是由波特率决定的。每一位由多个时间片(time quantum)组成,是由晶振除以波特率决定的。将一位中的时间片分为4个段,顺序是:同步段(SS)、传播延时段(PTS)、相位缓冲段1(PBS1)、相位缓冲段2(PBS2)。1__同步段(1Tq):发送节点和接收节点都是从同步段开始,正常情况下该段一定是上升沿和下降沿所处位置。  2__传播延时段:由于总线协议中的非破坏性仲裁机制以及帧内应答机制的规定,要求网络中的所有节点要同时接收到发送过来的显性位,但是由于每个节点到发送节点的位置不同和接收器、发送器的延时不同,导致不同的节点收到该显性位的延时是不同的,所以需要人为的配置该位。   3__相位缓冲段1、2在后文重同步中说明。

        1Bit接收时间:正常情况(上升沿或下降沿出现在同步段)每一位的接收时间是固定值。也就是一段时间后,接收器就认为这一位接受时间完了,立即开始下一位的接受。

        采样点:检测到上升沿或下降沿之后1Bit接收时间的x%时间的逻辑电平值作为这一位的逻辑电平值。因为每个节点的晶振可能不同,导致时间片的长度不一致,如果约定的采样时间不恰当可能导致采样的结果与实际值不一致,约定的采样点是经过多种实验计算出来的。

        进入正题!!!!!!!!!!!!!!!!!!!!!有两种同步方式:硬件同步重同步

        硬件同步硬同步只在总线空闲时通过一个下降沿(帧起始)来完成,此时不管有没有相位误差,所有节点的位时间重新开始。强迫引起硬同步的跳变沿位于重新开始的位时间的同步段之内。

        重同步:正常情况 ->检测该位的时间开始,上升沿或下降沿正常出现在同步段,不需要重同步处理,采样点正常采样。

        非正常情况1 ->上升或下降沿出现在同步段和采样点之间。若此时上升或下降沿与同步段相差x时间,接收器就会使相位缓冲段1增加同样x时间,这使得接受一位的时间变长了,当然这个增加的x时间是有上限的,这个上限称为重同步跳转宽度SJW

        非正常情况2 ->上升或下降沿出现在采样点之后,接收器就缩短相位缓冲段2到上升沿或下降沿出现的地方,相当于让这一位的接收时间立即结束,认为下一位的接收时间才是才是这个信号接收的正确值,使这个上升或下降位于下一位的同步段。

                              

        CAN矩阵中有很多报文是每一个节点都需接受,这些报文是用来检测通信丢失的。

        TDiaEnable:从 KL15 打开到 DTC 控制器能检测到DTC的时间,该值只能取所有节点中的最大值

        TCanAck从接收到CAN初始化触发事件到节点可以接收报文的时间

        TCanInit从接收到CAN初始化触发事件到发送第一帧报文的时间(此时,CAN硬件、软件初始化完毕,可以发送和接收报文)

        TMsgStart从接收到CAN初始化触发事件到该节点所有的周期性报文至少被发送一次的时间

     

猜你喜欢

转载自blog.csdn.net/tyhaotingdege/article/details/79787589