工控网首页
>

应用设计

>

三格电子CAN学习笔记

三格电子CAN学习笔记

2021/6/8 16:09:14

CAN理论概述

1..CAN的分层结构(依照OSI标准):

图片1.jpg 

--CAN与以太网类似---包含最底的两层(物理层和数据链路层)。

--另外还包含传输层---用于发送控制(单次触发或发送失败时永久重发)。

--应用层即为发送接收相关的发送/接收函数、中断及数据的处理。

--因此虽然标准CAN不包含OSI中的七层,但也可以构成简易的网络,

-- CANopen是一种架构在控制局域网路(Control Area Network, CAN)上的高层通讯协定,包括通讯子协定及设备子协定常在嵌入式系统中使用,也是工业控制常用到的一种现场总线

CANopen实作了OSI模型中的网络层以上(包括网络层)的协定。CANopen标准包括寻址方案、数个小的通讯子协定及由设备子协定所定义的应用层 CANopen 支援网络管理、设备监控及节点间的通讯,其中包括一个简易的传输层,可处理资料的分段传送及其组合。一般而言资料链结层及实体层会用CAN来实作。除了CANopen外,也有其他的通讯协定(如EtherCAT)实作CANopen的设备子协定。

--CAN与CANOPEN是两种协议,没有CANOPEN也可以组成CAN网络及应用。

--CAN+CANOPEN组成较完整的OSI;这类似于TCP/IP+以太网组成互联网。

--从OSI网络模型的角度来看同,现场总线网络一般只实现了第1层(物理层)、第2层(数据链路层)、第7层(应用层)。因为现场总线通常只包括一个网段,因此不需要第3层(传输层)和第4层(网络层),也不需要第5层(会话层)第6层(描述层)的作用。

2..CAN技术特点

1)工作方式CAN多主方式工作,网络上任一节点均可在任意时刻主动地向网络上其他节点发送信息,而不分主从,通信方式灵活,且无需站地址等节点信息。

2)消息的发送CAN网络上的节点信息分成不同的优先级,可满足不同的实时要求,高优先级的数据最多可在134us内得到传输。

3)仲裁CAN采用非破坏性总线仲裁技术,大大节省了总线冲突仲裁时间。尤其是在网络负载很重的情况下也不会出现网络瘫痪情况(以太网则可能)。

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

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

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

隔离出去。

7)通信速度:根据整个网络的规模,可设定适合的通信速度。在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。

8)远程数据请求:可通过发送遥控帧/远程帧请求其他单元发送数据。

9)错误检测/通知/恢复功能: 

所有的单元都可以检测错误(错误检测功能)。 

检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。 

正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送,此消息直到成功发送为止(错误恢复功能)。

10)CRC校验CAN的每帧信息都有CRC校验及其他检错措施,保证了数据出错率极低。

3..标准协议:

ISO标准化的CAN协议

CAN协议经ISO标准化后有ISO11898标准和ISO11519-2标准两种。ISO11898和ISO11519-2标准对于数据链路层的定义相同,但物理层不同

(1)  关于ISO11898

ISO11898 是通信速度为 125kbps-1MbpsCAN 高速通信标准。

目前,ISO11898 追加新规约后,成为 ISO11898-1 新标准。

(2)  关于 ISO11519

ISO11519 是通信速度为 125kbps以下 CAN 低速通信标准。

ISO11519-2 是 ISO11519-1 追加新规约后的版本。

总结

>>两种标准物理层不同,数据链路层相同。

>>数据链路层对应控制器;物理层对应收发器。

>>CAN2.0A/B的区别是ID位数不同---数据链路层(控制器)不同。

>>ISO11898与ISO11519-2的区别是物理层(收发器)的不同。

>>课题所用到的PCA82C250、VP230以及TJA1050都支持ISO11898标准。

PCA82C252与TJA1053支持ISO11519-2标准。

4.. 错误

--------错误状态的种类 

单元始终处于 3 种状态之一。

(1)  主动错误状态 

主动错误状态是可以正常参加总线通信的状态。 

处于主动错误状态的单元检测出错误时,输出主动错误标志。 

(2)  被动错误状态

被动错误状态是易引起错误的状态。 

处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。

处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。 

处于被动错误状态的单元检测出错误时,输出被动错误标志。 

另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8 个位的隐性位)。

(3)  总线关闭 

总线关闭态是不能参加总线上通信的状态。

信息的接收和发送均被禁止。

这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。

--------错误状态和计数值关系

