CAN通信详解

CAN通信详解

概念

  • KEL15与KEL30:KEL30是指提供基本功能的供电电压,此供电模式下功能很少:KEL15是指提供多功能的供电电压。其中KEL15又称:IG ON。
  • 终端电阻:由于信号传输会产生回波、反射(驻波)等干扰,终端电阻目的是为了抵消干扰。大约120欧( 线束的阻抗是120欧)。
  • ECU不等距离分布是为了减少驻波。(什么是驻波...)。
  • CAN矩阵中有很多报文是每一个节点都需接受,这些报文是用来检测通信丢失的。
  • 数据帧:要求为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;
  • 如何发送数据给某标准帧ID或扩展帧ID?

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

        屏蔽模式:CAN_FxR1和CAN_FxR2两个寄存器最后一个字节的1、2位(0开始)为11:CAN_FxR1用来设置匹配位,CAN_FxR2用来设置屏蔽位。举例:当CAN_FxR2第二位为1,表示收到ID与CAN_FxR1第二位匹配才有权防问该节点;当CAN_FxR2中的第三位为0,表示收到ID与CAN_FxR1第三位不匹配也可访问该节点。这里节点表示某设备。

        列表模式: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线中“非破坏性仲裁 ”的方法,仲裁机制使用标识符为判断依据,标识符二进制数越小的优先级越高,让后就直接收优先级高的报文数据。但是这里有个疑问待以后解决:信号冲突了信号不就受损了吗?上述解决方法的怎么可行?。

  • 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到上升沿或下降沿出现的地方,相当于让这一位的接收时间立即结束,认为下一位的接收时间才是才是这个信号接收的正确值,使这个上升或下降位于下一位的同步段。

                              

时间术语

  • TDiaEnable:从 KL15 打开到 DTC 控制器能检测到DTC的时间,该值只能取所有节点中的最大值
  • TCanAck从接收到CAN初始化触发事件到节点可以接收报文的时间
  • TCanInit从接收到CAN初始化触发事件到发送第一帧报文的时间(此时,CAN硬件、软件初始化完毕,可以发送和接收报文)
  • TMsgStart从接收到CAN初始化触发事件到该节点所有的周期性报文至少被发送一次的时间

     

  • 13
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
CAN (Controller Area Network) 是一种用于实时应用的串行通信协议,主要用于汽车电子、工业自动化等领域。CAN协议采用了差分信号传输方式,具有高可靠性和抗干扰能力。 STM32作为一款常用的微控制器,内置了CAN控制器模块,可以方便地实现CAN通信。下面是CAN通信详解及STM32实现步骤: ## CAN通信协议 CAN通信协议分为两种模式:标准和扩展。标准ID为11位,扩展ID为29位。CAN通信协议中的数据传输是按照消息的优先级来进行的,优先级高的消息会先被处理。 CAN通信协议中的数据传输是基于消息的,每个消息包括了ID、数据和其他一些控制信息。在发送消息之前,需要设置CAN控制器的一些寄存器,包括ID、数据长度码、发送优先级等信息。在接收消息时,需要配置CAN控制器的接收过滤器,用于过滤出需要处理的消息。 ## STM32实现CAN通信 STM32内置了CAN控制器模块,可以方便地实现CAN通信。下面是STM32实现CAN通信的步骤: 1. 配置GPIO引脚 首先需要配置CAN控制器的GPIO引脚,将CAN_TX和CAN_RX引脚连接到CAN总线上。具体的引脚配置可以参考STM32的数据手册。 2. 配置CAN控制器 需要配置CAN控制器的工作模式、波特率等参数。可以使用STM32提供的库函数进行配置,或者直接操作CAN控制器寄存器。 3. 发送消息 发送消息需要设置消息的ID、数据长度码、发送优先级等信息,并将数据写入CAN控制器的发送缓冲区。可以使用STM32提供的库函数进行操作,或者直接操作CAN控制器寄存器。 4. 接收消息 接收消息需要配置CAN控制器的接收过滤器,用于过滤出需要处理的消息。可以使用STM32提供的库函数进行配置,或者直接操作CAN控制器寄存器。接收到消息后,需要从CAN控制器的接收缓冲区中读取数据。 5. 中断处理 在CAN通信过程中,需要使用中断来处理发送和接收操作。可以使用STM32提供的库函数进行中断配置,或者直接操作NVIC寄存器。 以上是STM32实现CAN通信的基本步骤,具体实现可以参考STM32的数据手册和官方库函数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值