15.22、 CAN总线回环实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CAN总线回环实验
这一节我们将向大家介绍STM32的CAN总线的基本使用。

有了STM32,CAN总线将变得简单,俗话说“百闻不如一见”,应当再加上“百见不如一试”。

在本小节,我们初始化CAN总线,分别测试轮询模式和中断模式下的CAN总线环回,并通过神舟IV号的LED和串口等指示CAN环回的数据传送结果。

本节分为如下几个部分:
1 CAN总线回环实验的意义与作用
2 实验原理
3 软件设计
4 硬件设计
5 下载与验证
6 实验现象
z意义与作用
什么是CAN总线?
CAN,全称“Controller Area Network”,即控制器局域网,是国际上应用最广泛的工业级现场总线之一。

它是一种具有国际标准而且性能价格比又较高的现场总线,当今自动控制领域的发展中能发挥重要的作用。

最初CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。

比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。

CAN控制器局部网是BOSCH公司为现代汽车应用领先推出的一种多主机局部网,由于其卓越性能现已广泛应用于工业自动化、多种控制设备、交通工具、医疗仪器以及建筑、环境控制等众多部门。

在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。

近年来,其所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强和振动大的工业环境。

控制器局部网将在我国迅速普及推广。

由于CAN为愈来愈多不同领域采用和推广,导致要求各种应用领域通信报文的标准化。

为此,1991年9月 PHILIPS SEMICONDUCTORS制订并发布了 CAN技术规范(VERSION 2.0)。

该技术规范包括A和B两部分。

2.0A给出了曾在CAN技术规范版本1.2中定义的CAN报文格式,而2.0B给出了标准的和扩展的两种报文格式。

此后,1993年11月ISO正式颁布了道路交通运载工具--数字信息交换--高速通信控制器局部网(CAN)国际标准(ISO11898),为控制器局部网标准化、规范化推广铺平了道路。

CAN总线特点
CAN总线是一种串行数据通信协议,它是一种多主总线,通信介质可以是双绞线、同轴电缆或光导纤维。

通信速率可达1MBPS。

CAN总线通信接口中集成了CAN协议的物理层和数据链路层功能,可完成对通信数据的成帧处理,包括位填充、数据块编码、循环冗余检验、优先级判别等项工作。

CAN协议的一个最大特点是废除了传统的站地址编码,而代之以对通信数据块进行编码。

采用这种方法的优点可使网络内的节点个数在理论上不受限制,数据块的标识码可由
11位或29位二进制数组成,因此可以定义211或229个不同的数据块,这种按数据块编码的方式,还可使不同的节点同时接收到相同的数据,这一点在分布式控制系统中非常有用。

数据段长度最多为8个字节,可满足通常工业领域中控制命令、工作状态及测试数据的一般要求。

同时,8个字节不会占用总线时间过长,从而保证了通信的实时性。

CAN协议采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠性。

CAN卓越的特性、极高的可靠性和独特的设计,特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。

另外,CAN总线采用了多主竞争式总线结构,具有多主站运行和分散仲裁的串行总线以及广播通信的特点。

CAN总线上任意节点可在任意时刻主动地向网络上其它节点发送信息而不分主次,因此可在各节点之间实现自由通信。

CAN总线协议已被国际标准化组织认证,技术比较成熟,控制的芯片已经商品化,性价比高,特别适用于分布式测控系统之间的数通讯。

CAN总线插卡可以任意插在PC AT XT兼容机上,方便地构成分布式监控系统。

3. CAN总线技术介绍
3.1位仲裁
要对数据进行实时处理,就必须将数据快速传送,这就要求数据的物理传输通路有较高的速度。

在几个站同时需要发送数据时,要求快速地进行总线分配。

实时处理通过网络交换的紧急数据有较大的不同。

一个快速变化的物理量,如汽车引擎负载,将比类似汽车引擎温度这样相对变化较慢的物理量更频繁地传送数据并要求更短的延时。

CAN总线以报文为单位进行数据传送,报文的优先级结合在11位标识符中,具有最低二进制数的标识符有最高的优先级。