图片2.jpg 

CANOPEN协议

工作层

CAN只定义物理层和数据链路层,没有规定应用层,本身并不完整,需要一个高层协来定义CAN报文中的11/29位标识符、8字节数据的使用。而且,基于CAN总线的工业自动化应用中,越来越需要一个开放的、标准化的高层协议:这个协议支持各种CAN厂商设备的互用性、互换性,能够实现在CAN网络中提供标准的、统一的系统通讯模式,提供设备功能描述方式,执行网络管理功能。  

a)应用层(Application  layer):为网络中每一个有效设备都能够提供一组有用的服务与协议。  

b)通讯描述(Communication  profile):提供配置设备、通讯数据的含义,定义数据通讯方式。  

c)设备描述(Device proflile):为设备(类)增加符合规范的行为。

2  应用

CANopen协议。CANopen协议是CAN-in-Automation(CiA)定义的标准之一,并且在发布后不久就获得了广泛的承认。尤其是在欧洲CANopen协议被认为是在基于CAN的工业系统中占领导地位的标准。大多数重要的设备类型,例如数字和模拟的输入输出模块、驱动设备、操作设备、控制器、可编程控制器或编码器,都在称为“设备描述”的协议中进行描述;“设备描述”定义了不同类型的标准设备及其相应的功能。依靠CANopen协议的支持,可以对不同厂商的设备通过总线进行配置。

3  CAL协议 CANOPEN协议:

CALCAN Application Layer)协议是目前基于CAN的高层通讯协议中的一种,最早由Philips医疗设备部门制定。

CANopen是在 CAL基础上开发的,使用了CAL通讯和服务协议子集,提供了分布式控制系统的一种实现方案。CANopen在保证网络节点互用性的同时允许节点的功能随意扩展:或简单或复杂。

CANopen的核心概念是设备对象字典OD:Object Dictionary),在其它现场总线(Profibus,Interbus-S)系统中也使用这种设备描述形式。注意:对象字典不是CAL的一部分,而是在CANopen中实现的。

基于STM32的CAN

轮询=查询

1 STM32bxCAN:是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的先级要求(优先级特性可软件配置)。对于安全紧要的应用,bxCAN提供所有支持时间触发通信模式所需的硬件功能。

2 CAN--2.0A和2.0B CAN2.0A为标准格式,CAN2.0B为扩展格式,报文标识符可达2032种(CAN2.0A11位ID),而扩展标准(CAN2.0B29位ID)的报文标识符几乎不受限制;CAN2.0规范兼容CAN 1.2 规范。

3 发送邮箱和接收过滤器:

>>共有3个发送邮箱供软件来发送报文。发送调度器根据优先级决定哪个邮箱的报文先被发送。

>>在互联型产品中,bxCAN提供28个位宽可变/可配置的标识符过滤器组,软件通过对它们编程,从而在引脚收到的报文中选择它需要的报文,而把其它报文丢弃掉。在其它STM32F103xx系列产品中有14个位宽可变/可配置的标识符过滤器组。

接收FIFO

共有2个接收FIFO,每个FIFO都可以存放3个完整的报文---共六个报文。它们完全由硬件来管理。

注:互联型产品是指STM32F105xx和STM32F107xx微控制器。

4 bxCAN工作模式

(1) 初始化模式bxCAN处于初始化模式时,禁止报文的接收和发送,并且CANTX引脚输出隐性位(高电平)。 初始化模式的进入,不会改变配置寄存器。

(2) 正常模式:可以正常的接收和发送报文。

(3) 睡眠模式低功耗模式,bxCAN的时钟停止了,但软件仍然可以访问邮箱寄存器。

5 bxCAN测试模式

(1) 静默模式:在静默模式下,bxCAN可以正常地接收数据帧和远程帧,但只能发出隐性位,而不能真正发送报文----静默模式通常用于分析CAN总线的活动,而不会对总线造成影响-显性位(确认位、错误帧)不会真正发送到总线上

(2) 环回模式:在环回模式下,bxCAN把发送的报文当作接收的报文并保存(如果可以通过接收过滤)在接收邮箱里---用于自测试,但是发送的报文可以在CANTX引脚上检测到

(3) 静默环回:用于“热自测试”,即可以像环回模式那样测试bxCAN,但却不会影响CANTX和CANRX所连接的整个CAN系统。在环回静默模式下,CANRX引脚与CAN总线断开,同时CANTX引脚被驱动到隐性位状态。

