第10章 K60的CAN总线开发方法

更新时间:2024-01-19 05:40:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第10章 K60的CAN总线开发方法

本章导读:CAN总线是一种应用广泛的串行通信协议之一,主要应用于对数据完整性有严格需求的汽车电子和工业控制领域。由于CAN总线具有差分接收与发送的特点,使其在抗干扰以及错误检测等方面的性能大大提高,成为了诸多工业测控领域中首选的现场总线。本章主要知识点有①CAN总线的通用知识;②CAN 总线基本的硬件连接与技术特点;③Kinetis系列中K60的FlexCAN模块介绍与编程要点;④FlexCAN驱动构件设计与实现;⑤CAN驱动构件测试实例,包括回环测试和非回环测试。

10.1 CAN总线基础知识

10. 1. 1 CAN总线协议的历史概况

控制器局域网(Controller Area Network, CAN),最早出现于20世纪80年代末,是德国Bosch公司为简化汽车电子中信号传输方式并减少日益增加的信号线而提出的。CAN总线是一个单一的网络总线,所有的外围器件都可以挂接在该总线上。1991年9月Bosch公司制定并发布了CAN技术规范Version2.0。该技术规范包括A和B两部分,A部分给出了曾在CAN技术规范Version1.2中定义的CAN报文格式,而B部分给出了标准的和扩展的两种报文格式。为促进CAN技术的发展,1992年在欧洲成立了CiA (CAN in Automation)。在CiA的努力推广下,CAN技术在汽车电子、电梯控制、安全监控、医疗仪器、船舶运输等方面均得到了广泛的应用,目前已经成为国际上应用最广泛的现场总线之一。

在CAN技术未得到广泛应用之前,在测控领域的通信方式选择中,大多数设计者采用RS-485作为通信总线。但RS-485存在明显的缺点:一主多从、无冗余; 数据通信为命令响应,传输率低;错误处理能力弱。而CAN总线技术可以克服这些缺点。CAN网络上的任何一个节点均可作为主节点主动地与其他节点交换数据;CAN网络节点的信息帧可以分出优先级,这为有实时性要求的控制提供了方便;CAN的物理层及数据链路层有独特的设计技术,使其在抗干扰以及错误检测等方面的性能大大提高。CAN的上述特点使其成为诸多工业测控领域中首选的现场总线。

10. 1. 2 CAN硬件系统的典型电路

由于CAN控制器只是协议控制器,不能提供物理层驱动,所以在实际使用时每一个CAN节点物理上要通过一个收发器与CAN总线相连。每个CAN模块有发送CANTX和接收CANRX两个引脚。CANTX发送串行数据到CAN总线收发器,同时CANRX从 CAN总线收发器接收串行数据。常用的CAN收发器有Philips公司的PCA82C250、TI公司的SN65HVD230等。

1. 最简明的CAN硬件连接方法

最简明的CAN硬件连接方法如图10-1,把所有的CANTX线路经过快速二极管(如1N4148等)连接至数据线(以免输出引脚短路),CANRX输入直接连接到这条数据线,数据线由一个上拉电阻拉至+5V,以产生所需要的“1”电平。注意,该电路中各节点的地是接在一起的。这个电路最大线长限制在1 m左右,主要用于在电磁干扰较弱环境下的近距离通信。

图10-1 无须CAN收发器芯片的电路连接

进行CAN通信节点调试时,可以利用这个简单且易于实现的电路。另外,可以利用该电路理解CAN总线的通信机制。

2. 常用的CAN硬件系统的组成

常用的CAN硬件系统的组成如图10-2所示。

图10-2 常用的CAN硬件系统组成

注意:CAN通信节点上一般需要添加120Ω终端电阻。每个CAN总线只需要两个终端电阻,分别在主干线的两个端点,支线上的节点不必添加。下面给出图10-2的实际电路。

3. 带隔离的典型CAN硬件系统电路

Philips公司的CAN总线收发器PCA82C250能对CAN总线提供差动发送功能并对CAN控制器提供差动接收功能。在实际应用过程中,为了提高系统的抗干扰能力,CAN控制器引脚CANTX、CANRX和收发器PCA82C250并不是直接相连的,而是通过由高速光耦合器6N137构成的隔离电路后再与PCA82C250相连的,这样可以很好地实现总线上各节点的电气隔离。一个带隔离的典型CAN硬件系统电路如图10-3所示。

图10-3 带隔离的典型CAN硬件系统电路

该电路连接需要特别注意以下几个问题。

(1) 6N137部分的电路所采用的两个电源VCC1和VCC2需完全隔离,否则,光耦将达不到完全隔离的效果。可以采用带多个5V输出的开关电源模块实现。

(2) PCA82C250的CANH和CANL引脚通过一个5Ω的限流电阻与CAN总线相连,保护PCA82C250免受过流的冲击。PCA82C250的电源管脚旁应有一个0.1μF的去耦电容。Rs引脚为斜率电阻输入引脚,用于选择PCA82C250的工作模式(高速/斜率控制/待机),脚上接有一个下拉电阻,电阻的大小可根据总线速率适当的调整,其值一般在16?140 kΩ之间,图10-3中选用47 kΩ。关于电路相连的更多细节请参见6N137手册以及PCA82C250手册。

4. 不带隔离的典型CAN硬件系统电路

在电磁干扰较弱的环境下,隔离电路可以省略,这样CAN控制器可直接与CAN 收发器相连,如图10-4所示,图中所使用的CAN收发器为TI公司的SN65HVD230。

图10-4 不带隔离的典型CAN硬件系统电路

10. 1. 3 CAN总线的有关基本概念

CAN通信协议主要描述设备之间的信息传递方式。CAN各层的定义与开放系统互连模型(0SI)—致,每一层与另一设备上相同的那一层通信。实际的通信发生在每一设备上相邻的两层,而设备只通过物理层的物理介质互连。在CAN规范的ISO参考模型中,定义了模型的最下面两层:数据链路层和物理层,它们是设计CAN应用系统的基本依据。规范主要是针对CAN控制器的设计者而言,对于大多数应用开发者来说,只需对CAN V2.0版技术规

范的基本结构、概念、规则有一般了解,知道一些基本参数和可访问的硬件即可。下面给出与CAN通信接口编程相关的部分术语。

1. CAN总线上的数据表示

CAN总线由单一通道(Single Channel)组成,借助数据再同步实现信息传输。CAN技术规范中没有规定物理通道的具体实现方法,物理层可以是单线(加地线)、两条差分线、光纤等。实际上大多数使用双绞线,利用差分方法进行信号表达,它是一种半双工通信方式。

CAN总线上用显性(Dominant)和隐性(Recessive)分别表示逻辑0和逻辑1。若不同控制器同时向总线发送逻辑0和逻辑1时,总线上出现逻辑0(相当于逻辑与的关系)。物理上,现行的CAN总线大多使用二线制作为物理传输介质,使用差分电压表达逻辑0和逻辑1。设两条信号线分别被称为CAN_H和CAN_L,如图10-5所示。在隐性状态(即逻辑1)时,VCAN_H和VCAN_L被固定在平均电压2.5V左右,电压差(Vdiff=VCAN_H - VCAN_L)近似于0。在显性状态(即逻辑0)时,VCAN_H比 VCAN_L髙,此时通常VCAN_H=3. 5V,VCAN_L =1.5V,电压差(Vdiff=VCAN_H - VCAN_L)在2V左右。在总线空闲或隐性位期间,发送隐性位。

图10-5 总线数据表示

2. 报文、信息路由、位速率、位填充

报文(Message): 是指在总线上传输的固定格式的信息,其长度是有限制的。当总线空闲时,总线上任何节点都可以发送新报文。报文被封装成帧(Frame)的形式在总线上传送,具体定义见10. 1.4节。 信息路由(Information Routing):在CAN系统中,CAN不对通信节点分配地址,报文的寻址内容由报文的标识符ID指定。总线上所有节点可以通过报文过滤的方法来判断是否接收报文。

位速率(Bit Rate):是指CAN总线的传输速率。在给定的CAN系统中,位速率是固定唯一的。CAN总线上任意两个节点之间的最大传输距离与位速率有关,表10-1列出了距离与位速率的对应关系,这里的最大距离是指在不使用中继器的情况下两个节点之间的距离。

表10-1 CAN总线上任意两节点最大距离及位速率对应表

位填充(Bit Stuffing):是为防止突发错误而设定的功能。当同样的电平持续5位时,则添加一个位的反型数据,即连续出现5个“0”时,需要添加一个“1”。连续出现5个“1”时,需要添加一个“0”。

3. 多主机、标识符、优先权、仲栽

多主机(Multimaster): CAN总线是一个多主机(Multimaster)系统,总线空闲时,总线上任何节点都可以开始向总线上传送报文,但只有最高优先权报文的节点可获得总线访问权。CAN通信链路是一条可连接多节点的总线。理论上,总线上节点数目是无限制的,实际上,节点数受限于延迟时间和总线的电气负载能力。例如,当使用Philips PCA82C250作为CAN收发器时,同一网络中一般最多允许挂接110个节点。

标识符ID: CAN节点的唯一标识。在实际应用时,应该给CAN总线上的每个节点按照一定规则分配一个唯一的ID。每个节点发送数据时,发送的报文帧中含有发送节点的ID信息。 在CAN通信网络中,CAN报文以广播方式在CAN网络上发送,所有节点都可以接收到报文,节点通过判断接收到的标识符ID决定是否接收该报文。报文标识符 ID的分配规则一般在CAN应用层协议实现(比较著名的CAN应用层协议为CANopen 协议、DeviceNet等)。由于ID决定报文发送的优先权,因此ID的分配规则在实际应用中必须给予重视。一般可以用标识符的某几位代表发送节点的地址。接收到报文的节点可以通过解析接收报文的标识符ID,来判断该报文来自哪个节点,属于何种类型的报文等。下面给出CANopen协议最小系统配置的一个ID分配方案,供实际应用时参考。

该分配方案是一个面向设备的标识符分配方案,该方案通过4位功能代码区分16种不同类型的报文,有7位节点地址,可表达128个节点。但要注意:在CAN 协议中,要求ID的高7位不能同时为1。报文标识符ID的分配方法应遵循以下原则:在同一系统中,必须保证节点地址唯一,这样每个报文的ID也就唯一了。

