下面结合本发明的特定实现,即根据由飞利普半导体(PhilipsSemicon-ductors)公司制造的XA-C3微控制器对本发明加以说明。当然,显然本发明不限于该特定实现,在此公开的本发明的一个或多个方面和特征可以被单独地或结合起来用于任何所需的应用场合,如独立的CAN控制器或作为其它控制器或系统的一部分。
下面是在描述本发明最佳实施例(即XA-C3微控制器)时所用到的术语,他们的定义如下:
标准CAN帧: 标准CAN帧的格式在图1中表示。
扩展CAN帧: 扩展CAN帧的格式也在图1中表示。
接受过滤: CAN装置所执行的过程,目的是确定应该接受一个CAN帧还是不予理睬,而一旦接受,就把该帧储存到预先分配的消息对象中。
消息对象: 与特定接受过滤器相联系的具有预先规定尺寸(对CAL消息不超过256个字节)的接收RAM缓存器;或指用户为了发送一个完整的CAN数据帧而将全部所需的数据预先加载到的发送RAM缓存器。消息对象可以看成是通信信道,通过该信道,可以发送一条完整的消息或一连串消息。
CAN仲裁ID: 放在CAN帧标题的、长度为11比特(标准CAN2.0帧)或29比特(扩展CAN2.0B帧)的标识(ID—identifier)字段。该ID字段用来对访问CAN总线的帧作出仲裁。还用在CAN帧接受的接受过滤和发送预仲裁。
筛选器ID: 从输入消息中抽取然后在接受过滤中使用的长度为30比特的字段。筛选器ID包括CAN仲裁ID和IDE比特,最多可含有2个数据字节。这30个被抽出的比特是由接受过滤判为合格的信息。
匹配ID: 用户预先规定的长度为30比特的字段,用来和输入筛选器ID作比较。用户负责将每32个消息对象的各个匹配ID编程写入指定的内存映射寄存器(MMR)中。
屏蔽: 由用户预先规定的29比特长的字段,该字段能够在接受过滤器的任何特定比特(或比特的组合)处不考虑(屏蔽)匹配ID比较。各个屏蔽与消息对象一一对应,它们被用户编程写入指定的MMR中。各个屏蔽模式保证:对多个被确认的CAL/CAN帧,单一的接收对象可筛选,这样就可以将专供于这种优先级帧的接收对象的数目减到最少。屏蔽各个消息对象的能力是重要的新的CAL特征。
CAL: CAN应用层(CAN Application Layer)。这是使用CAN物理层和CAN帧格式扩展CAN功能并且符合CAN规范的任何高级协议的通用术语。其中,CAL允许发送超出CAN帧固有的8字节数据长度限制的消息。具体做法是将每条消息划分到多个分组(packet),每个分组是作为一个长度不超过8字节的CAN帧被发送。这种消息通常被称作“分段的”或“分片的”消息。构成完整的分段消息的各个CAN帧通常不是以连续方式发送,而是不同的相互无关的消息的各个CAN帧在CAN总线上交织起来发送,如图2所示。
分段消息: 一条长消息(超过8字节)被划分到多个数据分组然后用一连串的各个CAN帧发送。这种用系列CAN帧构成这些长消息的特定方式将根据特定的CAL环境来定义。XA-C3微控制器自动地用硬件将这些分组重新组装成原来的长消息,并当完整的(重新组装好的)消息可以作为相关的接收消息对象被使用时(通过中断)发出报告。
消息缓存器: XA数据存储器中的一块地方,用来存放输入(接收的)消息或输出的(发送的)消息。
MMR: 内存映射寄存器(Memory MappingRegister)。片上命令/控制/状态寄存器,其地址被映射到XA数据储存空间,并被XA处理器作为数据储存器访问。对XA-C3微控制器而言,每8个专用MMR为一组与一个消息对象相联系。另外,有几个MMR,其比特控制全局参数,后者适用于所有消息对象。
参阅图3,可以看到XA-C3微控制器20的高级功能块的示意图。XA-C3微控制器20包括下列功能模块,这些模块是制作在单片的有44引出脚的PLCC或44脚的LQFP封装的集成电路(IC)上的。
XA CPU内核22目前用16位全静态CPU实现,具有24位的程序和数据地址范围,向上与80C51体系结构兼容,最高工作频率可达30MHz。
程序或代码存储器24目前用32K ROM/EPROM实现,而且通过内部程序总线25与XA CPU内核22实现双向耦合。图4说明代码储存空间的映射。
数据RAM 26(内部或暂存数据储存器),目前为占整个XA-C3存储空间中的大小为1024字节的部分,并且通过内部数据总线27与XA CPU内核22实现双向耦合。
片上消息缓存RAM或XRAM 28,目前为占整个XA-C3数据储存空间中大小为512字节的部分,它可能包含部分或全部CAN/CAL(发送和接收对象)消息缓存器。
存储器接口(MIF)单元30,它通过外部地址/数据总线32、内部内核数据总线34、以及内部MMR总线36提供与诸如SRAM、DRAM、快闪储存器、ROM和EPROM存储器件的一般储存器的接口。
DMA引擎38提供32个CAL DMA通道。
多个片上内存映射寄存器(MMR)40被映射到整个XA-C3数据储存空间—整个XA-C3数据存储空间中有大小为4K字节的部分保留给MMR使用。这些MMR包括32个(消息)对象或地址指针和32个筛网ID或匹配ID,对应于32个CAL消息对象。图5的表格提供了所有MMR的完整列表。
2.0B CAN/DLL内核42是CAN控制器内核Philips公司的SJA1000CAN(2.0A/B)数据链路层(CDLL)器件(自今以后称为“CAN内核块(CAN Core Block)”(CCB));以及,
一系列标准的微控制器外围设备,它们通过特殊功能寄存器(Special Function Register—SFR)总线43实现与XA CPU内核22的双向耦合。这些标准微控制器外围设备包括:通用异步收发器UART(Universal Asynchronous Receiver Transmitter)49、SPI串行接口(端口)51、三个标准的具有切换功能的定时器/计数器(即定时器模块53中的定时器0和定时器1,以及定时器模块54所包含的定时器2)、看门狗定时器55和四个8位I/O端口(也就是模块61所包含的端口0-3,每个口有4个可编程输出配置)。
DMA引擎38,RMM40和CCB 42可整体地视为CAN/CAL模块77的组成部分,并将会在以下的说明过程中多次提到。而且,在CAN/CAL模块77内部还包含特定的逻辑元件,它们起着“消息管理”和“消息处理”的功能,在以下整个说明过程中将会多次分别称为“消息管理引擎”和“消息处理程序”。其它名词术语将在以下阐述过程中介绍时定义。
正如先前所提到的,XA-C3微控制器20自动地用硬件实现许多消息管理和其它功能,而这些功能先前只能用运行于主CPU上的软件实现(或者根本没有实现),包括透明自动重新组装多达32个并发的、交织的、多帧分段的CAL消息。对每一个安装运行于主CPU(即XA CPU内核22)的应用来说,用户(软件编程人员)必须设置硬件去实现这些功能,方法是按照“XA-C3功能规范”和“XA-C3 CAN传输层控制器用户手册”对某些MMR和SFR进行编程。对寄存器编程的过程大多数情况下牵涉到对本发明的理解,并将在以下文字中介绍,接下来是阐述各种消息管理和其它功能,这些功能是经用户适当设置之后在XA-C3微控制器20的工作过程中由CAL/CAN模块77自动完成的。在这些章节后,将给出与本应用有关的具体发明的更详细描述。
设置/编程过程
作为初始化,用户必须映射整个XA-C3数据储存空间,如图5所示。特别是,在某种限制的情况下,用户必须指定XRAM 28的起始地址或基地址,以及MMR 40的起始地址或基地址。MMR 40的基地址可以通过对特殊功能寄存器SFR:Special FunctionRegisters)MRBL和MRBH进行适当编程来指定。XRAM 28的基地址可以通过对MMR指定的MBXSR和XRAMB(参见图4)恰当编程来确定。
用户可以将保留给MMR 40的4K字节的空间放在XA体系结构所支持的整个16M字节的数据储存器空间的任何地方,但储存器空间的最底部(即从地址000000h开始的第一1K字节部分)除外,因为在这个地方可能会与用作内部或暂存储存器的片上数据RAM 26发生冲突。4K字节的MMR空间总是会从4K边界开始。MRBH和MRBL的复位值相应为0Fh和F0h。因此复位后,MMR空间被映射到数据段0Fh的最上面的4K字节,但对MMR 40的访问被禁止。MMR空间的头512字节(偏移000h-1FFh)是对象n=0-31的消息对象寄存器(每消息对象8个),如图6所示。
XRAM28的基地址由MMR指定的MBXSR和XRAMB的内容确定,如图7和图8所示。正如先前所提到的,512字节的XRAM 28是32个(Rx/Tx)消息缓存器(对应于消息对象n=0-31)中的某些(或全部)驻留的地方。消息缓存器可以片外扩展到最大8K字节。片外扩展的容量可容纳32个256字节的消息缓存器。因为所有消息缓存器地址的最高8位内容由MBSXR寄存器的内容构成,XRAM 28和所有32个消息缓存器必须驻留在同一个64K字节的数据储存段。因为XA-C3微控制器20只将地址线A0-A19提供给外部储存器访问用,故所有外部储存器地址必须在地址空间的最低1M字节的范围内。所以,如果存在一个外部储存器,其中所述32个消息缓存器中的任何一个要映射到系统的该外部储存器,则所有32个消息缓存器和XRAM 28也必须整个地映射到同一个64K字节段,而且不能超出1M字节的地址界限。
储存器空间被映射过后,用户可以建立或定义多达32个单独的消息对象,其中每一个都可以是发送(Tx)或接收(Rx)消息对象。一个Rx消息对象既可以和唯一的CAN ID联系,也可以和CAN ID的一个集合相联系,集合中所有CAN ID共享某ID比特字段。正如先前所提到的,每一个消息对象都有其自己的数据储存器空间保留块(最大256字节),称为该消息对象的消息缓存器。我们将会看到,每个消息对象的缓存器的大小和基地址都是可以编程的。
正如先前所提到的,每一个消息对象都与一组该消息对象专用的8个MMR 40相联系,它们之中有些寄存器对Tx消息对象起的作用与对Rx消息对象起的作用有所不同。这8个MMRs 40被称为“消息对象寄存器”(参阅图4)。
这八个MMR 40的名称是:
1.MnMIDH 消息n匹配ID高
2.MnMIDL 消息n匹配ID低
3.MnMSKH 消息n屏蔽高
4.MnMSKL 消息n屏蔽低
5.MnCTL 消息n控制
6.MnBLR 消息n缓存器存储单元寄存器
7.MnBSZ 消息n缓存器大小
8.MnFCR 消息n分段计数寄存器
其中n的范围是从0到31(即对应32个独立的消息对象)。
一般说来,用户定义或建立一个消息对象的方法是配置(编程)某些或全部八个专用于该消息对象的MMR实现的,下面将进一步说明这一点。而且,即如下面所述,用户必须配置(编程)全局GCTL寄存器,该寄存器的各位控制着施用于所有消息对象的全局参数。
具体地说,用户可以指定每一个消息对象的匹配ID值,而该值将与从输入CAN帧中抽取的筛选器ID值作比较,以便进行接受过滤。每一个消息对象n的匹配ID值将在与所述消息对象n相联系的MnMIDH和MnMIDL寄存器中指定。用户可以将筛选器ID中那些不准备在接受过滤中使用的位屏蔽掉,做法是,一个对象接着另一个对象地在与每一个特定消息对象n相联系的适当的MnMSKH和/或MnMSKL寄存器中那些需要的(将被屏蔽的)比特位置写入逻辑“1”。在创建时,用户要负责为每一个消息对象n分配唯一的消息缓存器存储单元,具体做法是,用户可以通过对与消息对象n相联系的寄存器MnBLR编程来指定每一个特定的消息对象n的消息缓存器的基地址的最低16有效位。即如先前所讨论的那样,所有消息对象的24位地址的高8位是由MBXSR寄存器的内容指定的,这样就可以让所有消息对象的消息缓存器驻留在同一个64K字节的储存段中。在创建时,用户还负责指定每一个消息对象n的消息缓存器的大小。具体地说,用户通过对与每一个消息对象n相联系的MnBSZ寄存器进行编程来指定每一个特定消息对象n的消息缓存器的大小。每个消息对象的消息缓存器的顶部存储单元由相应MnBSZ寄存器中指定的所述消息缓存器的尺寸大小来确定。
用户可以配置(编程)与每一个特定的消息对象n相联系的MnCTL寄存器以便可以激活或禁止该消息对象n;以便定义或指定该消息对象n为Tx或Rx消息对象;以便允许或禁止对该消息对象n的分段Rx消息做自动硬件装配(即自动分段消息处理);以便允许或禁止自动产生该消息对象n的消息完成中断;以及,以便允许或不允许该消息对象n用于远程发送请求(RTR)处理。在CANopen和OSEK系统中,用户还必须初始化与每一个消息对象n相联系的MnFCR寄存器。
正如先前所讲的,创建时,用户必须配置(编程)全局GCTL寄存器,该寄存器的各位控制着施用于所有消息对象的全局参数。具体地说,用户可以配置(编程)GCTL寄存器,以便指定使用的高级CAL协议(如果有的话)(例如,DeviceNet、CANopen、或OSEK);以便允许或禁止自动确认CANopen帧(CANopen自动确认);以及,以便指定采用两个发送(Tx)预仲裁方案/策略的其中一个(也就是,或者基于CAN ID的Tx预仲裁,这种方案中对象号被用作第二仲裁器,或者仅基于对象号的预仲裁方案)
接收消息对象和接收过程
在接收过程中(即,当输入CAN帧正被XA-C3微控制器20接收的时候),CAN/CAL模块77将输入CAN帧储存在暂时的缓存器(13字节)中,并确定是不是已经成功地接收到了完整的、没有错误的CAN帧。如果确定已成功地接收到完整的、无差错的CAN帧,然后,CAN/CAL模块77启动接受过滤,以便确定是接收、储存或忽略/丢弃该CAN帧。
接受过滤
一般来说,XA-C3微控制器20为用户提供了对32个独立的消息对象中的每一个的各自的匹配ID和屏蔽字段的编程能力。如前面所述,XA-C3微控制器20执行的过滤过程可以表现为“匹配与屏蔽”技术的特征。此接受过滤过程的基本目的就是确定所接收的CAN帧的筛选器ID字段(不包括被每个消息对象的屏蔽字段所屏蔽掉的“不用管”的位)是否与32个消息对象中任何被允许了的已经指定接收消 息对象的匹配ID相匹配,如果被接收的CAN帧和一个以上的消息对象相匹配,则该被接收的CAN帧就被认为与具有最低对象号(n)的消息对象相匹配。
XA-C3微控制器20如下所述地执行接受过滤:
(1)从输入(被接收的)CAN帧中提取出筛选器ID字段。在这方面,从输入位流装配的筛选器ID字段对标准的CAN帧与对扩展的CAN帧是不一样的。具体地说,如图9所示,标准CAN帧的筛选器ID字段有28位,包括从所接收到的CAN帧的标题抽取的11个CAN ID位,加上接收的CAN帧的第一和第二数据字节(Data Byte 1和Data Byte 2)的2×8(16)位,再加上IDE位。这样,对标准CAN帧而言,用户就需要设置屏蔽字段(MnMSKL寄存器)中的Msk1和Msk0位,也就是设为“不用管”。另外,在许多基于标准CAN帧的应用场合,要么Data Byte 1,要么Data Byte 2,或者两者都不参加接受过滤。在这样的应用场合,用户还必须将未用的Data Byte屏蔽掉。IDE位是不可屏蔽的。如图10所示,扩展CAN帧的筛选器ID字段是30位的,包括29个从输入CAN帧标题抽取的CAN ID位加上IDE位。这里,IDE位也是不可屏蔽的。
(2)然后,所接收的CAN帧的装配筛选器ID字段依次和所有当前被允许了的接收消息对象的寄存器MnMIDH和MnMIDL所规定的相应匹配ID值相比较。当然,任何被特定消息对象所屏蔽了的筛选器ID字段的位不在比较之中。这就是说,如果由某个特定消息对象的MnMSKH和MnMSKL寄存器所规定的屏蔽字段中某位的值是‘1’,则该特定消息对象的匹配ID字段的对应位就变成为“不用管”位,即是说,与所接收的CAN帧的筛选器ID的相应位比较时总是会产生出匹配的结果。
(3)如果上述比较过程产生出和不止一个消息对象匹配的结果,则认为所接收的CAN帧与拥有最低对象号(n)的消息对象相匹配。
消息储存
每一个经过接收过滤的输入(被接收的)CAN帧都会经DMA引擎38自动地存储到与该特定CAN帧匹配的接收消息对象的缓存器中。在示例性实现中,所有消息对象的消息缓存器都包含在XRAM 28中。
消息装配
一般说来,DMA引擎38会把每一个被接受的CAN帧从13字节的预缓存器转移到合适的消息缓存器中(例如,在XRAM28中),一次转移一个字,从MBXSR和MnBLR寄存器内容指定的地址开始。每次DMA引擎38转移一个字节或一个字时,它就需要请求总线。关于这点,MIF单元30就负责在XA CPU内核和DMA引擎38之间就访问权作出仲裁。总线仲裁是基于“交替”的策略作出的。DMA总线访问完成后,XA CPU内核22如果请求了的话,就将被授权访问总线(但是,XA CPU内核22的突发访问不能被DMA总线访问中断的)。
一旦获得MIF单元30授予的总线访问权后,DMA引擎38将会把数据从13字节的预缓存器写入到合适的消息缓存器中。DMA引擎不断地发出总线占用请求,不断地将消息数据依次写入到合适的消息缓存器,一直到整个所接受CAN帧被传送完毕为止。在DMA引擎38成功地将被接受的CAN帧传送到合适的消息缓存单元之后,消息缓存器中的内容将取决于该CAN帧所属的消息是非分段的(单帧的)消息还是分段的消息。下面将针对每种情况加以说明:
非分段的消息装配
对于那些已创建为禁止(不允许,即将该消息对象的寄存器MnCTL的FRAG位置“0”)将消息做自动分段处理的消息对象而言,当DMA引擎38成功地将所接受的CAN帧传送到与该消息对象相联系的消息缓存器时,所接受的CAN帧的完整的CAN ID(由11位或29位组成,取决于所接受的CAN帧是标准的还是扩展的CAN帧)被写入到与已被以为构成匹配的消息对象相联系的MnMIDH和MnMIDL寄存器。这样就允许用户的应用(程序)能够看到导致匹配的确实的CAN ID,即使该CAN ID的一部分因接受过滤而被屏蔽。这种机理所产生的结果是,每次接受一个输入CAN帧时,寄存器MnMIDH和MnMIDL的内容都可能改变。由于输入CAN帧必须通过接受过滤才能够被接受,故只有被屏蔽的位才可以改变。所以,作为对一个已被接受的输入CAN帧被传送到适当的消息缓存器事件的响应而改变寄存器MnMIDH和MnMIDL内容的结果,并没有改变匹配和屏蔽接受过滤的准则。
分段消息的装配
对于那些已创建为允许(即,将该消息对象的寄存器MnCTL的FRAG位置“1”)进行自动消息分段处理的消息对象,屏蔽11/29位CAN ID字段是不允许的。这样一来,被接受的CAN帧的CAN ID就会被一览无遗,并包含在与已被认为构成匹配的消息对象有关的寄存器MnMIDH和MnMIDL中。所以,没有必要将被接受的CAN帧的CAN ID写入到与已被认为构成匹配的消息对象有关的寄存器MnMIDH和MnMIDL中。
随着分段消息的后续的CAN帧被接收,新的数据字节添加到先前接收和储存的数据字节后面。这个过程一直进行下去,直到整个多帧消息被接收和储存到适当的消息缓存器。
根据CAL协议DeviceNet、CANopen和OSEK,如果消息对象是被允许的接收消息对象,且其有关的MnCTL寄存器中的FRAG位被置“1”(即允许与该特定的接收消息对象相关的自动分段消息装配),则每个所接收的与该特定的接收消息对象匹配的CAN帧的第一个数据字节(Data Byte 1)将只用来对分段信息进行编码,因而将不储存到该特定的接收消息对象的消息缓存器中。这样,这种“FRAG允许的”接收消息对象的消息储存将从第二数据字节(Data Byte 2)开始,并且以前述方式进行下去,直到整个多帧消息被接收和储存到适当的消息缓存器。消息储存格式如图11所示,消息处理硬件利用从每个CAN帧的第一数据字节中包含分段信息以便利于该过程。
根据CAN协议,如果消息对象是允许的接收消息对象,且其有关的MnCTL寄存器中FRAG位被置“1”(即允许该特定的接收消息对象进行自动分段消息装配),则使用图12所示的格式,将与该特定的接收消息对象相匹配的CAN帧顺次储存到该特定接收消息对象的消息缓存器中。
当把消息数据写入到与消息对象n有关的消息缓存器时,DMA引擎38将自动地产生从该消息缓存器基地址(在与该消息对象n有关的MnBLR寄存器中规定的)开始的地址。由于该消息缓存器的大小在与该消息对象有关的MnBSZ寄存器中规定,故DMA引擎38能够确定什么时候可以到达该消息缓存器的顶部。如果DMA引擎38确定已经到达该消息缓存器的顶部并且正被写入到该消息缓存器的消息还没有被传送完,则DMA引擎38将通过再次产生从该消息缓存器的基地址开始的地址而回转。有时候,在这种情况发生之前会产生告警中断,使用户应用(程序)可以采取必要的措施来防止数据丢失。
消息处理器一直跟踪通过DMA引擎38正被写入的消息缓冲器的当前地址位置以及正在指定的消息缓存器中装配的每个CAL消息的字节数。当某CAL消息的“消息结束”被解码后,消息处理器将完成通过DMA引擎38将整条CAL消息和字节计数写入指定的消息缓存器内,然后产生一个中断给XA CPU内核22,表示整条消息已被接收。
由于每个CAN帧的数据字节1(Data Byte 1)包含着分段的信息,所以它永远不会被储存在所述CAN帧的指定消息缓存器中。这样,每个CAN帧最多储存七个数据字节。当整条消息被储存完毕后,所述指定消息缓存器将包含实际接收到的消息数据字节数(分段信息字节除外)加00单元处的字节计数,所述单元00将含有已储存的信息数据字节总数。
应该指出的是,存在着几个特定的用户设置/编程的过程,当唤醒分段OSEK和CANopen消息的自动硬件装配功能时,这些过程是一定要遵照执行的。这些或其它细节将会在“XA-C3 CAN传输层控制器用户使用手册”中找到。该手册是“Provisional Application SerialNo.60/154,022(临时申请序列号60/154022)”的一部分,其公开已经被完整结合在此供各种场合使用。
发送消息对象和发送过程
为了发送一条消息,XA应用程序必须首先完成整条消息的装配并把它储存到指定给适当的发送消息对象n使用的消息缓存器中。消息标题(CAN ID和帧信息)必须被写入到与该发送消息对象n有关的寄存器MnMIDH、MnMIDL、和MnMSKH中。在完成这些步骤之后,该XA应用就准备好发送该消息。为了启动发送过程,与该发送消息对象n相联系的寄存器MnCTL中的对象允许位(OBJ_EN位)必须置位,发送CANopen的自动应答帧时除外。这将容许该准备发送消息参与预仲裁过程。就此而论,若准备发送的消息多于一个(即已经被允许的发送消息对象多于一个),则执行Tx预仲裁过程以确定选择哪一个被允许的发送消息对象来发送。有两种预仲裁策略,用户可以通过设置或清除GCTL寄存器的Pre_Arb位来进行选择。
当对消息处理器(handler)确定已经成功地发送一条完整的消息作出反映产生Tx消息完成中断后,Tx预仲裁过程“复位(reset)”,并重新开始。还有,如果“取胜”的发送消息对象后来失去了对CAN总线的占用权,则Tx预仲裁过程同样会复位和重新开始。如果仅有一个其OBJ_EN位被置位的发送消息对象,则不管选用何种预仲裁策略,这个发送消息对象都会被选中。
当某被允许的发送消息对象被选中发送时,DMA引擎38将开始从与该发送消息对象有关的消息缓存器中检索该发送消息数据,并开始将检索的发送消息数据传送到CCB 42准备发送。如前所述,相同的DMA引擎和地址指针逻辑用于发送消息的消息检索,象用于接收消息的消息存储一样。而且,如前所述,消息缓存器的位置和大小信息也用相同的方式指定。简言之,在检索到发送消息时,DMA引擎38将会相继把该发送消息写入到CCB 42中。在此过程中,DMA引擎38会不停地请求总线,在得到总线访问权后,就从地址指针逻辑当前所指向的消息缓存器的位置依次读出发送消息数据,并且,DMA引擎38将所检索到的发送消息数据写入到CCB 42中。应该指出,在准备供发送的消息的过程中,用户应用不必将CAN ID和帧信息字段包括在被写入到指定的消息缓存器的发送消息数据中,因为发送(Tx)逻辑将会直接从合适的MnMIDH、MnMIDL和MnMSKH寄存器中检索出该信息。
XA-C3微控制器20不会用硬件处理分段消息的发送。用户将负责将分段消息的每一个CAN帧写入到合适的消息缓存器中,有关的发送消息对象发送,等待这些工作完成后再将分段消息的下一个CAN帧写入到合适的消息缓存器中。因此用户应用必须一次一帧地发送多个CAN帧,直到整条多帧分段发送消息被成功地发送。然而,通过使用多个发送消息对象,可以将几个分段发送消息的CAN帧排队并将其启动,然后依次发送,其中,所述发送消息对象的对象数目相继增加并且其CAN ID已被同样配置。
有三种可能的方法来避免发送消息的过程中发生数据恶化:
1.如果启动发送消息的Tx消息完成中断,则每当接收到Tx消息完成中断,用户应用程序就会将下一条发送消息写入到指定的发送消息缓存器中。一旦中断标志被置位,就会确知未决的发送消息已经被发送。
2.等待有关发送消息对象的MnCTL寄存器的OBJ_EN位被清除,再向有关发送消息缓存器写入数据。具体做法是轮询有关发送消息对象的MnCTL寄存器的OBJ_EN位。
3.在发送消息对象仍然处于Tx预仲裁时,清除有关发送消息对象的MnCTL寄存器的OBJ_EN位。
在上面所讲的前两种情况下,所述未决的发送消息完全被发送后下一条发送消息才有机会发送。对上述第三种情况来说,所述发送消息将不被发送。而是让带有新内容的发送消息进入发送预仲裁过程。
还有另外一种机制来避免正被发送的消息的恶化。具体地说,如果正在进行发送消息对象的发送,则禁止用户清除与那个特定发送消息对象相联系的寄存器MnCTL的OBJ_EN位。
CAN/CAL有关的中断
XA-C3微控制器20的CAN/CAL模块77目前被配置成可以产生下列五种不同的事件中断给XA CPU内核22:
1.Rx消息完成
2.Tx消息完成
3.Rx缓存器满
4.消息错误
5.帧错误
对于单帧消息,在单帧结束时出现“消息完成”条件;对多帧(分段的)消息,在最后一帧被接收和储存后出现“消息完成”条件。由于XA-C3微控制器20的硬件不识别或处理发送消息的分段,在每个被成功发送的帧结束时,总会产生Tx消息完成条件。
正如先前讲到的,每一个消息对象都有一个与之有关的控制位来表示消息完成条件是否应该产生中断,或者只是将“消息完成状态标志”置位(供轮询用)而不是产生中断。这就是与每个消息对象n有关的MnCTL寄存器的INT_EN位。
存在两种16位的MMR 40,MCPLH和MCPLL,它们含有用于所有32个消息对象的消息完成状态标志。对特定的消息对象,如果检测到消息完成(发送的或接收的)条件,在MCPLH或MCPLL寄存器中相应的位就被置位。不论该特定的消息对象(与它的MnCTL寄存器相联系)的INT_EN位是否置位,或者不管任何其它消息对象的消息完成状态标志是否已经置位,这都会发生。
除了这32个消息完成状态标志外,还有一个Tx消息完成中断标志和一个Rx消息完成中断标志,对被命名为CANINTFLG的MMR40而言,它们分别对应于位[1]和位[0],它们会向XA CPU内核22提出实际的事件中断请求。当“消息结束(End-of-Message)”条件出现时,在消息完成状态标志被置位的同一时间,假如有关消息对象的INT_EN=1,以及该中断还没有设置和未决,则适当的Tx或Rx消息完成中断触发器就会被置位。
更多的关于中断产生和相关寄存器方面的详细情况可以参阅“XA-C3功能规范(XA-C3 Functional Specification)”以及“XA-C3CAN传输层控制器用户手册(XA-C3 CAN Transport Layer ControllerUser Manual),以上两种文件都是它们的父文件“临时申请系列60/154022(Provisional Application Serial No.60/154,022)”的一部分,其公开已完整地结合于此以供各种场合使用。
本发明
所有目前可利用的CAN设备,整个设备包括处理器内核、CAN/CAL模块、以及其它外围元件和部件,都必须是唤醒的(即接通电源且有效的),无论何时检测到任何CAN活动,或正在进行中,例如,每逢CAN消息正被接收、发送、装配、处理、储存、过滤或其他处理时,由于运行在主CPU上的CAL软件必须主动参与这些功能,例如,运行在主CPU上的CAL软件主动监视和管理消息数据的缓存和处理过程,以及多帧分段消息的装配等。在这方面,对于所有现有的CAN器件,任何省电的工作方式,如空闲、睡眠、或掉电的工作方式,都必须在全系统级被激活,以便使CAN设备进行任何CAN有关的活动,例如装配多帧分段消息。
在上述和以后的叙述中将会清楚地看到,最佳实施例中的XA-C3微控制器20除了提供许多增强的特性和更多的与CAL/CAN消息管理和处理有关的性能外,主要是执行所述CAL/CAN消息管理和处理的功能,包括用硬件自动进行多帧分段消息装配,由此将CPUCAL/CAN消息处理的开销(“CAL指令带宽一CAL instructionbandwidth”)从大约80%(利用目前的技术)减小到低至10%(用XA-C3微控制器20)。由于这种新颖的体系结构,在执行这些功能中的某些功能的有效工作期间,XA-C3微控制器20的XA CPU内核22(从今以后有时简称为“处理器内核”)、其它各种外围设备和CCB 42的组成部件,不再需要处于唤醒状态。
按照本发明,XA-C3微控制器20支持称为空闲方式的省电工作方式,这将显著减小电力消耗。在这一点上,光是将处理器内核22本身投入空闲方式,就可以减少电力消耗约15mA(30MHz时)。
总体来看,在空闲方式时,处理器内核“暂停”工作(进入“睡眠状态”)而且停止向处理器内核22输送时钟信号以便节省电力。这里所用的术语“停止”的含义是禁止、关闭时钟或用门电路阻断时钟向处于睡眠状态的元件或部件输送,例如向如处理器内核22输送。向某些外围部件输送的时钟也被停止,而其他外围设备(如定时器)则继续工作。当任何中断或系统复位事件发生时,空闲方式立即终止。
在XA-C3微控制器20中,CAN/CAL模块77占了整个芯片面积的大部分,相应地也占了大部分功率消耗。基于这一点,就很有必要在空闲方式中,如实际上不使用时关闭掉这一模块。但是,如果CAL/CAN模块77正在被使用,无论它正在处理什么,也要等到它完成手头的工作后才能关闭它。而且,在CAL/CAN模块77关闭以后,如果在CAN总线检测到什么新的活动,最重要的是立即唤醒CAL/CAN模块77去处理输入消息。一般认为,CAL/CAN模块77可以随意进入或离开它自己的空闲方式(Aidle mode@)而无需重新启动处理器内核22,处理器内核22(以及其它所选外围设备)可以无限期地停留在省电的(“空闲的”)方式,而CAL/CAN模块77可以在需要时被拉离空闲方式(Aidle mode@),而当不立即需要其功能时让它回到睡眠(Asleep@)状态。
根据本发明,所有实现“空闲”方式所需要的逻辑(在下文中,称作“睡眠控制模块”)包含在CCB 42中。在本实现中,CAN/CAL模块77的默认状态是空闲方式的唤醒状态,以便CAN正在进行发送或接收、或有关的消息管理时,处理器内核22可以“睡眠”。任何中断,例如Rx消息完成中断、Tx消息完成中断、Rx缓存器满中断、消息错误中断、帧错误中断、或任何其它内部或外部中断都会唤醒处理器内核22。所提供的一种选择是让用户将CAN/CAL模块77包含在空闲方式中。这种选择(“CAN/CAL模块睡眠允许”)可以由用户通过软件选择,方法是将的MMR 40的CANCMR(CAN命令寄存器)中的SLPEN位[3]置位。调用这种选项,即是,激活CAN/CAL模块睡眠允许功能,无论何时XA-C3微控制器20在空闲方式,CAL睡眠控制模块91(参见图13)都会不断地轮询所有包括CAN/CAL模块77的子部件或子模块,以便确定它们之中当前有无任何成员在进行消息处理活动。如果没有检测到任何进行中的活动,或一旦任何活动结束,睡眠控制模块91就会停止向整个CAN/CAL模块77输送时钟,由此让模块进入“睡眠”状态。接下来,如果在CAN Rx引脚93检测到信号转变,则向CAN/CAL模块77输送的时钟将会即时重新被允许,并且这个模块的全部运作将会恢复,以便它能够开始接收输入的帧。但是,不会产生中断,并且处理器内核22将继续睡眠。
一旦整个CAN帧被接收及(如果需要的话)被储存,CAN/CAL模块77的通常回到睡眠,直到在CAN总线上检测到新的CAN帧(即是,直到在CAN Rx引脚93检测到信号转变)为止。当XA-C3微控制器20处于空闲方式时,处理器内核22和XA-C3微控制器20的其它组成部分只有在整条消息已经被接收和装配时响应正常的中断才会被唤醒(当然,除非某些系统中断先于此时将它唤醒)。在本XA-C3微控制器20的实现中,从空闲方式唤醒是即时的,并且是通过任何中断启动的;而且,如果CAN/CAL模块77处于无效状态(进入睡眠),则空闲方式的Idd的范围为20-30mA(毫安);如果CAN/CAL模块77处于有效(唤醒)状态,则Idd的范围约为60-120mA(毫安)。
XA-C3 CAN/CAL模块的一个主要特征是其独一无二的自动用硬件组装长(Afragmented@)CAL消息的能力,该消息是通过多个独立的CAN帧传送的。有了这个功能,就有可能,而且很有可能在CAN总线活动开始之后,在需要处理一条完整的消息之前,让处理器内核22保持在省电方式(就是在“空闲”期间睡眠)一段很长的时间。在这段时间,CAN/CAL模块77可以反复地进入和离开它自己的省电方式(即睡眠状态)。在这一点上,处理器内核22和CAN/CAL模块77均被认为各自具有空闲方式,在CAN/CAL模块77反复进入和离开自己的空闲方式时,处理器内核22保持在空闲方式。让CAN/CAL模块77安稳睡眠(空闲或掉电方式)要满足的唯一条件是既没有进行中的CAN活动,也没有中断未决(即是,处理器内核22本身必须已经处于自己的空闲方式中)
在本XA-C3微控制器20的实现中的“掉电方式”的含义是主振荡器(未示出)被关断,此时不存在任何形式的芯片活动。在此方式的Idd的取值大约是几十微安。从掉电方式唤醒是通过系统复位或在外部中断0或1引脚(未示出)上的信号转变来完成的。唤醒周期是10000个振荡器时钟,利用这段时间足以发送几个CAN帧。如果在XA-C3微控制器20处于掉电工作方式时发生CAN RxD输入的转变,则处理器内核22将进入空闲方式(经历9892个时钟延迟后),并且CAN/CAL模块77将被激活去接收和处理输入的帧。当CAN/CAL模块77产生一个中断(或发生其它某些被允许的中断)时,并只有在那时,处理器内核22才会离开它的空闲方式并开始执行(程序)代码。要么是在中断服务程序重新开始代码执行,如果其优先级高于当前代码的话;要么是紧跟着掉电指令后面的指令重新开始代码执行。在这时,实际完成终结掉电方式。
如先前所讲的,术语“睡眠控制模块”指的是包含在CCB 42内的逻辑电路,它是进入“空闲”方式所需要的。现参阅图13来描述睡眠控制模块91。可以看到,睡眠控制模块91包括与(AND)门95和97,还有异步锁存器99。该异步锁存器99有一个输入端与CAN Rx引脚93相连。该异步锁存器99目前用交叉耦合的或非(NOR)门实现(未示出)。该异步锁存器99的输出(“No Rx”)通常处于逻辑高(“1”)电平。当在CAN Rx引脚93出现任何信号转变时,该信号转变就会清除异步锁存器99,由此驱动输出No Rx转向逻辑低(“0”)电平。
在工作的过程中,CAN/CAL模块77内每个独立的子模块(稍后描述)将Sleepokn(Asleepokn@)信号送回到睡眠控制模块91以表明它已准备好关闭(就是说,表示它没有进行任何CAN消息处理活动)。具体地说,假设有n个子模块,于是产生n个sleepkn信号。这些信号Sleepokn的每一个都表示提供子模块目前处于无效状态,而且,目前就该特定的子模块而言,它可以让CAN/CAL模块77进入睡眠状态。这n个sleepokn信号各自输入到与门95。由此,仅当子模块都表示了它们各自的sleepokn(Asleepokn@)信号,就是说,仅当所有的sleepokn(Asleepokn@)信号都处于逻辑高(‘1’)电平,表明CAN/CAL模块77内的所有独立的子模块当前都处于无效和准备进入睡眠的状态时,在与门95的输出端产生的sleep_enable(Asleep_enbale@)信号才会因此而处于有效状态(逻辑>1=)。在本XA-C3微控制器20的实现中产生sleepokn信号的CAN/CAL模块77内的独立的子模块由图14表示。这些子模块包括DMA引擎38、Tx预仲裁子模块101、消息管理子模块103、Tx逻辑子模块105、和消息指针/处理器子模块107。
在没有未决中断的情况下,sleep_enable(Asleep_enbale@)信号然后和由处理器内核22提供的全局的idle_mode(Aidle_mode@)信号进行逻辑与操作。具体地说,将sleep_enable和idle_mode信号作为第一和第二输入送到与门97,第三个输入到与门97的信号是异步锁存器99的输出No Rx。正如先前所讲的,异步锁存器99的输出No Rx的默认状态是有效(逻辑高),并且只有在响应CAN Rx引脚93上的信号转变时,即正在接收输入消息时才会变为无效(逻辑低)。
这样,只有在与门97的三个输入信号,即sleep_enable、idle_mode和No Rx,都是有效(逻辑高)时,与门97所产生的输出“ccb_idle_n”信号才会是有效(逻辑高)。为了让这种情况发生,必须要满足三个条件:
1.处理器内核22本身必须已经在自己的空闲方式;
2.所有在CAN/CAL模块77内的成员子模块必须表达出接受关闭的意愿;以及,
3.没有输入消息正被接收。
与门97的输出作为时钟禁止信号“ccb_idle_n”,当它处于逻辑高(‘1’)电平时,就会直接关断向整个CAN/CAL模块77输送的时钟。对检测到输入消息时作出反应而对异步锁存器99的清除会立即让时钟禁止信号ccb_idle_n转入无效,其结果是马上激活向CAN/CAL模块77输送的时钟。此时,CAN/CAL模块77将恢复全部功能并可以开始接收输入消息。当输入帧的最后一位被接收后,异步锁存器99立即被设置回逻辑>1=,使得它不再干预,也就是禁止时钟,这是因为它的输出“No Rx”也有效(逻辑‘1’)。但是,这时候CAN/CAL模块77内一个或多个子模块将主动地参与处理输入的帧并相应降低其sleepokn(Asleepokn@)线。一旦完成该帧的处理,假定该帧不是一条允许的消息的最后一帧,并假定CAN总线上没有另外的活动,向CAN/CAL模块77输送的时钟将被再次禁止并返回到它的空闲状态。当消息的最后一帧最终被接收和储存时,CAN/CAL模块77将向处理器内核22产生标准的message_complete(Amessage_complete@)中断请求。就像任何其它中断一样,该请求将结束全局idle_mode状态(即是,驱动idle_mode信号电平变低)并唤醒处理器内核22以及CAN/CAL模块77内任何正在睡眠的子模块。
而且,MMR40指定CANSTR(CAN状态寄存器)含有一个位CAL_SLEEP_OK,此位的值可以被处理器内核22所读取,而且,如果将此位置位(取值‘1’),则表示可以令CAN/CAL模块77睡眠。就此而论,如果处理器内核22想要使XA-C3微控制器20进入掉电方式,它必须首先从CANSTR寄存器读取此位(CAL_SLEEP_OK),以确定这样做是否安全。对处理器内核22来说,在进入其空闲方式之前没有必要读取该位,因为不管这位取什么值,处理器内核22都可以自由进入它的空闲方式,与CAN/CAL模块77无关。如果CAN/CAL模块77准备好,它将跟随进入。
虽然上面已经结合特定的最佳实施例(实现)对本发明作了详细的说明。需要明确指出的是,这里讲授的基本发明概念可能会产生许多变种、修改的版本,及/或变换方式的实施例/实现方法,这些会被本领域的技术人员利用,但它们没有超出后附权利要求书中定义的本发明的精神和范围。