6 调试DBG支持定时器、看门狗、bxCANI2C的调试

当微控制器处于调试模式时,Cortex-M3核心处于暂停状态,依据下述配置位的状态,bxCAN可以继续正常工作或停止工作:

调试(DBG)模块中的调试MCU配置寄存器DBGMCU_CRCAN1的DBG_CAN1_STOP位或CAN2的DBG_CAN2_STOP位。DBG_CANx_STOP:当内核进入调试状态时,CAN2停止运行。

0:CANx仍然正常运行;

1:CANx的接收寄存器不继续接收数据。 

●  CAN_MCR(CAN主控制寄存器)中的DBF位(位16):

0:在调试时,CAN照常工作

1:在调试时,冻结CAN的接收/发送。仍然可以正常地读写和控制接收FIFO。

7 发送处理

CAN发送邮箱标识符寄存器:

>>CAN_TIxR寄存器的TXRQ位置’1-----------请求发送。

CAN发送状态寄存器:

>>CAN_TSR寄存器的RQCPTXOK位置1----来表明一次成功发送。

>>CAN_TSR寄存器的ALST位置’1’---------仲裁引起,TERR位置’1’-----发送错误。

>>CAN_TSR寄存器的ABRQ位置’1’-------中止发送请求:

CAN主控制寄存器:

>>CAN_MCR寄存器的TXFP位置’1’-------把发送邮箱配置为发送FIFO。

>>CAN_MCR寄存器的NART位置’1’-------禁止自动重传模式。

8 时间触发通信模式:

在该模式下,CAN硬件的内部定时器被激活,并且被用于产生(发送与接收邮箱的)时间戳(时间标记),分别存储在CAN_RDTxR/CAN_TDTxR寄存器(接收/发送该报文SOF的时刻,16位定时器的值)中。内部定时器在每个CAN位时间累加。

内部定时器在接收和发送的帧起始位的采样点位置被采样,并生成时间戳。

9 接收管理

接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文

>>CAN_RFR(CAN接收FIFO寄存器)的FMP[1:0]------- 报文数目

>>CAN_RFR寄存器的RFOM位设置’1’-------------释放邮箱

>>CAN_RFR寄存器的FOVR位进行置’1’----------表明溢出

>>CAN_RFR寄存器的FULL位就被置’1’-----------FIFO已满

接收中断CAN_IER-----中断使能寄存器

>>CAN_IER寄存器的FMPIE位为’1’-------产生接收中断请求(有报文)。

>>CAN_IER寄存器的FFIE位为’1’-----------产生满中断请求

>>CAN_IER寄存器的FOVIE位为’1’---------产生溢出中断请求。

10 标识符过滤

CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时根据标识符的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。为满足这一需求,在互联型产品中,bxCAN控制器为应用程序提供了28个位宽可变的、可配置过滤器组(27~0);在其它产品中,bxCAN控制器为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。

(1) CAN过滤器模式寄存器(CAN_FM1R)CAN_FiRx配合使用

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

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

0: 过滤器组x的2个32位寄存器工作在标识符屏蔽位模式;

1: 过滤器组x的2个32位寄存器工作在标识符列表模式。

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

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

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

(2) 过滤器位宽(CAN_FS1R):配置各个过滤器组的位宽-------实际上只有两种位宽:

0:过滤器位宽为2个16位

1:过滤器位宽为单个32位

>>2个16位:即16位与低16位为两个不同的过滤器

(3)CAN 过滤器FIFO关联寄存器(CAN_FFA1R):报文在通过了某过滤器的过滤后,将被存放到其关联的FIFO0FIFO1中。

(4) CAN 过滤器激活寄存器 (CAN_FA1R):在配置一个过滤器组前,必须通过清除CAN_FAR寄存器的FACT位,把它设置为禁用状态-----先禁用后配置

(5) CAN 过滤器组i的寄存器x(CAN_FiRx---包含32个过滤器位):互联产品中i=0..27,其它产品中i=0..13;x=1..2

>>只有在CAN_FAxR寄存器相应的FACTx位0,或CAN_FMR寄存器的FINIT位为1时,才能修改相应的过滤器寄存器。

>>标识符模式

寄存器的每位对应于所期望的标识符的相应位的电平。

0: 期望相应位为显性位;

1: 期望相应位为隐性位。

屏蔽位模式

寄存器的每位指示是否对应的标识符寄存器位一定要与期望的标识符的相应位一致。

0: 不关心,该位不用于比较;