这种优先级一旦在系统设计时被确立后就不能再被更改。

总线读取中的冲突可通过位仲裁解决。

当几个站同时发送报文时,站1的报文标识符为011111;站2的报文标识符为0100110;站3的报文标识符为0100111。

所有标识符都有相同的两位01,直到第3位进行比较时,站1的报文被丢掉,因为它的第3位为高,而其它两个站的报文第3位为低。

站2和站3报文的4、5、6位相同,直到第7位时,站3的报文才被丢失。

注意,总线中的信号持续跟踪最后获得总线读取权的站的报文。

在此例中,站2的报文被跟踪。

这种非破坏性位仲裁方法的优点在于,在网络最终确定哪一个站的报文被传送以前,报文的起始部分已经在网络上传送了。

所有未获得总线读取权的站都成为具有最高优先权报文的接收站,并且不会在总线再次空闲前发送报文。

CAN具有较高的效率是因为总线仅仅被那些请求总线悬而未决的站利用,这些请求是根据报文在整个系统中的重要性按顺序处理的。

这种方法在网络负载较重时有很多优点,因为总线读取的优先级已被按顺序放在每个报文中了,这可以保证在实时系统中较低的个体隐伏时间。

对于主站的可靠性,由于CAN协议执行非集中化总线控制,所有主要通信,包括总线读取(许可)控制,在系统中分几次完成。

这是实现有较高可靠性的通信系统的唯一方法。

3.2 CAN与其它通信方案的比较
在实践中,有两种重要的总线分配方法:按时间表分配和按需要分配。

在第一种方法中,不管每个节点是否申请总线,都对每个节点按最大期间分配。

由此,总线可被分配给每个站并且是唯一的站,而不论其是立即进行总线存取或在一特定时间进行总线存取。

这将保证在总线存取时有明确的总线分配。

在第二种方法中,总线按传送数据的基本要求分配给一个站,总线系统按站希望的传送分配(如:Ethernet CSMA/CD)。

因此,当多个站同时请求总线存取时,
总线将终止所有站的请求,这时将不会有任何一个站获得总线分配。

为了分配总线,多于一个总线存取是必要的。

CAN实现总线分配的方法,可保证当不同的站申请总线存取时,明确地进行总线分配。

这种位仲裁的方法可以解决当两个站同时发送数据时产生的碰撞问题。

不同于Ethernet网络的消息仲裁,CAN的非破坏性解决总线存取冲突的方法,确保在不传送有用消息时总线不被占用。

甚至当总线在重负载情况下,以消息内容为优先的总线存取也被证明是一种有效的系统。

虽然总线的传输能力不足,所有未解决的传输请求都按重要性顺序来处理。

在CSMA/CD这样的网络中,如Ethernet,系统往往由于过载而崩溃,而这种情况在CAN中不会发生。

3.3 CAN的报文格式
在总线中传送的报文,每帧由7部分组成。

CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位,扩展格式为29位。

在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位(RTR)组成的仲裁场。

RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。

控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。

它还包括一个保留位(ro),为将来扩展使用。

它的最后四个字节用来指明数据场中数据的长度(DLC)。

数据场范围为0~8个字节,其后有一个检测数据错误的循环冗余检查(CRC)。

应答场(ACK)包括应答位和应答分隔符。

发送站发送的这两位均为隐性电平(逻辑1),这时正确接收报文的接收站发送主控电平(逻辑0)覆盖它。

用这种方法,发送站可以保证网络中至少有一个站能正确接收到报文。

报文的尾部由帧结束标出。

在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。

3.4 数据错误检测
不同于其它总线,CAN协议不能使用应答信息。

事实上,它可以将发生的任何错误用信号发出。

CAN协议可使用五种检查错误的方法,其中前三种为基于报文内容检查。

3.4.1 循环冗余检查(CRC)
在一帧报文中加入冗余检查位可保证报文正确。

接收站通过CRC可判断报文是否有错。

