can通讯_can通讯分包协议 - CSDN
精华内容
参与话题
  • CAN通信详解(全)

    千次阅读 多人点赞 2019-02-25 17:56:58
    本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯,并将结果显示在TFTLCD模块上。本章分为如下几个部分: 30.1 CAN简介 30.2 硬件设计 30.3 软件设计 30.4 下载验证 30.1 CAN简介 ...

    本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯,并将结果显示在TFTLCD模块上。本章分为如下几个部分:

    30.1 CAN简介

    30.2 硬件设计

    30.3 软件设计

    30.4 下载验证
    30.1 CAN简介

    CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。

    现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。

    CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。

    CAN协议具有一下特点:

    1) 多主控制。在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。

    2) 系统的若软性。与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。

    3) 通信速度较快,通信距离远。最高1Mbps(距离小于40M),最远可达10KM(速率低于5Kbps)。

    4) 具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。

    5) 故障封闭功能。CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

    6) 连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

    正是因为CAN协议的这些特点,使得CAN特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。

    CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。

    本章,我们使用的是450Kbps的通信速率,使用的是ISO11898标准,该标准的物理层特征如图30.1.1所示:
    在这里插入图片描述图30.1.1 ISO11898物理层特性

    从该特性可以看出,显性电平对应逻辑0,CAN_H和CAN_L之差为2.5V左右。而隐性电平对应逻辑1,CAN_H和CAN_L之差为0V。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。
    

    注:ISO11898标准和ISO11519-2标准下,显性电平和隐形电平定义是有区别的。只不过都是隐形电平为1,显性电平为0.

       CAN协议是通过以下5种类型的帧进行的:
    

    l 数据帧

    l 要控帧

    l 错误帧

    l 过载帧

    l 帧间隔

    另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID。各种帧的用途如表30.1.1所示:

    帧类型

    帧用途

    数据帧

    用于发送单元向接收单元传送数据的帧

    遥控帧

    用于接收单元向具有相同 ID 的发送单元请求数据的帧

    错误帧

    用于当检测出错误时向其它单元通知错误的帧

    过载帧

    用于接收单元通知其尚未做好接收准备的帧

    间隔帧

    用于将数据帧及遥控帧与前面的帧分离开来的帧

    表30.1.1 CAN协议各种帧及其用途

       由于篇幅所限,我们这里仅对数据帧进行详细介绍,数据帧一般由7个段构成,即:
    

    (1) 帧起始。表示数据帧开始的段。

    (2) 仲裁段。表示该帧优先级的段。

    (3) 控制段。表示数据的字节数及保留位的段。

    (4) 数据段。数据的内容,一帧可发送0~8个字节的数据。

    (5) CRC段。检查帧的传输错误的段。

    (6) ACK段。表示确认正常接收的段。

    (7) 帧结束。表示数据帧结束的段。

    数据帧的构成如图30.1.2所示:
    在这里插入图片描述

    图30.1.2 数据帧的构成

    图中D表示显性电平,R表示隐形电平(下同)。

    帧起始,这个比较简单,标准帧和扩展帧都是由1个位的显性电平表示帧起始。

    仲裁段,表示数据优先级的段,标准帧和扩展帧格式在本段有所区别,如图30.1.3所示:
    在这里插入图片描述
    图30.1.3 数据帧仲裁段构成

    标准格式的ID 有11 个位。从ID28 到ID18 被依次发送。禁止高7 位都为隐性(禁止设定:ID=1111111XXXX)。扩展格式的 ID 有29 个位。基本ID 从ID28 到ID18,扩展ID 由ID17 到ID0 表示。基本ID和标准格式的ID 相同。禁止高7 位都为隐性(禁止设定:基本ID=1111111XXXX)。

    其中RTR位用于标识是否是远程帧(0,数据帧;1,远程帧),IDE位为标识符选择位(0,使用标准标识符;1,使用扩展标识符),SRR位为代替远程请求位,为隐性位,它代替了标准帧中的RTR位。

    控制段,由6个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同,如图30.1.4所示:
    在这里插入图片描述
    图30.1.4 数据帧控制段构成

       上图中,r0和r1为保留位,必须全部以显性电平发送,但是接收端可以接收显性、隐性及任意组合的电平。DLC段为数据长度表示段,高位在前,DLC段有效值为0~8,但是接收方接收到9~15的时候并不认为是错误。
    

    数据段,该段可包含0~8个字节的数据。从最高位(MSB)开始输出,标准帧和扩展帧在这个段的定义都是一样的。如图30.1.5所示:
    在这里插入图片描述
    图30.1.5 数据帧数据段构成

       CRC段,该段用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。如图30.1.6所示:
    

    在这里插入图片描述

    图30.1.6 数据帧CRC段构成

       此段CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
    
       ACK段,此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位组成。标准帧和扩展帧在这个段的格式也是相同的。如图30.1.7所示:
    

    在这里插入图片描述
    图30.1.7 数据帧CRC段构成

    发送单元的ACK,发送2个位的隐性位,而接收到正确消息的单元在ACK槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送ACK/返回ACK。发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。

    帧结束,这个段也比较简单,标准帧和扩展帧在这个段格式一样,由7个位的隐性位组成。

       至此,数据帧的7个段就介绍完了,其他帧的介绍,请大家参考光盘的CAN入门书.pdf相关章节。接下来,我们再来看看CAN的位时序。
    

    由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。

    l 同步段(SS)

    l 传播时间段(PTS)

    l 相位缓冲段1(PBS1)

    l 相位缓冲段2(PBS2)

    这些段又由可称为 Time Quantum(以下称为Tq)的最小时间单位构成。

    1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。

    1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如表30.1.2所示:

    表30.1.2 一个位各段及其作用

       1个位的构成如图30.1.8所示:
    

    在这里插入图片描述
    图30.1.8 一个位的构成

       上图的采样点,是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。根据这个位时序,我们就可以计算CAN通信的波特率了。具体计算方法,我们等下再介绍,前面提到的CAN协议具有仲裁功能,下面我们来看看是如何实现的。
    

    在总线空闲态,最先开始发送消息的单元获得发送权。

    当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程,如图30.1.9所示:
    在这里插入图片描述
    图30.1.9 CAN总线仲裁过程

       上图中,单元1和单元2同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到T时刻,单元1输出隐性电平,而单元2输出显性电平,此时单元1仲裁失利,立刻转入接收状态工作,不再与单元2竞争,而单元2则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。
    
       通过以上介绍,我们对CAN总线有了个大概了解(详细介绍参考光盘的:《CAN入门书.pdf》),接下来我们介绍下STM32的CAN控制器。
    
       STM32自带的是bxCAN,即基本扩展CAN。它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。对于安全紧要的应用,bxCAN提供所有支持时间触发通信模式所需的硬件功能。
    

    STM32的bxCAN的主要特点有:

    l 支持CAN协议2.0A和2.0B主动模式

    l 波特率最高达1Mbps

    l 支持时间触发通信

    l 具有3个发送邮箱

    l 具有3级深度的2个接收FIFO

    l 可变的过滤器组(最多28个)

    在STM32互联型产品中,带有2个CAN控制器,而我们使用的STM32F103ZET6属于增强型,不是互联型,只有1个CAN控制器。双CAN的框图如图30.1.10所示:
    在这里插入图片描述
    图30.1.10 双CAN框图

       从图中可以看出两个CAN都分别拥有自己的发送邮箱和接收FIFO,但是他们共用28个滤波器。通过CAN_FMR寄存器的设置,可以设置滤波器的分配方式。
    
       STM32的标识符过滤是一个比较复杂的东东,它的存在减少了CPU处理CAN通信的开销。STM32的过滤器组最多有28个(互联型),但是STM32F103ZET6只有14个(增强型),每个滤波器组x由2个32为寄存器,CAN_FxR1和CAN_FxR2组成。
    

    STM32每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:

    ● 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位

    ● 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位

    此外过滤器可配置为,屏蔽位模式和标识符列表模式。

    在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。

    而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。

    通过CAN_FMR寄存器,可以配置过滤器组的位宽和工作模式,如图30.1.11所示:
    在这里插入图片描述
    图30.1.11 过滤器组位宽模式设置

    为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。

    为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。

    应用程序不用的过滤器组,应该保持在禁用状态。

    过滤器组中的每个过滤器,都被编号为(叫做过滤器号,图30.1.11中的n)从0开始,到某个最大数值-取决于过滤器组的模式和位宽的设置。

       举个简单的例子,我们设置过滤器组0工作在:1个32为位过滤器-标识符屏蔽模式,然后设置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中存放到CAN_F0R1的值就是期望收到的ID,即我们希望收到的映像(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是设置我们需要必须关心的ID,表示收到的映像,其位[31:24]和位[15:8]这16个位的必须和CAN_F0R1中对应的位一模一样,而另外的16个位则不关心,可以一样,也可以不一样,都认为是正确的ID,即收到的映像必须是0XFFxx00xx,才算是正确的(x表示不关心)。
    
       关于标识符过滤的详细介绍,请参考《STM32参考手册》的22.7.4节(431页)。接下来,我们看看STM32的CAN发送和接收的流程。
    
    
    
       CAN发送流程
    
       CAN发送流程为:程序选择1个空置的邮箱(TME=1)à设置标识符(ID),数据长度和发送数据à设置CAN_TIxR的TXRQ位为1,请求发送à邮箱挂号(等待成为最高优先级)à预定发送(等待总线空闲)à发送à邮箱空置。整个流程如图30.1.12所示:
    

    在这里插入图片描述
    图30.1.12 发送邮箱

       上图中,还包含了很多其他处理,不强制退出发送(ABRQ=1)和发送失败处理等。通过这个流程图,我们大致了解了CAN的发送流程,后面的数据发送,我们基本就是按照此流程来走。接下来再看看CAN的接收流程。
    
       CAN接收流程
    
       CAN接收到的有效报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。这里的有效报文是指那些正确被接收的(直到EOF都没有错误)且通过了标识符过滤的报文。前面我们知道CAN的接收有2个FIFO,我们每个滤波器组都可以设置其关联的FIFO,通过CAN_FFA1R的设置,可以将滤波器组关联到FIFO0/FIFO1。
    
       CAN接收流程为:FIFO空à收到有效报文à挂号_1(存入FIFO的一个邮箱,这个由硬件控制,我们不需要理会)à收到有效报文à挂号_2à收到有效报文à挂号_3à收到有效报文à溢出。
    
       这个流程里面,我们没有考虑从FIFO读出报文的情况,实际情况是:我们必须在FIFO溢出之前,读出至少1个报文,否则下个报文到来,将导致FIFO溢出,从而出现报文丢失。每读出1个报文,相应的挂号就减1,直到FIFO空。CAN接收流程如图30.1.13所示:
    

    在这里插入图片描述
    图30.1.13 FIFO接收报文

       FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
    
       接下来,我们简单看看STM32的CAN位时间特性,STM32的CAN位时间特性和之前我们介绍的,稍有点区别。STM32把传播时间段和相位缓冲段1(STM32称之为时间段1)合并了,所以STM32的CAN一个位只有3段:同步段(SYNC_SEG)、时间段1(BS1)和时间段2(BS2)。STM32的BS1段可以设置为1~16个时间单元,刚好等于我们上面介绍的传播时间段和相位缓冲段1之和。STM32的CAN位时序如图30.1.14所示:
    

    在这里插入图片描述
    图30.1.14 STM32 CAN位时序

       图中还给出了CAN波特率的计算公式,我们只需要知道BS1和BS2的设置,以及APB1的时钟频率(一般为36Mhz),就可以方便的计算出波特率。比如设置TS1=6、TS2=7和BRP=4,在APB1频率为36Mhz的条件下,即可得到CAN通信的波特率=36000/[(7+8+1)*5]=450Kbps。
    
       接下来,我们介绍一下本章需要用到的一些比较重要的寄存器。首先,来看CAN的主控制寄存器(CAN_MCR),该寄存器各位描述如图30.1.15:
    

    在这里插入图片描述
    图30.1.15 寄存器CAN_MCR各位描述

    该寄存器的详细描述,请参考《STM32参考手册》22.9.2节(439页),这里我们仅介绍下INRQ位,该位用来控制初始化请求。

    软件对该位清0,可使CAN从初始化模式进入正常工作模式:当CAN在接收引脚检测到连续的11个隐性位后,CAN就达到同步,并为接收和发送数据作好准备了。为此,硬件相应地对CAN_MSR寄存器的INAK位清’0’。

    软件对该位置1可使CAN从正常工作模式进入初始化模式:一旦当前的CAN活动(发送或接收)结束,CAN就进入初始化模式。相应地,硬件对CAN_MSR寄存器的INAK位置’1’。

    所以我们在CAN初始化的时候,先要设置该位为1,然后进行初始化(尤其是CAN_BTR的设置,该寄存器,必须在CAN正常工作之前设置),之后再设置该位为0,让CAN进入正常工作模式。

    第二个,我们介绍CAN位时序寄存器(CAN_BTR),该寄存器用于设置分频、Tbs1、Tbs2以及Tsjw等非常重要的参数,直接决定了CAN的波特率。另外该寄存器还可以设置CAN的工作模式,该寄存器各位描述如图30.1.16所示:

    在这里插入图片描述

    图30.1.16 寄存器CAN_BTR各位描述

       STM32提供了两种测试模式,环回模式和静默模式,当然他们组合还可以组合成环回静默模式。这里我们简单介绍下环回模式。
    

    在环回模式下,bxCAN把发送的报文当作接收的报文并保存(如果可以通过接收过滤)在接收邮箱里。也就是环回模式是一个自发自收的模式,如图30.1.17所示:
    在这里插入图片描述
    图30.1.17 CAN环回模式

    环回模式可用于自测试。为了避免外部的影响,在环回模式下CAN内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。在环回模式下,bxCAN在内部把Tx输出回馈到Rx输入上,而完全忽略CANRX引脚的实际状态。发送的报文可以在CANTX引脚上检测到。

       第三个,我们介绍CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~3),该寄存器各位描述如图30.1.18所示:
    

    在这里插入图片描述
    图30.1.18 寄存器CAN_TIxR各位描述

       该寄存器主要用来设置标识符(包括扩展标识符),另外还可以设置帧类型,通过TXRQ值1,来请求邮箱发送。因为有3个发送邮箱,所以寄存器CAN_TIxR有3个。
    
       第四个,我们介绍CAN发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x=0~2),该寄存器我们本章仅用来设置数据长度,即最低4个位。比较简单,这里就不详细介绍了。
    
       第五个,我介绍的是CAN发送邮箱低字节数据寄存器 (CAN_TDLxR) (x=0~2),该寄存器各位描述如图30.1.19所示:
    

    在这里插入图片描述
    图30.1.19 寄存器CAN_TDLxR各位描述

       该寄存器用来存储将要发送的数据,这里只能存储低4个字节,另外还有一个寄存器CAN_TDHxR,该寄存器用来存储高4个字节,这样总共就可以存储8个字节。CAN_TDHxR的各位描述同CAN_TDLxR类似,我们就不单独介绍了。
    
       第六个,我们介绍CAN接收FIFO邮箱标识符寄存器 (CAN_RIxR) (x=0/1),该寄存器各位描述同CAN_TIxR寄存器几乎一模一样,只是最低位为保留位,该寄存器用于保存接收到的报文标识符等信息,我们可以通过读该寄存器获取相关信息。
    
       同样的,CAN接收FIFO邮箱数据长度和时间戳寄存器 (CAN_RDTxR) 、CAN接收FIFO邮箱低字节数据寄存器 (CAN_RDLxR)和CAN接收FIFO邮箱高字节数据寄存器 (CAN_RDHxR) 分别和发送邮箱的:CAN_TDTxR、CAN_TDLxR以及CAN_TDHxR类似,这里我们就不单独一一介绍了。详细介绍,请参考《STM32参考手册 》22.9.3节(447页)。
    

    第七个,我们介绍CAN过滤器模式寄存器(CAN_FM1R),该寄存器各位描述如图30.1.20所示:
    在这里插入图片描述
    图30.1.20 寄存器CAN_FM1R各位描述

       该寄存器用于设置各滤波器组的工作模式,对28个滤波器组的工作模式,都可以通过该寄存器设置,不过该寄存器必须在过滤器处于初始化模式下(CAN_FMR的FINIT位=1),才可以进行设置。对STM32F103ZET6来说,只有[13:0]这14个位有效。
    
       第八个,我们介绍CAN过滤器位宽寄存器(CAN_FS1R),该寄存器各位描述如图30.1.21所示:
    

    在这里插入图片描述
    图30.1.21 寄存器CAN_FS1R各位描述

       该寄存器用于设置各滤波器组的位宽,对28个滤波器组的位宽设置,都可以通过该寄存器实现。该寄存器也只能在过滤器处于初始化模式下进行设置。对STM32F103ZET6来说,同样只有[13:0]这14个位有效。
    
       第九个,我们介绍CAN过滤器FIFO关联寄存器(CAN_FFA1R),该寄存器各位描述如图30.1.22所示:
    

    在这里插入图片描述
    图30.1.22 寄存器CAN_FFA1R各位描述

       该寄存器设置报文通过滤波器组之后,被存入的FIFO,如果对应位为0,则存放到FIFO0;如果为1,则存放到FIFO1。该寄存器也只能在过滤器处于初始化模式下配置。
    
       第十个,我们介绍CAN过滤器激活寄存器(CAN_FA1R),该寄存器各位对应滤波器组和前面的几个寄存器类似,这里就不列出了,对对应位置1,即开启对应的滤波器组;置0则关闭该滤波器组。
    
       最后,我们介绍CAN的过滤器组i的寄存器x(CAN_FiRx)(互联产品中i=0~27,其它产品中i=0~13;x=1/2)。该寄存器各位描述如图30.1.23所示:
    

    在这里插入图片描述
    图30.1.23 寄存器CAN_FiRx各位描述

       每个滤波器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。关于过滤器的映射,功能描述和屏蔽寄存器的关联,请参见图30.1.11。
    
       关于CAN的介绍,就到此结束了。接下来,我们看看本章我们将实现的功能,及CAN的配置步骤。
    
       本章,我们通过WK_UP按键选择CAN的工作模式(正常模式/环回模式),然后通过KEY0控制数据发送,并通过查询的办法,将接收到的数据显示在LCD模块上。如果是环回模式,我们不需要2个开发板。如果是正常模式,我们就需要2个战舰开发板,并且将他们的CAN接口对接起来,然后一个开发板发送数据,另外一个开发板将接收到的数据显示在LCD模块上。
    
       最后,我们来看看本章的CAN的初始化配置步骤:
    

    1)配置相关引脚的复用功能,使能CAN时钟。

    我们要用CAN,第一步就要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA11为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX引脚),并使能PA口的时钟

    2)设置CAN工作模式及波特率等。

    这一步通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。 最后设置INRQ为0,退出初始化模式。

    3)设置滤波器。

    本章,我们将使用滤波器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,让过滤器组工作在初始化模式下,然后设置滤波器组0的工作模式以及标识符ID和屏蔽位。最后激活滤波器,并退出滤波器初始化模式。

    至此,CAN就可以开始正常工作了。如果用到中断,就还需要进行中断相关的配置,本章因为没用到中断,所以就不作介绍了。

    30.2 硬件设计

    本章要用到的硬件资源如下:

    1) 指示灯DS0

    2) KEY0和WK_UP按键

    3) TFTLCD模块

    4) CAN

    5) CAN收发芯片JTA1050

    前面3个之前都已经详细介绍过了,这里我们介绍STM32与TJA1050连接关系,如图30.2.1所示:
    在这里插入图片描述
    图30.2.1 STM32与TJA1050连接电路图

       从上图可以看出:STM32的CAN通过P13的设置,连接到TJA1050收发芯片,然后通过接线端子(CAN)同外部的CAN总线连接。图中可以看出,在战舰STM32开发板上面是带有120Ω的终端电阻的,如果我们的开发板不是作为CAN的终端的话,需要把这个电阻去掉,以免影响通信。
    

    这里还要注意,我们要设置好开发板上P13排针的连接,通过跳线帽将PA11和PA12分别连接到CRX(CAN_RX)和CTX(CAN_TX)上面,如图30.2.2所示:
    在这里插入图片描述
    图30.2.2 硬件连接示意图

       最后,我们用2根导线将两个开发板CAN端子的CAN_L和CAN_L,CAN_H和CAN_H连接起来。这里注意不要接反了(CAN_L接CAN_H),接反了会导致通讯异常!!
    
        </div>
            </div>
        </article>
    
    展开全文
  • CAN通信详解

    千次阅读 2019-10-27 22:57:15
    CAN通信详解 概念 KEL15与KEL30:KEL30是指提供基本功能的供电电压,此供电模式下功能很少:KEL15是指提供多功能的供电电压。其中KEL15又称:IG ON。 终端电阻:由于信号传输会产生回波、反射(驻波)等干扰,...

    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初始化触发事件到该节点所有的周期性报文至少被发送一次的时间

         

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • CAN通讯的总结

    千次阅读 2015-07-21 11:02:54
    1.CAN通讯有2套国际标准,2套协议版本,3种故障状态,4种数据帧类型,5种总线错误类型。 2.CAN的国际标准有两种ISO11898和ISO11519。 3.CAN2.0协议分为A版和B版两种,A版协议仅支持11位标识符(称为标准帧),B版...

    1.CAN通讯有2套国际标准,2套协议版本,3种故障状态,4种数据帧类型,5种总线错误类型。

    2.CAN的国际标准有两种ISO11898ISO11519

    3.CAN2.0协议分为A版和B版两种,A版协议仅支持11位标识符(称为标准帧),B版协议兼容11位,向上扩展到19位标识符(称为扩展帧)。

    4.CAN总线中,任何一个节点发生了错误,那么这个节点可能处于3种故障状态:错误主动状态,错误被动状态,离线状态。错误主动状态:可以正常参加总线通讯,检测出错误时,输出主动错误标志。错误被动状态:是易引起错误的状态,虽然能参加总线通讯,但为不妨碍其他节点通讯,接收时不能积极的发送错误通知,处于被动错误状态的节点即时检测出错误,而其它处于主动错误状态的节点如果没有发现错误,整个总线也被认为没有错误。离线状态:不能参加总线通讯的状态。

    4.CAN总线中有5类错误,这5类错误并不具有排他性,可以同时发生。CAN总线在任意时刻,只有一个节点在发送数据,其他所有节点都是在接收,只有对应的ID报文节点对接收的报文做出应答反应。

    5.位错误(Bit Error):节点是边发送边检听对应的位,发送的位和检测的位如果不一致,则检测到一个位错误。

    6.填充错误(Stuff Error)监听到6个连续相同的为电平时,则检测到一个位填充错误。

    7.CRC错误(CRC Error)发送节点会对报文的帧起始,仲裁场,数据场进行CRC计算,求出CRC校验码,并将其也发送出去。接收节点在接收到数据后,会根据CRC校验码来判断接收到的数据在传送过程中是否出错。

    8.形式错误()一个固定形式的位场中含有非法位时,则检测到一个形式错误。

    9.应答错误()只要在应答期间所监听的位不为显性,则发送器检测到一个应答错误。

    应答场包括应答位和应答分隔符,发送节点发送的这两位均为隐性电平,这时只有正确接收报文的接收节点发送显性电平来覆盖它。

    11.串口通信是一对一的通信,SPI的通信是一对多的通信。CAN的一大特点,多主机串行通信:也就是在总线空闲时,所有单元都可以发送消息,最先访问的节点可以获得发送权,若多个节点认为自己获得发送权同时开始发送数据时,根据ID的优先级来竞争总线的发送权。总线上的节点没有类似于MAC物理地址的信息,所以在总线上增减单元时,连接在总线上的其他单元的软硬件及应用层都不需要改变。单元根据报文ID决定接收或者屏蔽该报文,报文ID在一定程度上也决定了此帧数据的优先级,发送的信息遭到破坏后,可自动重发;节点在错误严重的情况下具有自动退出总线的功能。

    12.CAN总线上所有的节点都可以检测错误,检测出错误的单元会立刻通知其他所有单元。正常发送的节点一旦检测出错误,会强制结束当前的发送,强制结束发送的节点会不断反复的发送此信息直到成功发送为止,或进入总线关闭状态。

    13.CAN总线上的信号使用差分电压进行传送,两条信号线被称为CAN_H CAN_L,静态时均是2.5v左右,这时的状态表示逻辑1,也称为隐性电平,通常CAN_H3.5CAN_L1.5时,表示为逻辑0,称为显性电平。

    14.DSP的CAN模块的引脚在发送数据的同时,其接受引脚也在监听所发送的数据,也就是,发送数据的时候,接受引脚上也会有相应的波形可以在示波器上显示。如果CAN总线上只有发送节点,却没有接受节点,那么这个发送节点会一直发送数据直到发送成功为止,也就是收到有效的应答信号。

    15.CAN协议里对ACK(应答场)有如下的描述:

    应答场长度为2 个位,包含应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。在应答场里,发送站发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK SLOT)期间(发送ACK 信号)向发送器发送一“显性”的位以示应答。

    15.应答间隙:所有接收到匹配CRC 序列(CRC SEQUENCE)的站会在应答间隙(ACK SLOT)期间用一“显性”的位写入发送器的“隐性”位来作出回答。ACK 界定符:ACK 界定符是ACK 场的第二个位,并且是一个必须为“隐性”的位。因此,应答间隙(ACK SLOT)被两个“隐性”的位所包围,也就是CRC 界定符(CRC DELIMITER)和ACK 界定符(ACK DELIMITER)。

    16.在CAN协议的错误检测部分有这样的描述:

    位错误:站单元在发送位的同时也对总线进行监视。如果所发送的位值与所监视的位值不相符合,则在此位时间里检测到一个位错误(BIT ERROR)。但是在仲裁场(ARBITRATION FIELD)的填充位流期间或ACK间隙(ACK SLOT)发送一“隐性”位的情况是例外的—— 此时,当监视到一“显性”位时,不会发出位错误(BIT ERROR)。应答错误:只要在ACK 间隙(ACK SLOT)期间所监视的位不为“显性”,则发送器会检测到一个应答错误(ACKNOWLEDGMENT ERROR)。

    17.发送者在发送的同时,会监视总线上的数据,如果与发送的娄据不一致,则表示发送失败或自己失去仲裁,立即停止发送或转入接收模式。如果有一个节点在ACK SLOT的时间内发送“显性”位,则发送者认为此次发送报文成功;如果发送者检测到ACK SLOT为隐性位,则表示没有节点填充ACK SLOT,则发送者会检测到这个隐性位而知道发送失败,此条报文需要重发。所以,当总线上只有一个节点的时候,或是只有一个节点可以收发数据的时候,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK SLOT没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。

    18.(注:一:总线上只有一个节点而且它向外发送了数据。它确实不会收到任何ACK,它会变成“error passive”但是它不会变成BUS off。why?请参考CAN specificaton 2.0-partB-Fault_Confinement--rule3--exception1 二:其它检测到CRC错误的节点不会马上发送错误帧,而是在ACK delimiter之后才发送。请参考CAN specificaton 2.0-partB-Error_Signalling)

    19.ACK SLOT只有一个BIT,而接下去的ACK delimiter始终为隐性(我们可认为是1),当数据到达ACK SLOT的时候,所有的节点都会发送显性位(我们可以认为是0),而发送者在ACK这个时间里保持隐性位(即发送者在发送的时候ACK SLOT 为1),这时发送者会检测总线上的ACK时间内的信号,如果是0,则表示正确,如果是1,表示有错误。如果当中有某一个节点在ACK SLOT填入隐性位,则总线上同样还是显性位电平,故只要总线上有一个节点正确接收到数据,则ACK SLOT就会被填入显性电平;那么,接收错误的节点如何来告知发送者此次发送不成功呢?这时候就要用到CAN的错误帧,当一个接收者收到错误的数据的时候,它立即开始发送一个错误帧,则接下去总线上的信号就是这个错误帧,其它的节点和发送者也都会收到这个错误帧,那所有的节点都知道出错了,接收者会丢掉此次消息,而发送者会试图重发此次消息。这才是ACK SLOT真正的含义。

    20.我们认为,发送者在发数据的时候,CANTX在发送数据,而CANRX同时也在接收数据,当发送者发送ACK为隐性时,接收到的ACK SLOT一定要是显性才会正确。那么,当有节点正确接收到了数据,在ACK SLOT填上显性位后,接收错误的节点这时候会如何呢?接收错误的节点就会马上发送错误帧,一般是发送连续的601,根据CAN的位填充原理,当有五个连续的01出现时,为了传送中的同步,必须插入一个反相位的BIT作为填充位,如果连续出现6个或以上的相同信号,则此次传送错误,数据将被丢弃。故当发送者收到这个错误帧后,便会知道发送出错,并试图重发数据。

    展开全文
  • CAN详解--CAN与com口介绍

    万次阅读 2018-12-26 18:59:31
    通常用于连接鼠标(串口)及通讯设备(如连接外置式调制解调器进行数据通讯或一些工厂的数控机接口)等。一般主板外部只有一个串口,机箱后面和并口一起的那个九孔输出端(梯形),就是COM1口,COM...

    一、com口

    1、实物图

    2、介绍

    COM口( cluster communication port )即串行通讯端口,简称串口。微机上的串口通常是9针,也有25针的接口,最大速率115200bps。通常用于连接鼠标(串口)及通讯设备(如连接外置式调制解调器进行数据通讯或一些工厂的数控机接口)等。一般主板外部只有一个串口,机箱后面和并口一起的那个九孔输出端(梯形),就是COM1口,COM2口一般要从主板上插针引出。并口是最长的那个梯形口。但目前主流的主板一般都只带1个串口,甚至不带,慢慢会被USB 取代。

    3、串口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口。9针串行口的针脚功能:

    DB-9针连接头
    -------------
    \ 1 2 3 4 5 /
     \ 6 7 8 9 /

    针脚 功能
    1 载波检测(CD)
    2 接受数据(RXD)

    3

    发出数据(TXD)
    4 数据终端准备好(DTR)
    5 信号地线(SG)
    6 数据准备好(DSR)
    7 请求发送(RTS)
    8 清除发送(CTS)
    9 振铃指示(RI)
       

     

     

    二、can(转)

    1、本文说的CAN即是一种总线,也是一种协议。因此,我们常听见CAN总线,也常听见CAN协议。

    2、CAN协议和CANOpen协议是两套不同的协议。从软硬件层次来划分,CAN协议属于硬件协议,而CANOpen属于软件协议

    3、下面先概述一下CAN网络,让大家对CAN总线协议有一个全局的概念,再到底层的CAN总线协议知识。

    (1)CAN网络

    CAN网络可以理解为多台CAN设备连接在同一条CAN总线上组合成的网络,其中的CAN设备我们称之为节点。CAN网络拓扑结构如下图:

    如上图,一个CAN节点主要包含三类:MCU应用程序、CAN控制器、CAN收发器

    MCU应用程序

    MCU应用程序我将其分为三块:业务逻辑代码、协议层代码、底层驱动代码

    A.业务逻辑代码:是根据项目需求而定,也很好理解。比如我读取一个传感器数据,并对其做出相应逻辑处理。

    B.协议层代码:比如后续要讲述的CANOpen。

    C.底层驱动代码:配置CAN总线相应参数、控制收发的代码。

    CAN控制器

    CAN控制器内部结构还是挺复杂的,一般现在CAN控制器都是与处理器集成在一起

    其实对于编程的人来说,无非也就是包含一些控制、状态、配置等寄存器。

    比如我们看到有些STM32芯片带有CAN,也就是说CAN控制器已经集成在STM32芯片中了,我们只需要编程操作其中的寄存器即可。

    CAN收发器

    CAN收发器:将CAN收发引脚(CAN_TX和CAN_RX)的TTL信号转换成CAN总线的电平信号

    PS:你可以把CAN总线通信认为是UART通过485进行通信:CAN控制器就如UART的控制器,而CAN收发器就如485转换芯片。

    (2)ISO标准化的CAN协议

    写这一章节的主要目的就是想让大家了解CAN总线位于OSI所在层次。

     ISO/OSI基本参照模型

    【注】

    ISO:International Standardization Organization国际标准化组织;

    OSI:Open Systems Interconnection开放式系统间互联;

    CAN在OSI模型中的定义

    【注】

    LLC:Logical Link Control逻辑链路控制;

    MAC:Medium Access Control媒介访问控制;

    从上图可以知道CAN总线底层硬件的内容(CAN控制器、收发器)主要位于OSI的第1层和第2层。

    (3)概述CAN总线协议

    CAN总线协议:就是为了保证通信(收发)数据在CAN总线上能稳定传输而制订的一套协议。

    CAN总线协议的内容很多,为方便初学者理解,本文先大概描述一下CAN总线协议,后续文章详细讲述CAN总线协议的内容。

     总线信号

    CAN总线为「两线」「差分」信号,用隐形代表逻辑1,显性代表逻辑0。如下图:

     

     

    优先级

    假如某一时刻,一个设备(节点)往总线发0,一个设备往总线发1。那么总线会呈现什么现象?

    答案:最后总线呈现为显性,也就是0。

     位时序

    位时序逻辑将监视串行总线,执行采样并调整采样点,在调整采样点时,需要在起始位边沿进行同步并后续的边沿进行再同步。

    简单的说就是对一个bit位分几段进行采样,目的就是提高数据传输稳定性。在STM32中底层驱动代码就需要进行位时序编程,在STM32参考手册中也会发现如下位时序图:

     

     帧的种类和格式

    帧的种类有多种:

    数据帧:用于发送单元向接收单元传送数据的帧。

    遥控帧:用于接收单元向具有相同 ID 的发送单元请求数据的帧。

    错误帧:用于当检测出错误时向其它单元通知错误的帧。

    过载帧:用于接收单元通知其尚未做好接收准备的帧。

    帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧。

    数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11个位的标识符ID,扩展格式有29个位的ID。

     位填充

    位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。如下图:

     

     错误的种类

     

    CAN总线协议内容很多,初学者先了解这些,后面文章具体到每一个点上,相信大家就会更明白其中的含义。

     

    致谢

    1、标准9针串口引脚定义

    2、com口

    3、Kvaser(cn)

    4、嵌入式工程师常用的CAN总线协议,全面了解一下!

    5、CAN协议教程(好)

    6、浅谈CAN通讯协议---杨澜


     

    展开全文
  • CAN通讯详解

    万次阅读 多人点赞 2018-08-03 11:45:44
    本章参考资料:《STM32F4xx&nbsp;中文参考手册2》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_...若对CAN通讯协议不了解,可先阅读《CAN总线入门》、《CAN-bus规范》文档内容学习。 关于实验板上的CAN收发器...
  • 基于F28335的CAN通讯

    2020-07-13 21:53:07
    基于F28335的CAN通讯前言CAN概述CAN模块组成 前言 DSP作为一种控制芯片,因此使用DSP的设备常常需要和其他设备进行通讯。CAN通讯就是其中一种。 CAN通讯是串行通讯中的一种,相比较并行通讯,还是有串行通讯的固有的...
  • Labview的CAN通讯

    千次阅读 2020-01-02 10:25:24
    Labview的CAN通讯(Kvaser实现)首先你要有一根kvaser你要对CAN有那么一点点的了解kvCanExample如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居...
  • 学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就是给每个数据加上有...
  • STM32F407与STM32F105 CAN通讯失败的定位解决问题的发现问题的现象测试过程硬件调整测试软件调整测试结论基本结论结论扩展验证 问题的发现 在STM32 CAN总线的应用过程,遇到STM32F407与STM32F105的CAN通讯失败问题,...
  • 基于C#的CAN通讯示例

    2020-07-30 23:32:14
    基于C#的CAN通讯示例,实现CAN通讯的写入读出,测试通过。
  • 笔者在项目中同时使用过两种DSP,一种是28069,另一种是28377D,这两个DSP主要是进行CAN通讯功能,完成整个系统的非实时通讯功能。 今天笔者主要想讨论的是28069与28377D的CAN外设,这两个DSP虽然都是Ti的,但CAN...
  • 1.CAN通讯的理解  想学习CAN通讯,那么要对通讯协议有一定的认知。通讯协议是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题做出...
  • CAN通讯电路设计

    千次阅读 2011-04-21 21:15:00
    CAN通讯设计 选用的DSP TMS320LF2407A芯片集成了CAN控制器 的功能模块,简化了CAN的硬件电路设计E3】。集成的CAN 控制器支持CAN2,0B协议,有6个数据长度为0一-8个字节 的邮箱,可通过软件灵活设计接收和发送...
  • CAN通讯的byte序和bit序

    千次阅读 2018-12-07 22:02:29
    听别人说起CAN通讯协议的时候总说到Intel格式和motorola格式的时候。Intel格式如何,Motorola格式又如何?觉得很有必要搞懂这些知识,也看了相关资料,可直到今天还没明白。真是聪明人都是相似的,笨的人则各有各的...
  • GSB充电桩充电模块CAN通讯协议V1.03中的单精度浮点数转换的过程是如何的?最后如何用十六进制去表示? 公式:((-1)^S) * (2^(阶码-127)) * (1+尾数) 例子: (100.25)10 :这就代表10进制的数 ...
  • stm32—CAN通讯例程(两个)

    热门讨论 2020-07-30 23:32:28
    STM32的CAN通讯例程。是从不同地方找到的两种不同的CAN例程。总共有两个。 —一个用标准库函数实现; 另一个是用main()写成的一个单独的测试函数。 里面分成两个压缩包,单独使用。 例程2解释非常详细! 提示:看...
  • 汽车CAN通讯问题

    千次阅读 2018-06-21 16:49:09
    汽车CAN通讯稳定性受到线路长度和通讯速率的影响,当车辆CAN信号有时好使有时不好使时,应当首先考虑终端电阻是否连接,CAN线电阻测试为60欧姆为正常!...
  • 本博文主要介绍了车用CAN通讯的基础知识,包括CAN通讯的背景,通讯分层,CAN通讯特性及CAN通讯的工作原理等。
  • 周立功上位机获取CAN通讯数据解析 V2.0 运行环境: win7 、 python3.5.2 功能: 使用周立功can通讯上位机保存数据,保存数据格式为txt。将上位机获取的16位字符串解析位正常数据 效果: 转化之后的.xls文件,保存在...
  • 使用USBCAN通讯

    千次阅读 2019-01-08 10:04:55
    使用USBCAN通讯 使用ZLG USBCAN-E-U,通过C#实现通讯: 1、建一个CANDevice实体类,传递一些参数,并且保存一些设备的型号、ID,以及波特率等参数 复制代码 using System; using System.Collections.Generic; using ...
1 2 3 4 5 ... 20
收藏数 45,312
精华内容 18,124
关键字:

can通讯