1: 必须匹配,到来的标识符位必须与滤波器对应的标识符寄存器位相一致。

屏蔽位举例:(标准ID)                               

有效位数

STDID        0xE0F    x110 0000 1111          11

FilterID     0xF0F    x111 0000 1111          11

MaskID       0xDFFF    110 1111 1111 1        12

----关键是Std/FilterID都只有11位有效位,都需要移位;而MaskID不存在移位,因此在根据发送的ID确定MaskID时存在一位的位差;即StdID的最高位为无效MaskID需要右移一位与StdID对齐

>>CAN_FiR1始终为标示符寄存器,而CAN_FiR2与模式对应----可以为为标示符寄存器,也可以为屏蔽寄存器,因此标识符模式下有2个或4个(分别对应位宽为32和16)标示符寄存器。

----------过滤器组位宽设置图表如下:

图片3.jpg 

波特率设置

波特率最高可达1Mb/S

图片4.jpg 

PCLK:低速APB1时钟(PCLK1)时钟频率36MHz不超过36MHz

tPCLK = 1/PCLK1=1/36MHz 。

tBS1 0-15共16种可选值 。

tBS2 0-7共8种可选值 。

CAN_Prescaler- Prescaler分频)与BRP[9:0]对应-有1024种可选值 。

      1Mb/s的波特率:CAN_Prescaler = 4;tBS1 =3* tq; tBS2=5* tq

tq=4* tPCLK =1/(9M);位时间=(1+3+5)tq =1/(1M); 波特率 = 1Mbs。

--------------------stm32的can总线的过滤器总结----------------------

关键:必须对标识符进行相应的移位---过滤器中的16/32位数不仅包含ID还包含IDE和IDR

      CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式       CAN_InitStructure.CAN_ABOM=DISABLE;       CAN_InitStructure.CAN_AWUM=DISABLE;       CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)       CAN_InitStructure.CAN_RFLM=DISABLE;       CAN_InitStructure.CAN_TXFP=DISABLE;       CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;       //CAN_Mode_LoopBack       //CAN_Mode_Normal       CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;       CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;//1--16       CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//1--8       CAN_InitStructure.CAN_Prescaler=2;

      CAN_Init(&CAN_InitStructure);

       /* CAN filter init */       CAN_FilterInitStructure.CAN_FilterNumber=0;//选择过滤器0       CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器被设置为标识符屏蔽模式       CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//给出过滤器位宽为32位

下面根据设置的参数不同来决定can总线can总线的配置情况:

1、对扩展数据帧进行过滤:(只接收扩展数据帧)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF; (注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤) 2、对扩展远程帧过滤:(只接收扩展远程帧)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

3、对标准远程帧过滤:(只接收标准远程帧)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF; 4、对标准数据帧过滤:(只接收标准数据帧)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

5、对扩展帧进行过滤:(扩展帧不会被过滤掉)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC; 6、对标准帧进行过滤:(标准帧不会被过滤掉)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC; 注:slave_id为要过滤的id号。

 

---------------------MCP2515独立控制器-----------------------

图片5.jpg 

1  简介

MCP2515 是一款独立控制器局域网络(Controller Area Network, CAN)协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。MCP2515 自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCP2515与MCU 的连接是通过业界标准串行外设接口(SearialPeripheral Interface,SPI)来实现的。

2 数据发送:

>>器件有三个引脚----TX0RTS/TX1RTS/TX2RTS用来启动将装载在三个发送缓冲器之一中的报文立即发送出去。是否使用这些引脚由用户决定;若不使用,也可利用控制寄存器(通过SPI接口访问)来启动报文发送---------三个RTS引脚可以不用

>>报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过SPI接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作------常用SPI启动发送

---正常情况下,如果 CAN 报文仲裁失败或被错误帧损坏,报文会尝试次发送

3 数据接收:

>>器件上有一个多用途中断引脚及各接收缓冲器专用中断引脚,用于指示有效报文是否被接收并载入接收缓冲器。可选择使用专用中断引脚。通用中断引脚和状态寄存器(通过SPI接口访问)也可用来确定何时接收了有效报文------为了减少引脚的使用,先使用通用中断引脚检测中断的发生,再通过读状态寄存器判断是何种类型的中断。

>>通过读取相应的寄存器可以检查通讯状态和错误。会对在CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。

4  CAN报文帧

1)标准数据帧

CAN标准数据帧与其他所有帧一样,帧以起始帧 (SOF)位开始,SOF 为显性状态,允许所有节点的硬同步。