3.4.2 帧检查
这种方法通过位场检查帧的格式和大小来确定报文的正确性,用于检查格式上的错误。

3.4.3.应答错误
如前所述,被接收到的帧由接收站通过明确的应答来确认。

如果发送站未收到应答,那么表明接收站发现帧中有错误,也就是说,ACK场已损坏或网络中的报文无站接收。

CAN协议也可通过位检查的方法探测错误。

3.4.4 总线检测
有时,CAN中的一个节点可监测自己发出的信号。

因此,发送报文的站可以观测总线电平并探测发送位和接收位的差异。

3.4.5 位填充
一帧报文中的每一位都由不归零码表示,可保证位编码的最大效率。

然而,如果在一帧报文中有太多相同电平的位,就有可能失去同步。

为保证同步,同步沿用位填充产生。

在五个生。

在五个连续相等位后,发送站自动插入一个与之互补的补码位;接收时,这个填充位被自动丢掉。

例如,五个连续的低电平位后,CAN自动插入一个高电平位。

CAN通过这种编码规则检查错误,如果在一帧报文中有6个相同位,CAN就知道发生了错误。

如果至少有一个站通过以上方法探测到一个或多个错误,它将发送出错标志终止当前的发送。

这可以阻止其它站接收错误的报文,并保证网络上报文的一致性。

当大量发送数据被终止后,发送站会自动地重新发送数据。

作为规则,在探测到错误后23个位周期内重新开始发送。

在特殊场合,系统的恢复时间为31个位周期。

但这种方法存在一个问题,即一个发生错误的站将导致所有数据被终止,其中也包括正确的数据。

因此,如果不采取自监测措施,总线系统应采用模块化设计。

为此,CAN协议提供一种将偶然错误从永久错误和局部站失败中区别出来的办法。

这种方法可以通过对出错站统计评估来确定一个站本身的错误并进入一种不会对其它站产生不良影响的运行方法来实现,即站可以通过关闭自己来阻止正常数据因被错误地当成不正确的数据而被终止。

3.4.6 CAN可靠性
为防止汽车在使用寿命期内由于数据交换错误而对司机造成危险,汽车的安全系统要求数据传输具有较高的安全性。

如果数据传输的可靠性足够高,或者残留下来的数据错误足够低的话,这一目标不难实现。

从总线系统数据的角度看,可靠性可以理解为,对传输过程产生的数据错误的识别能力。

残余数据错误的概率可以通过对数据传输可靠性的统计测量获得。

它描述了传送数据被破坏和这种破坏不能被探测出来的概率。

残余数据错误概率必须非常小,使其在系统整个寿命周期内,按平均统计时几乎检测不到。

计算残余错误概率要求能够对数据错误进行分类,并且数据传输路径可由一模型描述。

如果要确定CAN的残余错误概率,我们可将残留错误的概率作为具有80~90位的报文传送时位错误概率的函数,并假定这个系统中有5~10个站,并且错误率为1/1000,那么最大位错误概率为10—13数量级。

例如,CAN网络的数据传输率最大为1Mbps,如果数据传输能力仅使用50%,那么对于一个工作寿命4000小时、平均报文长度为 80位的系统,所传送的数据总量为9×1010。

在系统运行寿命期内,不可检测的传输错误的统计平均小于10—2量级。

换句话说,一个系统按每年365天,每天工作8小时,每秒错误率为0. 7计算,那么按统计平均,每1000年才会发生一个不可检测的错误。

4.应用举例
某医院现有5台16T/H德国菲斯曼燃气锅炉,向洗衣房、制剂室、供应室、生活用水、暖气等设施提供5kg/cm2的蒸汽,全年耗用天然气1200万m3,耗用20万吨自来水。

医院采用接力式方式供热,对热网进行地域性管理,分四大供热区。

其中冬季暖气的用气量很大,据此设计了基于CAN现场总线的分布式锅炉蒸汽热网智能监控系统。

现场应用表明:该楼宇自动化系统具有抗干扰能力强,现场组态容易,网络化程度高,人机界面友好等特点。