优先权(Priorities): 在总线访问期间,报文的标识符ID定义了一个静态的报文优先权。在CAN总线上发送的每一个报文都具有唯一的一个11位或29位的标识符ID,在总线仲裁时,显性位(逻辑0)的优先权高于隐性位(逻辑1),从 而标识符越小,该报文拥有越高的优先权,因此一个拥有全0标识符的报文具有总线上的最高级优先权。当有两个节点同时进行发送时,必须通过“无损的逐位仲裁”方法来使得有最高优先权的报文优先发送。

仲裁(Arbitration): 总线空闲时,总线上任何节点都可以开始发送报文,若同时有两个或两个以上节点开始发送,总线访问冲突运用逐位仲裁规则,借助于标识符ID解决。仲裁期间,每一个发送器都对发送位电平与总线上检测到的电平进行比较,若相同,则该节点继续发送。当发送的是一个“1”而监视到的是一个“0”(见图10-1)时,该节点失去仲裁,退出发送状态。举例说明,若某一时刻有两个CAN节点A、B同时向总线发送报文,A发送报文的ID为0b00010000000,B发送报文的ID为0b01110000000。由于节点A、B的ID的第10位都为“0”,而CAN总线是逻辑与的,因此总线状态为“0”,此时两个节点检测到总线位和它们发送的位相同,因此两个节点都认为是发送成功,都继续发送下一位。发送第9位时, A发送一个“0”,而B发送一个“1”,此时总线状态为“0”。此时A检测到总线状态“0”与其发送位相同,因此A认为它发送成功,并开始发送下一位。但此时B 检测到总线状态“0”与其发送位不同,它会退出发送状态并转为监听方式,且直到A发送完毕,总线再次空闲时,它才试图重发报文。

4. 远程数据请求、应答 远程数据请求(Remote Data Request):当总线上某节点需要请求另一节点发送数据时,在这种情况下,在CAN总线协议术语中叫远程数据请求(Remote Data Request)。需要远程数据请求时,可通过发送远程帧实现,有关帧内容见 10. 1.4节。

应答(Acknowledgment): 所有接收器对接收到的报文进行一致性(Consistency)检查。对于一致的报文,接收器给予应答;对于不一致的报文,接收器做出标志。

5. 故障界定、错误标定和恢复时间 故障界定(Fault Confinement): CAN节点能够把永久故障和短暂的干扰区别开来,故障节点会被关闭。

错误标定和恢复时间(Error Signaling and Recovery Time):任何检测到错误的节点会标志出已被损坏的报文。此报文会失效并自动重传。若不再出现错误,则从检测出错误到下一报文传送开始为止,恢复时间最多为31位的时间。

6. CAN的分层结构

CAN遵从IS0/0SI标准模型。按照该模型,CAN结构划分为两层:物理层和数据链路层。在CAN技术规范2.0B版本中,数据链路层中的逻辑链路控制子层和介质访问控制子层分别对应于2.0A版本中的“对象层”和“传输层”。

物理层(Physical Layer):CAN规范没有定义具体的物理层,允许用户根据具体需要定制物理层。物理层给出实际信号的传输方法,作用是在不同节点之间根据所有的电气属性进行位信息的实际传输。当然,在同一网络内,物理层对于所有的节点必须是相同的。尽管如此,在选择物理层实现方式还是很自由的。

数据链路层又分为逻辑链路控制子层和介质访问控制子层。 逻辑链路控制子层(Logic Link Control, LLC):负责报文过滤、过载通知和恢复管理。 介质访问控制子层(Media Access Control, MAC) : MAC是CAN协议的核心。它把接收到的报文提供给LLC以及接收来自LLC的报文。MAC负责位定时及同步、报文分帧、仲裁、应答、错误标定、故障界定等。 10.1.4 帧结构

CAN总线协议中有四种报文帧(Message Frame),它们分别是数据帧、远程帧、错误帧、过载帧。其中数据帧和远程帧与用户编程相关,错误帧和过载帧由CAN控制硬件处理,与用户编程无关。

1. 数据帧

在CAN节点之间的通信中,要将数据从一个节点发送器传输到另一个节点的接收器,必须发送数据帧。数据帧由7个不同的位场组成:帧起始(Start Of Frame Symbol, SOF)、仲裁场、控制场、数据场、CRC场、应答场、帧结束(End Of Frame, EOF))。数据帧组成如图10-6所示。

图10-6 数据帧组成

帧起始S0F: 标志数据帧和远程帧的起始,仅由一个单独的“0”位组成。只有在总线空闲时,才允许节点开始发送报文。只要有一个节点发送帧起始S0F, 其他节点检测到该信号,与之同步。

仲裁场:在CAN2.0B中定义标准帧与扩展帧两种帧格式。标准帧的标识符ID为11位,扩展帧的标识符ID为29位(11位标准ID+18位扩展ID)。

标准帧的仲裁场由11位标准ID和1位远程请求发送位(Remote Transmission Request, RTR)组成(见图10-7)。在数据帧里RTR=0,在远程帧里RTR=1。实际发送顺序是从ID10

到ID0。标准ID的高7位(ID10?ID4)不能全是1。

图10-7 数据帧标准格式中的仲裁场结构

扩展帧的仲裁场由11位标准ID、1位远程发送请求替代位(Substitute Remote Request, SRR)、1 位标识符扩展位(ID Extended bit, IDE)、18位扩展ID、1位远程请求发送位RTR组成,如图10-8所示。在标准格式中IDE=0,而扩展格式中IDE=1。扩展帧中“远程发送请求替代位”SRR位的实际位置是标准帧中RTR位的位置。当标准帧与扩展帧发生冲突且扩展帧的基本ID同标准帧的标识符一样时,标准帧优先于扩展帧。

图10-8 数据帧扩展格式中的仲裁场结构

6位控制场:标准帧中控制场包括:数据长度代码DLC、IDE位(为0)、保留位r0。扩展帧的控制场包括:数据长度代码DLC、两个必须为0的保留位rl和r0。

4位数据长度代码DLC: 指示了数据场中字节数,DLC=0000?1000(即十进制的0?80000代表空)表示数据场中字节数。若设置DLC大于8,则无效。

数据场:数据场为实际要发送的数据。字节数由DLC决定,在发送一个字节时,先发高位MSB,最后发低位LSB。

数据场之后跟随16位CRC场(15位CRC校验位、1位固定为“1”的CRC的界定符)、2位应答ACK场(1位应答间隙ACK Slot、1位应答界定符ACK Delimiter)、帧结束EOF(7个“1”位,这就解释了标准ID的高7位(ID10?ID4)为什么不能全是1)。在应答ACK场里,发送节点发送两个“1”位。当接收器正确地接收到有效的报文时,接收器就会在应答间隙期间向发送器发送一个“0”位以示应答。

2. 远程帧

远程帧跟数据帧非常相似,不同之处在于二者的远程发送请求位(Remote Transmission Request)不同。数据帧的RTR位为“0”,远程帧的RTR位为“1”。 需要特别注意的一点是远程帧没有数据场。总线上节点发送远程帧目的在于请求发送具有同一标识符的数据帧。作为数据接收的节点,可以借助于发送远程帧启动其资源节点传送数据。远程帧也有标准格式和扩展格式,而且都由6个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧结束。远程帧的组成如图10-9所示。

图10-9 远程帧的组成

为方便描述,下面我们自定义一种简单的标准ID分配方案,来阐述远程帧的使用方法。在实际应用过程中,用户可自行制定ID分配方案,或按照某种CAN高层协议来分配ID。自

定义ID分配方案如下。

假设现有节点A和B,设置节点A的地址为0,B的地址为1,A节点需向B节点请求一个温度数据。我们假定请求温度数据的功能代码为0,则A需向B发送一个ID为0x001的远程帧,远程帧发送完毕后A将自动变为接收ID为0x001的数据帧的接收节点。当B检测到该远程帧时,将发送一个ID为0x001的数据帧作为回应,此时A将接收到B节点发来的数据帧。这样一次远程请求交互就完成了。

远程帧不是必需的,例如应用层协议DeviceNet中未用远程帧,但并未影响 DeviceNet在可靠运行、通信效率方面的性能,且DeviceNet也是国际流行的CAN 应用层协议。

3. 错误帧

错误帧由CAN控制器的硬件进行处理,与用户编程无关。下面概要说明发送错误帧的工作机制。

CAN节点通过发送引脚发送报文时,接收引脚也在同步接收报文,当发送报文的ACK场为“1”时,接收到的应答间隙(ACK Slot)一定要是“0”才代表发送成功。在CAN总线网络中只要有一个节点正确接收到了报文,并将发送节点的应答间隙写为“0”,则发送节点就认为发送数据成功。在报文的应答过程中,若某一节点检测到错误,则它会立刻发送错误帧,一般是发送连续的6个0或1。由CAN的位填充原理可知,当有五个连续的0或1出现时,为了传送中的同步,必须插入一个反型位作为填充。因此如果连续出现6个或6个以上的0或1,则此次传送错误,报文将被丢弃。此时当发送节点收到这个错误帧后,便知道发送出错,并试图重发报文。任何节点检测到总线错误都会发送错误帧。

错误帧由两个不同的场组成。第一个场是由不同节点提供的错误标志(FLAG)的叠加;第二个场是错误界定符。错误帧的组成如图10-10所示。

图10-10 错误帧组成

错误标志有两种形式:主动错误(Error Active)标志和被动错误(Error Passive)标志。主动错误标志由6个连续的0位组成,而被动错误标志由6个连续的1位组成。

检测到错误条件的“主动错误”的节点通过发送主动错误标志指示错误。错误标志的形式破坏了从帧起始到CRC界定符的位填充的规则,或者破坏了ACK场或帧结束的固定形式。所有其他的节点由此检测到错误条件并与此同时开始发送错 误标志。因此,6个连续“0”的序列导致一个结果,这个结果就是把个别节点发 送的不同的错误标志叠加在一起。这个序列的总长度最小为6位,最大为12位。

检测到错误条件的“错误被动”的节点试图通过发送被动错误标志指示错误。“被动错误”的节点等待6个相同极性的连续位(这6个位处于被动错误标志的开始)。当这6个相同的位被检测到时,被动错误标志的发送就完成了。