SOF之后是仲裁字段 12个位组成, 分别为11个标识位和一个远程发送请求(Remote TransmissionRequest, RTR)位。RTR 位用于区分报文是数据帧

RTR 位为显性状态)还是远程帧 RTR 位为隐性状态)。

仲裁字段之后是控制字段,由6个位组成。控制字段的第一位为标识扩展(Identifier Extension,IDE)位,该位应是显性状态来指定标准帧。标识扩展位的下一位为零保留位(RB0 CAN 协议将其定义为显性位。控制字段的其余 4位为数据长度Data Length Code,DLC),用来指定报文中包含的数据字节数 (0 到 8 字节) 。

控制字段之后为数据字段,包含要发送的任何数据字节。数据字段长度由上述 DLC 定义 (0到 8 字节)。

数据字段之后为循环冗余校验(CRC)字段,用来检测报文传输错误。CRC字段包含一个15位的CRC序列,之后是隐性的 CRC定界位。

最后一个字段是确认字段(ACK),由2 个位组成。在确认时隙(ACK Slot)位执行期间,发送节点发出一个隐性位。任何收到无错误帧的节点会发回一个显性位(无论该节点是否配置为接受该报文与否)来确认帧收到无误。确认字段以隐性确认定界符结束,该定界符可能不允许被改写为显性位。

最后是帧结尾-------每一个数据帧和远程帧均由一标志序列界定。这个标志序列由 7 个“隐性”位组成。

>>数据帧由 7 个不同的位场组成。

2)扩展数据帧

在扩展 CAN数据帧中(如图 2-2 所示),紧随SOF位的是 32 位的仲裁字段。仲裁字段的前 11 位为 29 位标识符的最高有效位(Most Significant bit,MSb (基本lD)。紧随这 11 位的是替代远程请求(SubstituteRemote Request,SRR)位,定义为隐性状态。SRR位之后是 IDE 位,该位为隐性状态时表示这是扩展CAN帧。

应该注意的是, 如果发送完扩展帧标识符的前11位后,总线仲裁无果,而此时其中一个等待仲裁的节点发出标准CAN数据帧(11 位标识符),那么,由于节点发出了显性 lDE 位而使标准 CAN 帧赢得总线仲裁。另外,扩展 CAN 帧的SRR位应为隐性,以允许正在发送标准CAN 远程帧的节点发出显性 RTR 位。

SRR和lDE位之后是标识符的其余18位(扩展lD 及一个远程发送请求位。

为使标准帧和扩展帧都能在共享网络上发送,应将29位扩展报文标识符拆成高11 位和低 18 位两部分。拆分后可确保lDE位在标准数据帧和扩展数据帧中的位置保持一致。

仲裁字段之后是6位控制字段。控制字段前两位为保留位,必须定义为显性位---与标准数据帧相同。其余4 位为DLC,用来指定报文中包含的数据字节数。

扩展数据帧的其他部分 (数据字段、CRC 字段、确认字段、帧结尾和间断)与标准数据帧的结构相同

3)远程帧----请求数据

通常,数据传输是由数据源节点(例如,传感器发出数据帧)自主完成的。但也可能存在目标节点向源节点请求发送数据的情况。要做到这一点,目标节点需发送一个远程帧,其中的标识符应与所需数据帧的标识符相匹配。随后,相应的数据源节点会发送一个数据帧以响应远程帧请求。

远程帧与数据帧存在两点不同

1)远程帧的 RTR 位为隐性状态;

2)远程帧没有数据字段。

当带有相同标识符的数据帧和远程帧同时发出时,数据帧将赢得仲裁,因为其标识符后面的 RTR 位为显性。这样,可使发送远程帧的节点立即收到所需数据。

>>远程帧由6个不同的位场组成---没有数据帧

帧起始、仲裁场、控制场、CRC 场、应答场、帧末尾。

4)错误帧

>>由两个位场组成。第一个场用作为不同站提供的错误标志(ERROR FLAG)的叠加。第二个场是错误界定符(含 8 个隐性位)

>>有两种形式的错误标志,主动错误标志(Active error flag)和被动错误标志(Passive error flag)。主动错误标志由 6个连续的“显性”位组成。被动错误标志由6个连续的“隐性”的位组成,除非被其他节点的“显性”位重写。

5)过载帧:

过载帧包括两个位场:过载标志和过载界定符。

有两种过载条件都会导致过载标志的传送:

1.  接收器的内部条件(此接收器对于下一数据帧或远程帧需要有一延时)。