CAN总线典型特征
CAN总线有如下基本特点
◎废除传统的站地址编码,代之以对通信数据块进行编码,可以多主方式工作;
◎采用非破坏性仲裁技术,当两个节点同时向网络上传送数据时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响继续传输数据,有效避免了总线冲突;
◎采用短帧结构,每一帧的有效字节数为8个,数据传输时间短,受干扰的概率低,重新发送的时间短;
◎每帧数据都有CRC校验及其他检错措施,保证了数据传输的高可靠性,适于在高干扰环境下使用;
◎节点在错误严重的情况下,具有自动关闭总线的功能,切断它与总线的联系,以使总线上其他操作不受影响;
◎可以点对点,一对多及广播集中方式传送和接受数据。

CAN总线的优点
●具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点;
●采用双线串行通信方式,检错能力强,可在高噪声干扰环境中工作;
●具有优先权和仲裁功能,多个控制模块通过CAN 控制器挂到CAN-bus 上,形成多主机局部网络;
●可根据报文的ID决定接收或屏蔽该报文;
●可靠的错误处理和检错机制;
●发送的信息遭到破坏后,可自动重发;
●节点在错误严重的情况下具有自动退出总线的功能;
●报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息。

STM32处理器的CAN总线,支持CAN协议2.0A和2.0B。

具有以下特点: 支持CAN协议2.0A和2.0B主动模式
波特率最高可达1兆位/秒
支持时间触发通信功能
发送
3个发送邮箱
发送报文的优先级特性可软件配置
记录发送SOF时刻的时间戳
接收
3级深度的2个接收FIFO
14个位宽可变的过滤器组-由整个CAN共享标识符列表
FIFO溢出处理方式可配置
记录接收SOF时刻的时间戳
可支持时间触发通信模式
禁止自动重传模式
16位自由运行定时器
定时器分辨率可配置
可在最后2个数据字节发送时间戳
管理
中断可屏蔽
邮箱占用单独1块地址空间,便于提高软件效率
STM32的CAN一共有3个主要的工作模式,分别是初始化、正常和睡眠模式。

初始化模式
软件通过对CAN_MCR寄存器的INRQ位置1,来请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR寄存器的INAK位置1来进行确认软件通过对CAN_MCR寄存器的INRQ位清0,来请求bxCAN退出初始化模式,当硬件对CAN_MSR寄存器的INAK位清0就确认了初始化模式的退出。

当bxCAN处于初始化模式时,报文的接收和发送都被禁止,并且CANTX引脚输出隐性位(高电平)。

正常模式
在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。

软件可以通过对CAN_MCR寄存器的INRQ位清0,来请求从初始化模式进入正常模式,然后要等待硬件对CAN_MSR寄存器的INAK位置1的确认。

在跟CAN总线取得同步,即在CANRX引脚上监测到11个连续的隐性位(等效于总线空闲)后,bxCAN才能正常接收和发送报文。

睡眠模式(低功耗)
软件通过对CAN_MCR寄存器的SLEEP位置1,来请求进入这一模式。

在该模式下,bxCAN的时钟停止了,但软件仍然可以访问邮箱寄存器。

当bxCAN处于睡眠模式,软件想通过对CAN_MCR寄存器的INRQ位置1,来进入初始化式,那么软件必须同时对SLEEP位清0才行。

有2种方式可以唤醒(退出睡眠模式)bxCAN:通过软件对SLEEP位清0,或硬件检测CAN总线的活动。

z实验原理
CAN发送报文介绍
应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR 寄存器的TXRQ位置1,来请求发送。

TXRQ位置1后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。

TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。

一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。

一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。

一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。

如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置1,由于发送错误引起的,就对TERR位置1。

发送的优先级可以由标识符和发送请求次序决定:
由标识符决定
当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。

根据CAN协议,标识符数值最低的报文具有最高的优先级。

如果标识符的值相等,那么邮箱号小的报文先被发送。

由发送请求次序决定
通过对CAN_MCR寄存器的TXFP位置1,可以把发送邮箱配置为发送FIFO。