错误界定符包括8个“1”。错误标志发送以后,每一节点都发送“1”并一直监视总线直到检测出一个“1”为止,然后就开始发送其余7个“1”。

为了能正确地终止错误帧,“被动错误”的节点要求总线至少有3个位时间的总线空闲(如果“被动错误”的接收器有局部错误的话)。因此,总线的载荷不会达到100%。

4. 过载帧

过载帧由CAN控制器的硬件进行处理,与用户编程无关。下面概要说明发送过载帧的工作机制。

过载帧用于在先行和后续数据帧(或远程帧)之间提供一附加的延时。过载帧包括两个位场:过载标志和过载界定符。过载帧的组成如图10-11所示。

图10-11 过载帧的组成

有三种过载的情况会引发过载帧的传送:

(1) 接收器的内部情况(此接收器对于下一数据帧或远程帧需要有一延时)。 (2) 在间歇的第一和第二字节检测到一个“0”位。 (3) 如果CAN节点在错误界定符或过载界定符的第8位(最后一位)采样到 一个0位,节点会发送一个过载帧(不是错误帧)。

根据过载情况1而引发的过载帧只允许起始于所期望的间隙的第一个位时间, 而根据情况2和情况3引发的过载帧应起始于所检测到“0”位之后的位。通常,为了延时下一个数据帧或远程帧,两种过载帧均可产生。

过载标志由6个0位组成。由于过载标志的格式破坏了间隙域的固定格式,因此,所有其他的节点都检测到过载条件,并与此同时发出过载标志。如果在间隙的第3个位期间检测到0位,则这个位将被解释为帧的起始。

过载界定符包括8个1位,过载标志被传送后,节点就一直监视总线,直到检测到一个从0位到1位的跳变为止。这时,总线上的每个节点完成了各自过载标志的发送,并开始同时发送其余7个1位。 10.1.5 位时间

所谓位时间,是指发送一位所需要的时间。实际工作过程的位时间与系统设定的位时间少有偏差,把理想情况下位时间称为标称位时间(Nominal Bit Time),相应的位速率(每秒发送的位数)称为标称位速率。标称位速率=1/标称位时间。

一个标称位时间分为4个时间段:同步段(SYNC_SEG)、传播段(PR0G_SEG)、 相位段1 (PHASE_SEG1)、相位段2 (PHASE_SEG2),如图10-12所示。CAN总线初始化时要通过相运的寄存器对传播段、相备段1及相位段2的时间长度进行设置。

图10-12 标称位时间组成示意图

同步段(SYNC_SEG): 连接在总线上的多个CAN节点通过同步段实现时序调整同步进行接收和发每工作。由1电平到0电平的跳变或由0电平到1电平的跳变最好出现在该段中。

传播段(PR0G_SEG): 传播段用于补偿网络内的物理延时时间,它是总线上输入比较器延时和氣出驱动器延时总和的2倍。

相位段1(PHASE_SEG1)、相位段2(PHASE_SEG2):相位段用于补偿边沿阶段的误差,这两个段可以通过重新同步加长或缩短。

采样点(Sample Point):采样点是读总线电平并解释各位的值的一个时间点,采样点位于相位段1之后。

信息处理时间(Information Processing Time): 信息处理时间是以一个采样点作为起始的时间段。采样点用于计算后续位的位电平。

最小时间份额(Time Quanta, Tq):最小时间份额是取自振荡器周期的固定时间单元,也称为串行时钟Sclock周期。位时间与最小时间份额TQ的关系是

位时间=m*Tq

式中,m为可编程的预比例因子,其范围是1?32之间的整数,m的计算公式为

m=同步段+传播段+相位段1+相位段2

通常,同步段为1个Tq,传播段可设置成1、2、3、?、8个Tq,相位段1可设置成1、2、3、?、8个Tq,相位段2为相位段1和信息处理时间之间的最大值,信息处理时间少或等于2个Tq。一个位时间总的Tq值可以设置在8?25。

在确定一个CAN总线的通信速率时,主要根据上述参数确定。

10.2 FlexCAN模块概述与编程要点

FlexCAN模块是一种CAN协议的通信单元。K60的FlexCAN模块支持CAN2.0B协议中标准帧信息格式和扩展帧信息格式,不仅拥有FlexCAN模块先前版本的传统特征,更拥有CAN2. 0B协议本身新的特性。 10. 2. 1 FlexCAN模块特征

1. 传统特征

(1) 完全支持CAN2.0B协议:标准数据帧;扩展数据帧;0?8字节的数据长度;可编程控制的波特率,数据传输速率可达1 Mbps;与内容相关的寻址方式;

(2) 0到8字节长度报文缓冲区;

(3) 每个报文缓冲区都可以配置成发送缓冲区或者接收缓冲区,支持标准和扩展帧格式;

(4) 每个消息缓冲区都有自己的接收掩码控制寄存器;

(5) 全功能的接收队列,该队列可以存储最多6个帧,并且自动进行内部指 针处理; (6) 传输中止能力;

(7) 可编程的CAN协议接口的时钟源,可以是总线时钟也可以是外部晶振; (8) 没有使用的结构空间可以当成普通的RAM空间使用; (9) 可编程的回环模式,支持自测试;

(10) 可编程的传输优先级机制,最低ID、最少缓冲区数目或者最高优先级; (11) 基于16位自由运行定时器的时间戳机制; (12) 全局网络时间,通过一个特殊的帧来同步; (13) 中断掩码;

(14) 独立的传输媒介(假定一个外部收发器); (15) 高优先权信息具有短的响应时间;

(16) 低功耗模式,当总线激活时可以通过编程实现从低功耗模式唤醒。 2. 较以前版本新添加的特性

(1) 远程请求帧可以被自动或者软件处理; (2) 正常模式下ID过滤配置的安全机制;

(3) 只有在“Freeze”模式下进行的CAN比特时间设置与配置比特; (4) 发送缓冲区状态(最低优先级缓冲区或者空缓冲区); (5) 用于接收帧的IDHIT寄存器;

(6) SYNC比特状态位用来指示模块已经与CAN总线同步; (7) 调试寄存器;

(8) 用于报文的CRC状态; (9) 接收队列全局掩码寄存器;

(10) 在匹配过程中接收缓冲区与接收队列可选择的优先级; (11) 强大的接收队列ID过滤功能,能够匹配接收的ID是扩展的128字节、 标准的256字节或者512部分(8比特)ID,最多32个匹配能力;

(12) 100%兼容FlexCAN以前版本。 10.2.2 CAN模块寄存器

因为FlexCAN有两路通道,所以有2组顺序排列的寄存器,每个模块共有33个寄存器。表14-3给出了 CAN0通道的33个寄存器的内存映射,CAN1通道的寄存器名、复位值与CAN0通道相同,基地址则为0x400A_4000。

表 CAN通道寄存器映射 十六进期 寄存器名称 权限 复位值 绝对地址 4002_4000 CAN供块配置寄存器(CAN0_MCR) 32 读/写 D890_000Fh 4002_4004 CAN控制寄存器(CAN0_CTRL1) 32 读/写 0000_0000h 4002_4008 CAN自由运行定时器(CAN0_TIMER) 4002_4010 CAN接受邮箱全局掩码寄存(CAN0_RXMGMASK) 4002_4014 CAN接收14掩码寄存器(CAN0_RX14MASK) 4002_4018 CAN接收15掩码寄存器(CAN0_RX15MASK) 4002_401C CAN错误计数寄存器(CAN0_ECR) 4002_4020 CAN错误与状态寄存器1(CAN0_ESR1) 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读 读/写 读 读/写 读/写 0000_0000h FFFF_FFFFh FFFF_FFFFh FFFF_FFFFh 0000_0000h 0000_0000h 0000_0000h 0Q00_0000h 0000_0000h 0000_0000h 0000_0000h 0000_0000h 0000_0000h FFFF_FFFFh 未定义 未定义 未定义 4002_4024 CAN中断掩码寄存器2(CAN0_IMASK2) 4002_4028 CAN中断掩码寄存器1(CAN0_IMASK1) 4002_402C CAN中断标志寄存器2(CAN0_IFLAG2) 4002_4030 CAN中断标志寄存器1(CAN0_IFLAG1) 4002_4034 CAN 控制寄存器2(CAN0_CTRL2) 4002_4038 CAN错误与状态寄存器2(CAN0_ESR2) 4002_4044 CRN 寄存器 (CAN0_CRCR) 4002_4048 CAN接收队列全局掩码寄存器(CAN0_RXFGMASK) 4002_404C CAN接收队列信息寄存器(CAN0_RXFIR) 4002_4880 CAN接收个别掩码寄存器(CAN0_RXIMR0) 4002_4884 CAN接受个别掩码寄存器(CAN0_RXIMR1) 4002_4888 CAN接受个别掩外寄存器(CAN0_RXIMR2) 4002_488C CAN接受个别掩码寄存器(CAN0_RXIMR3) 4002_4890 CAN接受个别掩码寄存器(CAN0_RXIMR4) 4002_4894 CAN接受个别淹码寄存器(CAN0_RXIMR5) 4002_4898 CAN接受个别掩码寄存器(CAN0_RXIMR6) 4002_489C CAN接受个别掩码寄存器(CAN0_RXIMR7) 4002_48A0 CAN接受个别掩码寄存器(CAN0_RXIMR8) 4002_48A4 CAN接受个别掩码寄存器(CAN0_RXIMR9) 4002_48A8 CAN接受个别掩码寄存器(CAN0_RXIMR10) 4002_48AC CAN接受个别掩码寄存器(CAN0_RXIMR11) 4002_48B0 CAN接受个别掩码寄存器(CAN0_RXIMR12) 4002_48B4 CAN接受个别掩码寄存器(CAN0_RXIMR13) 4002_48B8 CAN接受个别掩码寄存器(CAN0_RXIMR14) 4002_48BC CAN接受个别掩码寄存器(CAN0_RXIMR15) 32 32 32 32 32 32 32 32 32 32 32 32 32 32 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 读/写 未定义 未定义 未定义 未定义 未定义 未定义 未定义 未定义 未定义 未定义 未定义 未定义 未定义 未定义