2.  间歇场期间检测到一“显性”位。

由过载条件 1 而引发的过载帧只允许起始于所期望的间歇场的第一个位时间开始。而由过载条件 2 引发的过载帧应起始于所检测到“显性”位之后的位。通常为了延时下一个数据帧或远程帧,两个过载帧都会产生。

>>过载标志由6个显性位组成--------------所有形式和主动错误标志的一样

>>过载界定符包括8个隐性位----过载界定符的形式和错误界定符的形式一样

6)帧间间隔

帧间间隔将前一条帧(无论何种类型)与其后的数据帧或远程帧间隔开。帧间间隔至少 3 个隐性位构成,又称为间断。间断使节点在发送下一条报文之前有时间进行内部处理。在间断之后,CAN 总线将保持隐性状态--总线空闲,直至下一条报文开始发送。

5  位定时与波特率

CAN总线上的所有节点都必须具有相同的标称比特率

CAN协议采用不归零Non Return to Zero,NRZ)编码方式,在数据流中不对时钟信号进行编码。因此,接收时钟信号必须由接收节点恢复并与发送器的时钟同步

由于不同节点的振荡器频率和传输时间不同,接收器应具有某种能与数据传输边沿同步的锁相环Phase LockLoop,PLL)来同步时钟并保持这种同步。鉴于数据采用 NRZ 编码,有必要进行位填充以确保至少每 6 位时间发生一次边沿,使数字锁相环(Digital Phase LockLoop,DPLL)同步。

波特率

CAN 总线上的所有器件都必须使用相同的比特率。然而,并非所有器件都要求具有相同的主振荡器时钟频率。对于采用不同时钟频率的器件,应通过适当设置波

特率预分频比以及每一时间段中的时间份额的数量来对比特率进行调整。

求波特率过程:配置CNF1得到TQà配置CNF2/3得到tbità求倒数得到波特率

位时间

CAN位时间由互不重叠的时间段组成。 每个时间段又由时间份额(TQ)组成, CAN 规范中,标称比特率 NominalBit Rate,NBR)定义为在不需要再同步的情况下,理想发送器每秒发送的位数。

标称比特率NBR----图片6.jpg

标称位时间NBT----图片7.jpg时间段之和

TQ时间份额TQ = 2 x (BRP + 1)/FOSC

位时间各段如下:(与NBT四段对应)

图片8.jpg 

其中同步段固定1TQ,其他三段为可编程的。

------------------------

6  电气特性

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

图片9.jpg 

CAN技术标准

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

7  工作模式

>>利用CANCTRL. REQOP位可进行工作模式的选择

>>改变工作模式时,新的工作模式须等到所有当前报文发送完毕之后才生效 

>>必须通过读取CANSTAT.OPMODE位来验证新的工作模式。

1)配置模式:

MCP2515 在正常运行之前必须进行初始化。只有在配置模式下,才能对器件进行初始化。在上电或复位时,器件会自动进入配置模式, CANTRL.REQOP<2:0>设置成100”也可使器件从任何模式进入配置模式

2)休眠模式:

MCP2515 具有内部休眠模式,使器件功耗最少。即使MCP2515处于休眠模式,SPI接口仍然保持正常的读操作,以允许访问器件内的所有寄存器。

3)仅监听模式:

仅监听模式使MCP2515 可以接收包括错误报文在内的所有报文。这种模式可用于总线监视应用或热插拔状况下的波特率检测。

4)环回模式:

环回模式允许器件内部的发送缓冲器和接收缓冲器之间进行报文的自发自收,而无需通过 CAN 总线。此模式可用于系统开发和测试。

5)正常模式:

该模式为 MCP2515 的标准工作模式。器件处于此模式下,会主动监视总线上的所有报文,并产生确认位和错误帧等。只有在正常模式下,MCP2515才能在 CAN总线上进行报文的传输。

8  SPI指令集

---------通过SPI接口直接写指令即可,比如通过指令复位

图片10.jpg 

9  过滤器

图片11.jpg 

--------只有一种模式(即相当于STM32中的屏蔽位模式)。

--------过滤器与屏蔽器是配合使用的,不是单独使用的。

--------缓冲器+过滤器+屏蔽器à报文ID必须至少与一个过滤器匹配,即与过滤器中一些位(对应屏蔽器中为1的位)完全相同。

--------两个组合:

组合一:缓冲器1+屏蔽器1+过滤器1/2。