在该模式下,发送的优先级由发送请求次序决定。

该模式对分段发送很有用。

CAN接收报文介绍
接收到的报文,被存储在3级邮箱深度的FIFO中。

FIFO完全由硬件来管理,从而节省了CPU
的处理负荷,简化了软件并保证了数据的一致性。

应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。

根据CAN协议,当报文被正确接收(直到EOF域的最后1位都没有错误),且通过了标识符过滤,那么该报文被认为是有效报文。

接收相关的中断条件
z一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为1,那么就会产生一个中断请求。

z当FIFO变满时(即第3个报文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果CAN_IER寄存器的FFIE位为1,那么就会产生一个满中断请求。

z在溢出的情况下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位为1,那么就会产生一个溢出中断请求
标识符过滤
在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。

因此,发送者以广播的形式把报文发送给所有的接收者。

(注:不是一对一通信,而是多机通信)
节点在接收报文时-根据标识符的值-决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。

为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组
(13~0),以便只接收那些软件需要的报文。

硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。

每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

过滤器的模式的设置
z通过设置CAN_FM0R的FBMx位,可以配置过滤器组为标识符列表模式或屏蔽位模式。

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

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

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

过滤器优先级规则
z位宽为32位的过滤器,优先级高于位宽为16位的过滤器
z对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式
z位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高
上面的例子说明了bxCAN的过滤器规则:在接收一个报文时,其标识符首先与配置在标识符列表模式下的过滤器相比较;如果匹配上,报文就被存放到相关联的FIFO中,并且
所匹配的过滤器的序号被存入过滤器匹配序号中。

如同例子中所显示,报文标识符跟#4标识符匹配,因此报文内容和FMI4被存入FIFO。

如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。

如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。

接收邮箱(FIFO)
在接收到一个报文后,软件就可以访问接收FIFO的输出邮箱来读取它。

一旦软件处理了报文(如把它读出来),软件就应该对CAN_RFxR寄存器的RFOM位进行置1,来释放该报文,以便为后面收到的报文留出存储空间。

中断
bxCAN占用4个专用的中断向量。

通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以单独允许和禁用。

发送中断可由下列事件产生:
─发送邮箱0变为空,CAN_TSR寄存器的RQCP0位被置1。

─发送邮箱1变为空,CAN_TSR寄存器的RQCP1位被置1。

─发送邮箱2变为空,CAN_TSR寄存器的RQCP2位被置1。

FIFO0中断可由下列事件产生:
─ FIFO0接收到一个新报文,CAN_RF0R寄存器的FMP0位不再是‘00’。

─ FIFO0变为满的情况,CAN_RF0R寄存器的FULL0位被置1。

─ FIFO0发生溢出的情况,CAN_RF0R寄存器的FOVR0位被置1。

FIFO1中断可由下列事件产生:
─ FIFO1接收到一个新报文,CAN_RF1R寄存器的FMP1位不再是‘00’。

─ FIFO1变为满的情况,CAN_RF1R寄存器的FULL1位被置1。

─ FIFO1发生溢出的情况,CAN_RF1R寄存器的FOVR1位被置1。

错误和状态变化中断可由下列事件产生:
─出错情况,关于出错情况的详细信息请参考CAN错误状态寄存器(CAN_ESR)。

─唤醒情况,在CAN接收引脚上监视到帧起始位(SOF)。

─ CAN进入睡眠模式。

波特率设定
CAN总线通信的难点在于波特率的设定,当然如果是近距离通信,只有几十米那就可以忽略了,如果几公里波特率位序时序都需要好好计算不然通信是不成功的。

CAN控制器器只需要进行少量的设置就可以进行通信,就可以像RS232/485那样使用。

其中较难设置的部分就是通信波特率的计算。

CAN总线能够在一定的范围内容忍总线上CAN 节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。

实际上,CAN总线的波特率是一个范围。

假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置),简单介绍一个波特率的计算,在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间段包括:
A.位同步时间(Tsync)。

相关文档
最新文档