由于FlexCAN模块寄存器众多,这里挑选其中常用的寄存器加以详细介绍。这些寄存器均以“CANx_”前缀开头,其中“x”为0?1,代表FlexCAN模块的两个模块号。在实现CAN总线通信功能中主要涉及的寄存器有:模块配置寄存器(CANx_MCR)、控制寄存器1(CANx_CTRL1)、中断标志寄存器1(CANx_IFLAG1)、控制寄存器2(CANx_CTRL2)等。本小节将具体介绍以上寄存器,其他寄存器请查阅K60的官方技术文档。

1. CAN模块配置寄存器(CANx_MCR)

该寄存器主要用于使能FlexCAN模块的全局配置。

MDIS——CAN模块禁用位,用来控制是否禁止FlexCAN模块工作。当FlexCAN模块被禁止时,FlexCAN模块会禁止CAN总线协议引擎的时钟源和禁止主模块和子模块的接口控制。

该位不受软件复位影响。

0:开启FlexCAN模块; 1:禁止FlexCAN模块。

FRZ——冻结模式使能位,用来指定FlexCAN模块是否能进入冻结模式。前提是当MCR寄存器的HALT位被置位时或者在MCU级的调试模式请求下才能生效。

0:禁止FlexCAN模块进入到冻结模式; 1:使能FlexCAN模块进入到冻结模式。

RFEN——接收队列使能位,用来控制是否开启接收队列。RFEN被置位时,MB0?MB5不能用于正常的接收与传输,因为其相应的内存空间(0x80?0xDC)被队列引擎使用。同时还要用掉5 MB之后的几个MB(最多32个,这取决于CTRL2 [RFEN]位的设置,8个过滤器表将占用2 MB的存储空间),用于接收队列ID过滤器表元素。该位只有在冻结模式下才能被写入,在其他模式下该位被通过硬件的方法锁定。

0:禁止接收队列; 1:开启接收队列。

HALT——暂停FlexCAN模块。该位置位会使FlexCAN模块进入到冻结辦式。CPU在初始化报文缓冲区与控制寄存器之后要将该位淸0,否则会导致报文缓冲无法接收和传递数据。FlexCAN在任何一种低功耗模式下时,都不可能进入到冻结模式。

0:没有冻结模式请求;

1:如果FRZ置位那么FlexCAN进入到冻结模式。

NOTRDY——表示FlexCAN模块未准备好。该位只读,用来表示FlexCAN现在处于以下几种模式:禁止模式、睡眠模式、停止模式或者冻结模式。当FlexCAN模块退出以上模式该位会自动淸0。

0:FlexCAN模块处于正常模式、监听模式或者回环模式;

1:FlexCAN模块处于禁止模式、睡眠模式、停止模式或者冻结模式。 WAKMSK——唤醒中断,用来使能唤醒中断。 0:唤醒中断被禁止; 1:唤醒中断被使能。

SOFTRST——软件复位。以下寄存器将会受复位影响:MCR(除了MDIS位)、TIM-ER、ECR、ESR1、ESR2、IMASK1、IMASK2、IFLAG1、IFLAG2以及CRCR。以下寄存器不会受影响:CTRL1、CTRL2、RXIMR0?RXIMR63、RXMGMASK、RX14MASK、RX15MASK、RXFGMASK、RXFIR以及所有的报文缓冲区。

当软件复位SOFTRST被写入1的时候,CPU会直接置位软件复位,同样,当K60的全局软件复位罝位后,CPU也会直接罝位CAN模块的软件复位标志位。软件复位也要遵守单片机的时钟总线控制,需要占用一些时间去等待软件复位生效。复位过程在进行时,SOFTRST位会保持置位,复位完成后自动清零。所以可以循环检测SOFTRST位,用来确定软件复位是否已经完成。

在任何一种低功耗模式下,如果时钟被关闭那么软件复位将不起作用,模块应该首先退出低功耗模式,然后软件复位才会起作用。

0:没有复位请求;

1:有复位请求,相关寄存器会受到软件复位的影响。

FRZACK——冻结模式确认位,该位只读,用来指示FlexCAN模块现仵处于冻结模式,并且它的预分频器是停止的。冻结模式只有在当前接收和发送进程结束后才能被响应。软件可以循环检测该位,以了解FlexCAN模块逛否已进入到冻结模式。如果冻结模式请求被忽略,那么一旦FlexCAN模块预分频器又重新运行,该位也会取反。如果FlexCAN正处于任何一种低功耗模式时请求冻结模式,那么只有当模块退出低功耗模式时FRZACK位才会被置位。

这里要注意的是:当CPU响应冻结模式后FRZACK会在178个CAN总线时钟位中置位,当解除冻结模式后,FRZACK会在2个CAN总线时钟位中被清零。

0:FlexCAN模块没有处于冻结模式,预分频器处于运行之中; 1:FlexCAN模块处于冻结模式,预分频器停止。

SUPV——管理员模式,用来配罝FlexCAN模块是处于管理员模式还是用户模式。寄存器会被该位影响,取决于该位是管理员模式还是用户模式,两种模式在内存映射的访问权不同。该位只有在冻结模式下才能被写人,在其他模式下该位通过硬件的方式被锁住。

0: FlexCAN处于用户模式。所有受影响的寄存器可以以管理员或者无限制的方式访问。 1:FelxCAN处于管理员模式,所有受影响的寄存器只能以管理员的身份访问。

SLFWAK——当FlexCAN处于低功耗模式时,使能该位将允许FlexCAN从低功耗模式恢复到正常模式。当该位使能以后,FlexCAN会监视CAN总线的唤醒事件(指CAN总线电平由隐性到显性的转变):

如果在DOZE模式下唤醒,FlexCAN会恢复时钟,如果被使能了这种功能,那么此时会产生一个中断到CPU。

如果在STOP模式下使能了这种功能,那么此时会产生一个中断到CPU允许离开STOP模式,FlexCAN会恢复时钟。

在低功耗而不是禁止模式下,该位不能被写入,因为该位被硬件封闭。 0:FlexCAN自唤醒功能禁止; 1:FlexCAN自唤醒功能使能。

WRNEN——警告中断使能。如果该位使能,那么FlexCAN的错误和状态寄存器的 TWRNINT和RWRNINT标志位将会被激活。如果该位被禁止,那么这两个标志位为0,而且错误计数器和警告中断都不能工作。该位只能在冻结模式下写入,在其他模式下该位被硬件锁定。

0:TWRNINT和RWRNINT标志位为0,错误计数器的值没有实际意义; 1:TWRNINT和RWRNINT标志位被激活,且在错误计数器等于或大于96个错误时置位。 LPMACK——低功耗模式状态获得位。该位表示FlexCAN是否进入低功耗模式 (Disable Mode, Doze Mode, Stop Mode),进入低功耗模式必须等在当前发送接收进程完成,循环查询该位可以获得FlexCAN是否进入低功耗模式。

这里要注意的是:当CPU响应低功耗模式后LPMACK会在180个CAN总线位中置位,当解除冻结模式后,LPMACK会在2个CAN总线位中被淸零。

0:FlexCAN没在低功耗模式中; 1:FlexCAN在低功耗模式中。 DOZE——DOZE模式使能位。该位使能后,FlexCAN进入低功耗模式。当Flex CAN从DOZE模式中唤醒或使能SLFWAK后,CAN总线上出现电平变换时,DOZE位会自动复位。

0:当DOZE模式被响应时,FlexCAN不使能进入低功耗模式。 1:当DOZE模式被响应时,FlexCAN使能入人低功耗模式。

SRXDIS——自我接收禁止位,作用是FlexCAN发送的数据被自己接收。该位置位以后设定好的MB不会接收到任何数据,不会有相应的标志位置位,会忽略MB的匹配过程。该位只能在冻结模式下写入,在其他模式下该位被硬件锁定。

0:FlexCAN使能自我接收; 1:FlexCAN禁止自我接收。

IRMQ——使能私有接收掩码与队列。该位决定匹配过程将基于私有掩码与队列 (individual masking and queue,主要是CANx_RXFGMASK和CANx_RXIMR寄存器)或者基于由 RXMGMASK、RX14MASK、RX15MASK 及 RXFGMASK 构成的掩码机制(即在两种掩码方式中选择一种)。该位只能在冻结模式下写入,在其他模式下该位被硬件锁定。

0:禁止个别接收掩码和队列功能(individual Rx masking and queue feature),为了向后

兼容,C/S宇的读取将锁定MB,即使MB位为空; 1:开启个别接收掩码和队列功能。

LPRIOEN——使能本地优先,为提供向后兼容而设计的。该位控制当前本地优先是否使能,作用是在总线仲裁期间扩展正在使用的ID。扩展ID的概念是:当ID初始化为11位的标准帧或者29位的扩展帧时,CPU会在仲裁过程中将ID扩展至32位。

0:禁止本地优先功能; 1:开启本地优先功能。

AEN——中止使能位,是为提供向后兼容而设计的。该位使能传输中止机制,保证能在安全的过程中中止正在传输的过程,以便没有数据发送到CAN总线上。

这里需要注意的是:当AEN被置位时,中止机制只能用于发送的MB,而不能用于接收的MB;如果在接收的MB中写入中止机制,那么会造成不可预知的结果。

0:中止机制禁止; 1:中止机制使能。

IDMA——ID接收模式,用来鉴别接收队列(Rx FIFO)过滤器表的格式。该位只能在冻结模式下写入,在其他模式下被硬件锁定。

00:格式A: 每一个ID过滤表元素有一个全ID(标准的和扩展的);

01:格式B: 每一个ID过滤表元素都有两个全IDs(标准的)或者两个14 bit(标准的和

扩展的)ID;

10:格式C: 每一个ID过滤表元素有4个8 bit标准ID; 11:格式D: 拒绝所有的帧。

MAXMB——用于确定最终参与总线仲裁的MB的数里。复位值为0x0F,即默认情况下报文缓冲区个数为16 MB。该字段只能在冻结模式下写入,在其他模式下该位被硬件锁定。最终用于收发的MB(除去队列的占用的MB0?5,以及队列FIFO过滤器占用的MB)。这里要注意:MAXMB设置的值必须小于参数NUMBER_OF_ MB,NUMBER_OF_MB参数的值为64,最大有效报文个数应是NUMBER_OF_MB—1。另外,MAXMB的值必须包括由CTRL2[RFEN]定义的队列大小。