组合二:缓冲器2+屏蔽器2+过滤器3/4/5/6。

--------过滤器与缓冲器都是4Bytes,分别是SIDH/SIDL/EID8/EID0

10  中断

MCP2515有八个中断源CANINTE寄存器包含了使能各中断源的中断使能位。 CANINTF 寄存器包含了各中断源的中断标志位。当发生中断时, INT 引脚将被

MCP2515拉为低电平, 并保持低电平状态直至MCU清除中断。中断只有在引起相应中断的条件消失后,才会被清除。

建议在对 CANINTF 寄存器中的标志位进行复位操作时,采用位修改命令而不要使用一般的写操作。这是为了避免在写命令执行过程中无意间修改了标志位,进而导致中断丢失。应该注意的是,CANINTF中的中断标志位是可读写位因此在相关 CANINTE 中断使能位置 1 的前提下,对上述任一位置 1均可使 MCU产生中断请求。

----CANINTE使能CANINTF标志都是8位,并且各位是一一对应的。

11  寄存器简介

图片12.jpg 

(1) BFPCTRL---RXnBF引脚控制寄存器和状态寄存器---对应接收中断引脚;

TXRTSCTRL---TXnRTS引脚控制状态寄存器---对应发送请求引脚。

2)CANSTAT/CTRL----CAN状态和控制寄存器。

3)CANINTF/INTE----CAN中断标志和使能寄存器。

4)REC---接收错误计数器;TEC---发送错误计数器EFLG---错误标志寄存器。

REC---receive error counter;EFLG---error flag。

5)CNF1/2/3----配置寄存器----用于位定时/波特率配置。

6)TXBnCTRL----发送缓冲器n控制寄存器

7)RXBnCTRL----接收缓冲器n控制寄存器

12  MCP2515的SPI详解

(1) 模式MCP2515 设计可与许多单片机的串行外设接口(SPI)直接相连,支持 0,0 和 1,1 运行模式。外部数据和命令通过 SI引脚传送到器件中,且数据在 SCK时钟信号的上升沿传送进去。MCP2515 在SCK的下降沿通过 SO引脚传送出去。在进行任何操作时, CS 引脚都必须保持为低电平。

(2) CSCS 引脚被设置为低电平后,MCP2515希望收到的第一个字节是指令/命令字节。这意味着CS引脚必须先拉升为高电平然后再降为低电平以调用另外一个命令----有待验证(时序图与此不一致)。

注意:此处经过验证发现时序图是正确的文字描述不正确(可能是翻译的缘故),

结论

  一、看中文翻译的datasheet,以时序图为准,因为时序图是复制而来的。

二、查看P65的时序图可知---各个指令大多包含多个指令数据的读写,在整个读写过程中CS一直保持为低,直到完成整个指令CS才能变为1。

(3) 指令详解

>>复位指令:复位指令为单字节指令。应先将CS引脚0选中器件,随后发送命令字节,发送完毕之后再将CS引脚1。强烈建议将发送复位指令(或将RESET 引脚置为低电平)作为器件上电初始化过程中的一部分。

>>读指令

CS引脚置为低电平来启动读指令。随后向MCP2515依次发送读指令 8 位地址码 A7 至 A0)。在接收到读指令和地址码之后, MCP2515 会将指定地址寄存器中的数据通过 SO引脚移出。

每一数据字节移出后,器件内部的地址指针将自动加一以指向下一个地址。因此,通过持续提供时钟脉冲,可以对下一个连续地址寄存器进行读操作。通过该方法可以顺序读取任意个连续地址寄存器中的数据。通过拉高CS引脚电平可以结束读操作

>> RX 缓冲器指令

相比于读指令----读 RX缓冲器指令可以快速寻址要读取的接收缓冲器。该指令使 SPI开销减少了一个字节(地址字节)

---指令码为10010nm0ànm对应两个接收缓冲器---每个缓冲器对应一帧数据----一帧数据包含标准ID/扩展ID/DLC/数据(1-8Bytes)

>>写指令

CS引脚置为低电平来启动写操作。随后向MCP2515依次发送写指令、地址码和至少一个字节的数据(如果是多个数据,其地址是连续的)。

>>装载TX缓冲器指令

该指令取消了一般写命令所需要的8 位地址。该8位指令将地址指针设置为6个地址之一,以便快速地将数据写入发送缓冲器,该地址指向3个发送缓冲器之一的“ID”或 “数据”地址---每个缓冲器对应一帧数据----一帧数据包含标准ID/扩展ID/DLC/数据(1-8Bytes)