2. CAN 控制寄存器1(CANx_CTRL1)

该寄存器用来定义和CAN总线相关的具体的FlexCAN模块的控制功能。

PRESDIV——预分频器分频系数,用来定义协议引擎(PE)时钟频率与串行时钟频率(Sclock)之间的比率。Sdock周期定义了CAN协议的最小时间份额。对于复位值,Sclock频率等于PE的时钟频率,最大值为0xFF。Sclock的最小时钟频率等于PE(CAN协议引擎)时钟频率除以256的值。该字段只能在冻结模式下写入,在其他模式下该位被硬件锁定。

Sclock 频率=PE时钟频率/(PRESDIV+1)

RJW——再同步跳跃宽度,定义了在一次再同步过程中位改变的最大时间份额(1个时间份额为Sclock时钟周期)。有效值为0?3,该字段只能在冻结模式下写入,在其他模式下

该位被硬件锁定。

再同步跳跃宽度= RJW+1

PSEG1——相位段1,用来定义相位段1位时间长度。有效值为0?7,该字段只能在冻结模式下写入,在其他模式下该位被硬件锁定。

相位段1 = (PSEG1 + 1) X Time—Quanta

PSEG2——相位段2,用来定义相位段2位时间长度。有效值为0?7,该字段只能在冻结模式下写入,在其他模式下该位被硬件锁定。

相位段2 = (PSEG2 + 1) X Time—Quanta

BOFFMSK——总线断开中断使能。该位提供了总线断开中断的功能。 0:禁止总线断开中断; 1:开启总线断开中断。 ERRMSK——错误中断使能。

0:禁止错误中断; 1:开启错误中断。

CLKSRC——CAN引擎时钟源,用来为CAN协议引擎(PE)选择时钟源,时钟源可以是设备外设时钟(PLL分频而来)也可以是外部晶振时钟。所选择的时钟源供预分频使用,以产生串行时钟(Sclock)。为了保证可靠运行,该位只有在禁止模式下才能被写入,在其他模式下该位被硬件锁定。

0:选择外部晶振时钟; 1:选择外设时钟。 LPB——闭环模式选择位,用来配置FlexCAN工作在闭环模式下。在该模式下, FlexCAN模式执行内部循环用于自测。

0:禁止闭环模式; 1:开启闭环模式。

TWRNMSK——传输错误警告中断使能。TWRNINT标志位置位后,使能该位可以产生警告中断,但必须保证MCR寄存器中WRNEN位置位。

0:禁止传输错误警告中断; 1:开启传输错误警告中断。

RWRNMSK——接收错误警告中断使能。RWRNINT标志位置位后,使能该位能产生警告中断。但必须保证MCR寄存器中WRNEN位置位。

0:禁止接收错误警告中断; 1:开启接收错误警告中断。 SMP——CAN位采样,定义了接收引脚(Rx pin)的采样模式。该位只有在冻结模式下才能被写入,在其他模式下该位被硬件锁定。

0:仅采样一次来决定接收位的值;

1:通过3次采样来决定接收到位的值:常规的一次(采样点)以及两次之前的采样,使用了多数裁定原则。

BOFFREC——总线恢复功能,决定了FlexCAN如何从总线断开状态下恢复。 0:总线自动恢复功能启动,参考CAN Spec 2.0 part B, 1:禁止总线自动恢复功能。

TYSN——计数器同步模式位。使能该位后,MB0每接收到一个报文就复位自由运行计数器。该机制为同步多个FlexCAN结点提供特定的SYNC报文(全局网络时间)。如果MCR寄存器的RFEN位置位(启用接收队列),第一个可用的邮箱(通过CTRL2[RFEN]的设置)而不是MB0被用于计数器的同步。该位只有在冻结模式下才能被写入,在其他模式下该位被硬件锁定。

0:禁止计数器同步; 1:使能计数器同步。

LBUF——报文缓冲区的发送次序位,定义了报文缓冲区传输的排序机制。当该位被置位时,LPRIOEN位将不会影响优先级的裁定。该位只有在冻结模式下才能被写入,在其他模式下该位被硬件锁定。

0:具有高优先级的缓冲先发送;

1:缓冲区序号最小的先发送。 LOM——监听模式。该位用于配置FlexCAN处于监听模式,在该模式下FlexCAN 的传输被禁止,所有的错误计数器关闭。只有当别的CAN节点接收到报文后,FlexCAN才能接收该报文。如果FlexCAN没有接收大报文,则置位BIT0错误(不会改变REC),表示它正尝试获得报文。

监听模式的监听结果可以由ESR1寄存器的FLTCONF位来获得,当进入监听模式ESR1寄存器的FLTCONF位时,则产生被动的错误。监听模式接收和响应会延时一段时间。

该位只有在冻结模式下才能被写入,在其他模式下该位被硬件锁定。 0:监听模式被禁止; 1:FlexCAN运行在监听模式下。

PROPSEG——传播时间段,定义了发送阶段位时间长度,有效值为0?7。该位只有在冻结模式下才能被写入,在其他模式下该位被硬件锁定。

传播时间 = (PROPSEG+1) X Time—Quanta Time— Quantum = —个Sclock周期 3. CAN中断标志寄存器1(CANx_IFLAG1) 当没有使能FIFO功能时,CANx_IFLAG1与CANx_IFLAG2有同样的功能,只是CANx_IFLAG1 对应的是MB[31:0]。

当接收FIFO使能之后,寄存器的作用会发生变化,这时BUF7I和BUF6I与BUF5I可以用来表示接收队列FIFO的中断。当MCR[RFEN]置位时,最重要的8 个中断标志BUF[7:0]I的功能会改变:BUF7I、BUF6I、BUF5I用于表示当前接收队列FIFO的状态,BUF4I?BUF0I被保留。

在使能RFEN之前,CPU必须淸除FIFO用到的MB所对应的FLAG。当 RFEN位为0时,FIFO的标志位也要相应地被淸除;当利用RFFN扩展FIFO的过滤器时,所选中的MB对应的FLAG也要淸除。

如果要更新MCR寄存器的MAXMB位(这种更新可能是减少当前MB的数量),那么必须淸除原来MB的IFLAG1。否则,它们仍然会置位,并且可能使得可用的MB个数与寄存器中显示的个数出现不一致的情况。

BUF31?8I——对应的缓冲区中断标志位。

0:相应的缓冲区没有成功地完成传输或者接收操作; 1:相应的缓冲区成功地完成了传输或者接收。 BUF7I——缓冲区7中断标志位。

当MCR寄存器中的RFEN位被置1时,缓冲区MB7中断或者“接收队列溢出”。当MCR寄存器中的RFEN位被清0时(接受队列FIFO被禁止),该位用来表示MB7的中断标志位。

注意:当MCR[RFEN]位被CPU写入而改变时,该位被FlexCAN淸空。当MCR[RFEN]位被置位时,用来表示“接收队列FIFO溢出”标志。在这种情况下,该标志位表示一个报文将会因为接收队列满而丢失。注意当接收队列FIFO满时该位不会被置位,并且报文会被邮箱捕捉。

0:MB7缓冲区没有完成接收或者发送(当MCR[RFEN] = 0)或者接收队列FIFO没有溢出(当MCR[RFEN] = 1); 1:MB7完成发送或者接收(当MCR[RFEN] = 0))或者接收队列FIFO溢出(当MCR[RFEN] = 1)。

BUF6I——缓冲区6中断标志位。

当MCR寄存器中的RFEN位被置1时,缓冲区MB6中断或者“接收队列警告”当MCR的RFEN位为0时(禁止接收队列FIFO),该位为MB6中断标志位。

注意:当MCRCRFEN]位被CPU写入而改变时,该位被FlexCAN模块淸除,当MCR[RFEN]置位时,该位表示“接收队列瞀告”标志。在这种悄况下,该位用来表示在接收队列FIFO接收到一个新的报文时,未读报文数目从4增加到5,这意味者接收队列FIFO几乎已经满了,因此置该标志位,用于产生警告。

0:没有发生MB6完成传输或者接收事件(当MCR[RFEN]=0)或者接收队列FIFO没有产生警告(当MCR[RFEN] = 1);

1:MB6完成传输或者接收(当MCR[RFEN] = 0)或者接收队列FIFO产生警告。 BUF5I——缓冲区5中断标志位。

当MCR寄存器中的RFEN位被置1时,缓冲区MB5中断或者“接收队列FIFO中存在可用的报文”。当MCR寄存器的RFEN位被淸0时,该位用来表示MB5缓冲区中断。

注意:当MCR[RFEN]位被CPU写入而改变时,该位被FlexCAN模块淸除。当MCR[RFEN]置位时,该位表示“接受队列FIFO中存在可用的报文”。在这种情况下该位用来表示在接收队列FIFO内至少一个帧可读。

0:MB5没有发生发送或者接收操作(当MCR[RFEN]=0)或者在接收队列 FIFO中可用的帧(当MCR[RFEN] = 1);

1:MB5完成发送或者接收操作(当MCR[RFEN] = 0)或者接收队列FIFO中可用桢(当 MCR[RFEN] = 1)。

BUF4?01——缓冲区4?0中断标志位。

缓冲区MBi(i表示0?4)中断标志位或者保留。当MCR寄存器的RFEN位淸除时(禁止接收FIFO队列),这些位用来表示MB4?MB0的中断标志位。

注意:当 MCR[RFEN]位被CPU写入时,FlexCAN将会淸除这些位标志。当MCR寄存器的RFEN置位时,缓冲区4?缓冲区0的标志位被保留,

0:相应的级冲区没有发生发送或者接收事件(当MCR[RFEN]=0); 1:相应的缓冲区成功地完成了发送或者接收(当MCR[RFEN]=0)。

4. CAN 控制寄存器2(CANx_CTRL2)

该寄存器包含CAN错误、FIFO特征以及模式选择等控制位。

WRMFRZ——在冻结模式下对内存的写访问。该位只能在冻结模式下被写人并且 在除了冻结模式下没有影响。

0:维持限制写访问;1:使能无限制写访问FlexCAN内存。 RFEN——接收队列(FIFO)中过滤器的数目。

这4位用来定义了表14-4中所列的接收队列过滤器的数目。最大的可选的过滤器数目由MCU来定义。该字段只能在冻结模式下被写,在其他模式下被硬件锁定。该字段不能被设置为大于接收队列及邮箱ID过滤器的报文缓冲区的数目,这些由MCR[MAXMB]所定义。

注意:每组的8个过滤器拥有一个2个报文缓冲区大小的内存空间,这意味者过滤器使用的越多,满足条件的邮箱越少。考虑到有接收队列FIFO所用的内存空间最初保留用于MB0?5,RFEN的值必须设置为不大于可用内存空间数的过滤器的值,所以最大的可以设置的过滤器数目可以按照以下方式来计算:

最大的可以设罝的过滤器数B=(SETUP_MB—6) X 4

其中,SETUP_MB为NUMBER_OF_MB与MAXMB之间最小的。剩余可用与发送或接收的邮箱数目为:(SETUP_MB — 8)—(RFEN X 2),如果接收队列FIFO的值被设置为超过SETUP_MB的值(可以使用的内存空间由RFEN所定义),那么超过的数5将不会起作用。表14-4描述了 IFO的过滤器元素表。

表14-4 FIFO过滤器元素表 接收队 接受队列和ID 过虑RFEN 被CANx_RXIMR影响被CANx_RXFGMASK影响的 列过滤 器表所占 有的消息剩余可用的邮箱 的接收队列过虑器元接收队列过滤器表元素 器数 缓冲区 素 8 16 24 32 40 48 56 64 72 80 88 96 104 MB0?7 MB0?9 MB0?11 MBO?13 MB0?15 MB0?17 MB0?19 MB0?21 MB0?23 MB0?25 MB0?27 MB0?29 MB0?31 MB8?63 MB10?63 MB12?63 MB14?63 MB16?63 MB18?63 MB20?63 MB22?63 MB24?63 MB26?63 MB28?63 MB30?63 MB32?63 元素0?7 元素0?9 元素0?11 元素0?13 元素0?15 元素0?17 元素0?19 元素0?21 元素0?23 元素0?25 元素0?27 元素0?29 元素0?31 none 元素10?15 元素12?23 元素14?31 元素16?39 元索18?47 元素20?55 元素22?63 元素24?71 元素26?79 元素28?87 元素30?95 元素32?103 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 112 120 128 MB0?33 MB0?35 MB0?37 MB34?63 MB36?63 MB38?63 元素0?31 元素0?31 元素0?31 元素32?111 元素32?119 元素32?127 下面对该表做简单的说明:接收队列过滤器数0决定了接收队列过滤器表元素的个数,以RFEN=0x01为例:此时有16个过滤器,占用了两个MB,因而FIFO总共占用了8 MB(MB[0?7]),此时接收队列过滤器表元素中也有16个元素,可以使 FIFO接收16个不同ID的来自总线的帧。这时候元素0?7的匹配方式由CANx_RXIMR决定,而元素10?15的匹配方式由CANx_RXFGMASK寄存器决定。

MRP——邮箱接收优先权。该位只有在冻结模式下被写入,在其他模式下该位被硬件锁定。

0:首先在接收队列FIFO中匹配然后在邮箱中匹配; 1:首先从邮箱开始匹配然后在接收队列FIFO中匹配。

RRS——远程请求存储。如果该位置位,那么远程请求也将加人匹配的过程中、匹配结果也将存储到相应的MB中,没有自动远程回复帧产生;如果该位淸零,那么远程请求将传送到匹配的过程中,如果一个包含CODE=0b1010的ID和MB中的ID相同时,自动远程回复帧将产生。该位只有在冻结模式下被写入,在其他模式下该位被硬件锁定。

0:远程请求帧会产生; 1:远程请求帧会被存储。 EACEN——接收邮箱开启整帧仲裁字段比较。在匹配过程中该位控制接收邮箱过滤器的IDE和RTR位与接收到的帧的相应位比较。该位不会影响接收队列FIFO的匹配。该位只有在冻结模式下被写入,在其他模式下该位被硬件锁定。

0:接收邮箱过滤器的IDE位总是比较并且RTR不比较;

1:开启接收邮箱过滤器的IDE和RTR与接受帧的相应位进行比较,屏蔽位不起作用。

10.2.2 操作模式

FlexCAN模块一共具有四种不同的功能模式:正常模式(用户和管理员)、冻结模式、监听模式以及回环模式。同样具有三种不同的低功耗模式:禁止模式、睡眠模式以及停止模式。

1. 正常模式(用户与管理员)

在正常模式下,CAN模块收发数据帧、处理错误,CAN协议的所有功能全部开启。对于一些控制比较严格的寄存器,在用户模式和管理员模式下访问是有区别 的。

2. 冻结模式

如果模块配置寄存器(Module Configuration Register, MCR)的FRZ位被置位,那么将开启CAN模块的冻结模式。当MCR的HALT位置位或者在MCU级请求调试模式(Debug Mode)并且MCR寄存器的FRZ_ACK位被置位时,CAN模块将进入到冻结模式。在该模式下,将停止收发帧,并且将丢失与CAN总线的同步。

3. 监听模式

当控制1寄存器的L0M位置位时,模块将进入到监听模式。在该模式下,CAN 模块禁止数据收发,所有的错误计数器都被冻结,且该模块工作在CAN被动错误模式。只有被其他CAN节点应答了的报文才可以被监听的节点接收。如果FlexCAN 检测到一个还没有被应答的报文,则标记为一个BIT0错误(不会改变REC),就如它试图应答报文一样。

4. 回环模式

如果控制1寄存器的LPB位被置位,模块将进入到回环模式。在该模式下,FlexCAN工

作在内部闭环模式用于自测。从发送器发送出的比特流输出回内部的接收器输入。输入引脚将会被忽略,并且输出引脚将处于逻辑1状态。发送报文时,FlexCAN模块和正常模式一样,而接收器则认为接收它自己的报文与接收远程节点的报文相同。FlexCAN为保证能正确接收到自己发送的报文,将忽略应答间隙内的应答字段。发送和接收都可以产生中断(如果中断使能的话)。

5. 模块禁止模式

当MCR寄存、器的MDIS位被CPU置位并且LPM_ACK位被FlexCAN模块置位时,模块 将会进入模块禁止低功耗模式。如果模块被禁止,那么模块将会请求停止CAN协议引擎的时钟并且请求禁止控制器主机接口子模块。通过清MCR寄存器MDIS位可以退出该模式。

6. 睡眠模式

当MCR寄存器的DOZE位被置位、在MCU级请求睡眠模式并且由FlexCAN置位MCR 寄存器的LPM_ACK位时模块将进入睡眠低功耗模式。当模块处于睡眠模式时,FlexCAN将会请求禁止CAN协议引擎的时钟并且请求禁止CAN控制器主机接口子系统。当MCR寄存器的DOZE位被清位、MCU离开睡眠模式或者检测到CAN总线上有活动并且自醒机制开启时模块将退出睡眠模式。

7. 停止模式

在MCU级请求模式并且由FlexCAN模块置位MCR寄存器的LPM_ACK位时,模块将会进入到停止低功耗模式。在停止模式中,模块将会将自己置手不活动状态,然后通知CPU可以关闭所有的时钟。当移除停止模式请求或者检测到CAN总线上有活动且开启了自醒机制时,FlexCAN将会退出该模式。 10.2.3 内存映射/寄存器简介

FlexCAN模块的基址取决于MCU部分内存映射。从模块基址开始一共有128字节的地址空间用于FlexCAN模块的寄存器定义,模块基址开始于0x0080。

每一个独立的寄存器都通过其唯一的名字及助记符来表示。访问权限可以是管理员身份或者无限制。大部分的寄存器都可以通过对MCR寄存器的SUPV位编程 配置成管理员身份或者无限制访问。表10-2中的访问权限一列定义了这些寄存器 的访问权限S/U。

表10-2 模块内存映射

控制寄存器的设置是在初始化阶段完成的,此时FlexCAN模块与CAN总线尚未同步,而配置寄存器的设置可以在同步之后进行改变。要改变配置寄存器,首先要通过置位CANMCR的HALT位使FlexCAN进入冻结模式。

由于该模块寄存器的内容较多,本书将不再一一介绍,CAN模块寄存器的详 细内容请参见阅读材料。

10.2.4 报文缓冲区结构

FlexCAN模块使用CANTX和CANRX两个引脚与其他CAN节点进行通信,其内部最重要的一个结构为报文缓冲区结构(Message Buffer Structure),FlexCAN模块通过报文缓冲区进行报文帧的发送/接收。图10-13为K60的FlexCAN模块结构框图。

图10-13 K60的FlexCAN模块结构框图

其中报文缓冲区(简称MB)体系结构如图10-14所示。

图10-14 FlexCAN报文缓冲区体系结构图

每一个独立的MB都由16个字节组成,MB的报文缓冲区结构如图10-15所示。邮箱所用的内存空间地址范围为0x80?0x47C。

图10-15 MB报文缓冲区结构

D24?D27: CODE位,报文缓冲区码。这4比特字段可以被CPU以及FlexCAX模块所访问(读和写),作为报文缓冲区匹配与仲裁过程的一部分。该码的解码如表10-3和表10-4所示。

表10-3 用于接收缓冲区报文缓冲区码字

注意: 1. SRV:处理MB。MB被读取,通过读TIMER或者被其他的MB解锁。

2. 如果一个帧被移入到MB(Move-in过程),那么该帧被认为是被成功地接收。 3. 来自于CTRL2寄存器的远程请求存储比特位。

4. Code 0b1010不被考虑,并且具有该CODE的MB应该被丢弃。

5. 对于发送MB来说,BUSY应该在读的时候被忽略,除了MCR寄存器中AEN位被置位。如果该位被置位,那么相应的MB将不会参与到匹配过程。

表10-4 用于发送缓冲区的报文缓冲区码字

D22: SRR位,替代远程请求。固定隐性位只用于扩展帧格式。该位必须由用户将其设置为“1”来传输(发送缓冲区),并且和从CAN总线上接收到的值一起被存储起来,它可以以隐性或者显性接收。如果FlexCAN以显性位接收,那么其解释为仲裁丢失。SRR=1,隐性位强制用来以扩展帧模式传输;SRR=0,显性位 对于传输扩展模式是不可用的。