>>请求发送RTS)指令

使用RTS命令可以启动一个或多个发送缓冲器的报文发送。将CS引脚置为低电平来选中MCP2515。 之后向其发送RTS命令字节。该命令的3位显示了哪些发送缓冲器被使能发送。该命令将缓冲器对应的TxBnCTRL.TXREQ 位置1。用一条RTS命令即可对这三位中的一位或全部三位1。如果发送的RTS命令中nnn =000,将忽略该命令----三个n对应三个发送发送缓冲器

>>读状态指令

读状态指令允许单条指令访问常用的报文接收和发送状态位

>>RX状态指令

RX 状态指令用于快速确定与报文和报文类型(标准帧、扩展帧或远程帧)相匹配的滤波器。命令字节发送后,控制器会返回包含状态信息的 8 位数据。

>>位修改指令

位修改指令可对特定状态和控制寄存器中单独的位进行置1或清零。该命令并非所有寄存器有效。 MCP2515发送位修改命令字节。命令字节发送后,依次发送寄存器地址、屏蔽字节以及数据字节。屏蔽字节确定允许修改寄存器中的哪一位。屏蔽字节中的1”表示允许对寄存器中的相应位进行修改;而0”禁止修改。

13  初始化详解

(1) 复位:

MCP2515 有两种复位方式

1)硬件复位——RESET引脚为低电平。

2)SPI复位——通过 SPI命令复位---毕业设计采用指令复位

(2) 进入配置模式---初始化配置

1)在上电或复位时,器件会自动进入配置模式, 或通过CANTRL.REQOP

设置成100”也可使器件从任何模式进入配置模式。

2) 改变工作模式时,新的工作模式须等到所有当前报文发送完毕之后才生效。 必须通过读取CANSTAT.OPMODE位来验证新的工作模式。

3) 进入配置模式时,所有错误计数器都被清零只有在配置模式下,才能对以下寄存器进行修改:

 CNF1、 CNF2 和CNF3

 TXRTSCTRL

 验收过滤寄存器

 验收屏蔽寄存器

(3) 配置波特率

---具体看位定时和波特率的详解。

(4) 配置发送

1) TXnRTS引脚配置----配置用来禁用三个发送请求引脚。

其余的配置不需要在初始化时配置---发送时再配置也行

2) TXBnCTRL---配置报文发送请求优先级

3)标准ID和扩展ID配置---4个寄存器。

4)TXBnDLC----报文类型(数据帧或请求帧)和数据长度(DLC)配置。

5)发送缓冲器数据字节----(08个字节)。

(5) 配置接收

---配置RXB0CTRL——接收缓冲器 0/1控制寄存器

---配置BFPCTRL——RXnBF引脚控制寄存器和状态寄存器

---配置报文验收滤波器(RXFn)及屏蔽寄存器(RXMn---见上面详解。

(6) 配置中断

---CANINTF---中断标志位初始化时清零

---CANINTE---使能位(最常用的为使能接收中断)。

(7) 配置模式

---正常模式-------收发用;

---回环模式-------测试用;

14  MCP2515发送函数详解

---至少须将 TXBnSIDH、TXBnSIDL和 TXBnDLC 寄存器装载数据---包含ID、数据长度(字节数)和帧类型

---如果报文包含数据字节,还需要对 TXBnDm寄存器进行装载。

---若报文采用扩展标识符,对TXB-nEIDm寄存器进行装载,并将TXBnSIDL.EXIDE 位置1。

---在报文发送之前,MCU应对 CANINTE.TXInE位进行初始化,以便在报文发送时使能或禁止中断的产生。

15  MCP2515接收函数详解

---RXBnDLC---判断接收到的数据的字节数帧类型

---接收信息包含ID/扩展ID、帧类型、长度DLC和数据。

---RXB0CTRL---在初始化时进行配置即可。

16  MCP2515中断函数详解

---使能外中断

---使能CAN中断MCP2515有八个中断源)。

---初始化时对中断标志位清零

---ISR中读中断标志判断中断源,然后进行相应的操作。

图片13.jpg图片14.jpg

图片15.jpg

审核编辑(
王静
)
投诉建议

提交

查看更多评论
其他资讯

查看更多

三格电子智慧农业-温室大棚智能控制系统

LORA+4G无线组网方案

天津三格电子基于HART协议的应用

三格电子基于物联网云网关+云平台方案

485通信问题、解决方法及基本原理讲解