D21: IDE位,ID扩展位。该位用来表示帧是标准帧还是扩展帧。IDE=1,帧为扩展帧;IDE=0,帧为标准帧。

D20: RTR位,远程传输请求。该位影响远程帧的行为并且是接收过滤器的一部分。如果FlexCAN传输“1”或者“0”,这解释为仲裁丢失。如果该位以“0”(显性)传输,那么如果在接收时为“1”(隐性),那么FlexCAN模块将会认为这是一个错误。如果接收到的值与发送值相同,那么其将会被认为是一次成功的传输。RTR=1,如果MB为发送,那么表示当前的MB可能有一个等待发送的远程请求帧;如果MB为接收,那么接收到的远程请求帧将会被存储起来;RTR=0,表示当前的MB有一个数据帧等待传输。在接收MB中,它可能会被当作处于匹配过程。

D19?D16: DLC位,数据的字节长度。该字段为发送/接收数据的长度。在接收阶段,该字段由FlexCAN写入,从接收帧的DLC (Data Length Code)字段复制而得到。在传输阶段,该字段由CPU写入,并且会传输与DLC值相同的帧长度。当RTR=1时,被传输的帧为远程帧并且不包括在数据字段中,不考虑DLC字段。表10-5说明了 DLC的值与可用数据字节的对应关系。

表10-5 可用的数据字节

D15?D0: TIME STAM位,自由运行计数器时间戳。该16比特是自由运行计数器的复制,在当标识符字段的开始出现在CAN总线时用于捕捉传输或者接收帧。

D31?D29: PRI0位,本地优先级。该位只有当MCR寄存器的LPRI0N_EN位置位时这三

位才有用,并且只对传输邮箱有效。这些位不会被传输。他们经常被附加到ID来定义传输优先级。

D28?DO: ID位,帧标志符。在标准格式内,只有11个比特的高位比特(28 到18)用来标识接收或者发送的帧。18个低位将会被忽略。在扩展帧格式内,所有的都用来标识传输或者接收的数据帧。

D31?DO: DATA BYTE0?7位,数据字段。最多8个字节可以被用作数据帧。对于接收到的数据帧,从总线上接收到的数据帧以它被接收时的格式进行存放。 DATA BYTE (n)只有当n小于DLC的值时才有效。

对于传输数据帧,该字段用来表示用于发送的数据帧的长度。 10.2.5 仲裁处理、匹配处理及报文缓冲区管理

1. 报文缓冲区管理

报文缓冲区管理(Message Buffer Managing, MBM)是为了保证数据的一致性和FlexCAN操作的正确性。为对报文实现双缓冲,FlexCAN设置了两个串行报文缓冲区(Serial Message Buffer, SMB)。这两个缓冲区用于存放FlexCAN接收到的报文和待发送的报文。某一时刻只能有一个串行报文缓冲区处于激活状态。

1)报文缓冲区失活

在当前匹配/仲裁期间,任何CPU写MB的控制/状态字段都将使得MB从发送/接收过程中移除。这种机制称为MB失活,它是暂时性的,只影响当前匹配/仲裁周期。失活的目的在于保证数据的一致性。在匹配/仲裁处理时扫描所有MB决定哪一个MB进行发送或接收。如果CPU在仲裁期更新MB,将造成MB的数据不一致,因此MB需要失活。但是即使采用失活的机制,不在冻结模式下时,写已激活MB的控制/状态字段也可能导致意想不到的结果。因此如果需要改变某一个被激活的 MB的控制/状态字段,建议先使模块进入冻结模式后再进行修改。

2)锁定和释放报文缓冲区

当CPU读一个已激活且不为空的接收报文缓冲区的控制/状态字段时,FlexCAN假定CPU想要以一种原子操作读整个报文缓冲区,然后置要读报文缓冲区的内部锁定标志,这种操作称为锁定。CPU读自由运行计数器(全局解锁操作),或读另一个报文缓冲区的控制/状态字段时将解除锁定,这种操作称为释放。报文缓冲区的锁定是为了防止当CPU读某一个报文缓冲区时,一个新的帧被写入到缓冲区中,造成数据丢失。锁定机制只适用于接收报文缓冲区,即CODE字段不是 0000 (MB未被激活)或0100 (MB被激活但为空)的报文缓冲区。

2. 仲栽处理

仲裁处理是报文缓冲区管理执行的一个算法,它扫描整个MB内存,寻找具有最高优先级的报文并发送。所有被设置为发送缓冲区的MB都会被扫描,用于确定最小的ID或者最小的MB序号。具有最小ID的报文还是最小序号MB内的报文优先发送,取决于CANCTRL1的LBUF位。

仲裁处理发生在以下过程中:CAN帧的CRC校验过程;CAN帧的错误界定过程;在仲裁中获胜的MB失活的间隙,或没有MB需要发送,但是在前一次仲裁结束后CPU写了某一个MB的控制/状态字段的间隙;报文缓冲区管理(MBM)空闲或者总线关闭且CPU写了某一个MB的控制/状态字段时;冻结模式退出过程。

当具有最高优先级的MB被选中后,它被放入称为串行报文缓冲区(SMB)的临时存储空间中,与正常的报文缓冲区具有相同的结构,但是对用户不可见,该操作称为移出。

3. 匹配处理

匹配处理是扫描整个MB内存,寻找与CAN总线上接收到的帧的ID相匹配的接收缓冲区的一个算法。只有被设置为接收的MB才参与匹配。CAN总线上的帧的ID、DLC和数据字段都被检索,并暂时保存在串行报文缓冲区SMB中。匹配处理发生在 CRC字段。如果找到一个匹配的MB,则在CAN协议的帧结束的第6个位时间,SMB的内容被移到匹配的MB中,该操作称为移入。如果这期间检测到任何协议错误 (CRC或ACK等),移入操作都不会发生。具有匹配ID的MB在没有被锁定(即CODE =0100、0010或0110的MB,或CPU读MB的控制/状态字段解锁了的MB)时,还可以接收新的帧。

通过使用ID接收掩码,可以匹配一系列ID。 FlexCAN通过3个掩码寄存器 (RXGMASK、RX14MASK和RX15MASK ) 来支持掩码机制。在匹配算法中,如果掩码位被置位,则相应ID位被验证。反之,则相应ID位不进行验证。 10. 2. 6 FlexCAN动构件设计 1. FlexCAN初始化

1) FlexCAN初始化过程

FlexCAN的初始化包括复位以后报文缓冲区的初始化配置和CAN通信参数的配置,以及在操作过程中可能需要再次配置的选项。FlexCAN可通过以下三种方式来复位。

? 设备级硬件复位:同步复位所有的内存映像寄存器; ? 设备级软件复位:同步复位部分内存映像寄存器; ? CAM1CR的SOFTRST位:与设备级软件复位等效。

由于复位是同步的且需要按照一定的时序执行一个请求/应答程序,因此它需要一定的时间来完成。复位过程中SOFTRST位保持为1,复位完成后自动清0。用户可以通过查询该位来判断软复位是否结束。注意,任意低功耗模式下的时钟关闭都将导致软复位失败,因此在执行软复位前必须退出低功耗模式且重启时钟。

当FlexCAN模块处于禁止模式时,通过设置CANCTRL的CLK_SRC选择时钟源、清0CANMCR的MDIS位使能FlexCAN以后,FlexCAN自动进入冻结接式。在冻结模式下,FlexCAN与CAN总线不同步。CANMCR寄存器的HALT和FRZ位置位,内部状态机被禁止,且CANMCR寄存器的FRZACK和NOTRDY位被置位。CANTX引脚变为1状态且FlexCAN不能进行任何CAN帧的发送/接收。由于复位不影响报文缓冲区,所以它不能被自动初始化。

对FlexCAN模块的任何配置改变或初始化操作,都必须在冻结模式下进行。下面是通用的初始化配置步骤。

(1) 初始化CANCTRL寄存器中的操作模式:①设置位时序参数,如PR0PSEG (传播时间段)、PSEGS1 (相位段1)、PSEG2 (相位段2)、RJW(再同步补偿宽度);②通过对PRESDIV域进行编程设置时钟;③通过LBUF位选择内部仲裁模式。

(2) 初始化报文缓冲区:①设置控制/状态字段,设置所有报文缓冲区为激活或非激活状态;②根据需要初始化每一个报文缓冲区的所有其他项。

(3) 根据接收掩码的需要初始化RXGMASK(全局掩码寄存器,适用于缓冲区 0?13)、RX14MASK (缓冲区14独立掩码寄存器)和RX15MASK((缓冲区15独立掩码 寄存器)。

(4) 初始化FlexCAN中断处理:①根据所需中断,初始化中断控制寄存器;②在IMASK (中断掩码寄存器)中设置相应掩码位、相关报文缓冲区中断和CANCTRL(总线开关和错误中断)。

(5) 清CAMCR的HALT (FlexCAN配置寄存器的HALT位)。 此时FlexCAN试图同步CAN总线。

2) FlexCAN初始化函数设计

下面简要给出初始化配置函数的内容。

FlexCAN模块共有16个报文缓冲区(MB),每个MB都可以被独立配置成发送/接收报文缓冲区,支持发送或接收标准/扩展数据帧和远程帧。每个MB可包含多达8字节数据,每个MB对应一个中断标志位用以标志该MB发送/接收是否完成。MB发送报文的优先级,由仲裁算法根据MB序号或报文ID来决定。报文匹配算法保证报文缓冲区只接收并保存与报文缓冲区ID相匹配的报文。掩码机制使得MB可以与ID在一定范围内的CAN帧相匹配,而不是只接收与MB的ID相等的报文。数据一致性机制用来保证CPU操作MB数据的完整性。

在进行功能描述之前,我们先来明确一个概念。如果某一报文缓冲区在某一时刻参与当时的匹配和仲裁算法则称为被激活。如果报文缓冲区的CODE域为0000,那么该报文缓冲区被配置为接收缓冲区,且为空闲状态,没有被激活。相似地,如果报文缓冲区的CODE域为1000,那么该报文缓冲区被配置为发送缓冲区,且为空闲状态,没有被激活。当CPU写MB的控制/状态字段时,没有被设置为0000或 1000的MB是暂时停止的,不参与仲裁/匹配。

2. 数据帧发送

1) 数据帧发送的过程

FlexCAN模块16个报文缓冲区(MB)中的任意一个都可以被配置成发送缓冲区,且每个MB每次最多可以发送8字节数据。以第0个缓冲区MB0为例(其他MB的配置与MB0配置方法相同),将MB0配置为发送缓冲区并进行标准/扩展数据帧发送的步骤如下所述。

(1) 写MB0控制/状态字段的4位CODE域=1000,配置MB0为发送报文缓冲区且为空闲状态。

(2) 如果要通过MB0发送一个扩展帧则需进行如下设置:写标准ID和扩展ID 到MB0的ID字段;写待发送数据字节到MB0的数据字段;将MB0控制/状态字段的IDE位和SRR位置位;将待发送数据长度写入MB0控制/状态字段的4位LENGTH域。如果要通过MB0发送一个标准帧则需进行如下设置:写标准ID到MB0的标准ID字段;写MB0的扩展ID字段为0;写待发送数据字节到MB0的数据字段;将待发送数据长度写入MB0控制/状态字段的4位LENGTH域。

(3) 写MB0控制/状态字段的RTR位=0,4位CODE域=1100,激活报文缓冲区,启动数据帧发送。

(4) 由于发送过程需要一定时间,所以需要延时一定时间然后再判断发送是否完成。一旦MB0发送数据帧成功则中断标志寄存器IFLAG中的BUF0I位(即MB0 发送完成标志位)将被置位。此时若允许中断(中断掩码寄存器IMASK的BUF0M位被置位),将触发MB0中断。

(5) —次发送完成,需清中断标志寄存器IFLAG中BUF0I位。 2) 数据帧发送的函数设计

3. 数据帧接收

1) 数据帧接收的过程

FlexCAN模块的16个报文缓冲区(MB)也可以独立配置成接收缓冲区,并支持标准/扩展帧接收。

仍以MB0为例(其他MB的配置与MB0配置方法相同),将MB0配置为接收缓冲区并

进行标准/扩展帧接收的步骤如下所述。

(1) 写该MBO的控制/状态字段的4位CODE域=0000,配置MB0为接收缓冲区且为空闲状态^

(2) 如果要通过MB0接收一个扩展帧,则首先写标准ID和扩展ID到MB0的ID 字段,然后将控制/状态字段的IDE位和SRR位置位。如果要接收一个标准帧,则需写标准ID到MB0的标准ID字段,并写MB0的扩展ID字段为0。

注意:接收报文缓冲区的ID字段将结合RXGMASK的设置,及控制/状态字段的IDE位来过滤报文。

(3) 写MB0的控制/状态字段的4位CODE域=0100,激活接收缓冲区,启动接收。 (4) 一旦MB0接收到数据,则中断标志寄存器IFLAG中的BUF0I位将被置位,此时若允许中断(中断掩码寄存器IMASK的BUF0M位被置位)将触发MB0中断,用户可以通过查询相应标志位,或通过中断读取接收报文缓冲区数据。

2) 数据帧接收的函数设计

10. 3 CAN驱动构件测试实例

自测程序SelfTest 和CAN通信程序CANBus。 10.3.1 回环测试

自测程序SelfTest主要用于测试芯片的FlexCAN模块是否正常,程序通过MB10间隔一秒发送一个数据帧,然后通过MB8进行接收,并将接收到的数据帧通过串口发送到PC,用户可以通过串口调试工具观察到MB8接收到的数据。 1. 主函数

2. 中断函数

CAN的中断函数调用CANRecData函数把数据接收到数据缓冲区,同时清除接收成功标志。

10.3.2 非回环测试

CANBus实现三个CAN节点进行通信。三个CAN节点分别标记为节点A、节点B和节点C。三个节点可使用3块带FlexCAN通信接口的K60实验板来代替。

标志符的分配如下。

节点A: ID=0x0A;节点B: ID=0x0B;节点C: ID=0x0C?

假设三个节点通信均传输标准数据帧,节点A为服务器节点,负责接收所有客户端节点发送的数据帧,将接收到的数据通过串口发送到PC,并应答接收到数据帧。节点B每隔一段时间向节点A发送ID为0x0B,数据为“IamNodeB”的标准数据巾贞,节点C每隔一段时间向节点A发送ID为0x0C,数据为“IamNodeC”的标准数据帧。节点A若收到B节点发来的数据帧则向B发送一个数据为“RepNodeB”的标准数据帧;若收到C节点发来的数据帧则向C发送一个数据为“RepNodeC”的标准数据帧。

所有节点均使用MB10作为发送缓冲区,MB8作为接收缓冲区。 上述通信过程的实现步骤如下所述。 1. 节点A设置

(1)设置MB8为接收缓冲区,接收任意ID的标准数据帧。MB8的ID设置为0x0A,全局掩码寄存器RXGMASK设置为0。设置语句如下。

由于全局掩码寄存器RXGMASK只能在冻结模式下设置,所以需放在初始化函数中设置。

(2)设置MB10为标准数据帧发送报文缓冲区。当收到节点B发送的数据帧时,发送ID为0x0B,数据为“RepNodeB”的标准数据帧。当收到节点C发送的数据帧时,发送ID为0x0C,数据为“RepNodeC”的标准数据帧。设置语句如下。

2. 节点B设置

(l)设置MB10为发送报文缓冲区,发送ID为0x0B,数据内容为“IamNodeB”的标准数据帧。

(2)设置MB8为接收ID为0x0B的标准数据帧的报文缓冲区。全局掩码寄存器 RXGM-ASK设置为Ox1FFFFFFF,只接收节点A发送的标准数据帧。 3.

节点C设置

(l)设置MB10为发送报文缓冲区,发送ID为0x0C,数据内容为“IamNodeB”的标准数据帧。

(2)设置MBS为接收ID为0x0C的标准数据帧的报文缓冲区。全局掩码寄存器RXGM-ASK设置为Ox1FFFFFFF,只接收节点A发送的标准数据帧。

10.4 本章小结

CAN总线利用差分方法进行信号表达,它是一种半双工通信方式。CAN总线协议中有四

种报文帧,它们分别是数据帧、远程帧、错误帧和过载帧。CAN网络节点的信息帧可以分出优先级,这为有实时性要求的控制提供了方便。CAN模块利用“无损”的逐位仲裁机制,通过“线与”的方式实现。报文缓冲区管理是为了保证数据的一致性和FlexCAN操作的正确性。为对报文实现双缓冲,FlexCAN设置了两个串行报文缓冲区。这两个缓冲区用于存放FlexCAN接收到的报文和待发送的报文。某一时刻只能有一个串行报文缓冲区处于激活状态。CAN通过对接收和发送缓冲区的管理实现信息帧的接收/发送的控制。本章按照嵌入式构件的思想封装了CAN驱动构件程序,CAN构件程序由hw_can. h和hw_can. c构成,实现了CAN 模块初始化函数(CANInit)、CAN发送数据函数(CANSendData)、CAN接受数据函数(CANRecData)等。读者若要使用CAN驱动构件,只需要将构件程序CAN直接复制到用户目录下的hwComponent即可。在使用CAN构件程序的过程中读者一定要充分理解CAN总线数据发送与接收的过程、CAN总线的硬件连接,才能对程序执行过程中出现的所有情况有全面的认识。

习 题

1. 简述K60的CAN模块的主要特性。

2. 简述CAN总线最简单的电路发送和接收的过程,判断最简单的电路和带有 收发器的电路是不是前者是“一边发一边收”而后者是“只发不收或者只收不发”° 3. 画出无须CAN收发器芯片的两个K60的CAN模块连接电路^ 4. 简述K60的CAN初始化过程。

5. 简述K60的CAN发送数据帧和接收数据帧过程。

6. 编程:CANBus实现三个CAN节点通信。三个节点均传输标准数据帧^节点 A通过串口接收高端命令,控制节点B和节点C。节点B接收到节点A命令后,返回 节点A数据“IamNodeB”。节点C接收到节点A命令后,返回节点A数据 “IamNodeC”。

种报文帧,它们分别是数据帧、远程帧、错误帧和过载帧。CAN网络节点的信息帧可以分出优先级,这为有实时性要求的控制提供了方便。CAN模块利用“无损”的逐位仲裁机制,通过“线与”的方式实现。报文缓冲区管理是为了保证数据的一致性和FlexCAN操作的正确性。为对报文实现双缓冲,FlexCAN设置了两个串行报文缓冲区。这两个缓冲区用于存放FlexCAN接收到的报文和待发送的报文。某一时刻只能有一个串行报文缓冲区处于激活状态。CAN通过对接收和发送缓冲区的管理实现信息帧的接收/发送的控制。本章按照嵌入式构件的思想封装了CAN驱动构件程序,CAN构件程序由hw_can. h和hw_can. c构成,实现了CAN 模块初始化函数(CANInit)、CAN发送数据函数(CANSendData)、CAN接受数据函数(CANRecData)等。读者若要使用CAN驱动构件,只需要将构件程序CAN直接复制到用户目录下的hwComponent即可。在使用CAN构件程序的过程中读者一定要充分理解CAN总线数据发送与接收的过程、CAN总线的硬件连接,才能对程序执行过程中出现的所有情况有全面的认识。

习 题

1. 简述K60的CAN模块的主要特性。

2. 简述CAN总线最简单的电路发送和接收的过程,判断最简单的电路和带有 收发器的电路是不是前者是“一边发一边收”而后者是“只发不收或者只收不发”° 3. 画出无须CAN收发器芯片的两个K60的CAN模块连接电路^ 4. 简述K60的CAN初始化过程。

5. 简述K60的CAN发送数据帧和接收数据帧过程。

6. 编程:CANBus实现三个CAN节点通信。三个节点均传输标准数据帧^节点 A通过串口接收高端命令,控制节点B和节点C。节点B接收到节点A命令后,返回 节点A数据“IamNodeB”。节点C接收到节点A命令后,返回节点A数据 “IamNodeC”。

本文来源:https://www.bwwdw.com/article/1rxo.html

Top