10、RH850 CAN通讯功能和配置

前言:

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

       如图是车载网络的构想示意图。CAN 等通信协议的开发,使多种 LAN 通过网关进行数据交换得以实现。

 

1.1、RH850/F1L RS-CAN的特点

1.1.1、CAN单元数量和CAN通道数量

此微控制器具有以下数量的RS-CAN单元。

 各个产品具有下面列出的CAN接口通道

仅在具有1.5MB和2MB Code Flash的设备中受支持。

仅在F1L中支持网关。

       本节中寄存器的功能和说明适用于6通道RS-CAN(m=0至5)。在引用带有索引的信息时,请将索引值视为与您的产品对应的值。另外,注意,当将值写入寄存器时,将导致写入您正在使用的产品索引范围之外的位,请在重置到这些位后写入该值。

下表列出了各个产品的索引值。

 

1.1.3 时钟源

下表显示了RSCAN0时钟源。

RSCAN0的工作频率取决于传输速率和使用的通道数。

RSCAN0GCFG中的DCS位允许选择clk_ xincan或clkc。将时钟频率配置为小于或等于pclk/2(最高40 MHz)。

当pclk<25 MHz时,选择clk_ xincan

clk_ xincan的最大频率是24MHz

CAUTION

当RS-CAN模块在停止模式下使用时,将MainOSC设置为RS-CAN模块的时钟源。

1.1.4 中断请求

下表列出了RSCAN0中断请求。

 

1.1.5 复位源

下表列出了RSCAN0重置源。这些复位源会初始化RSCAN0。

 

1.1.6 外部输入/输出信号

下表列出了RSCAN0的外部输入/输出信号。

Table 1.16 外部输入/输出信号

CAUTION

       当端口P0_0用作CAN0TX时,端口P0_0(RESETOUT信号)在复位期间和从复位状态释放后输出低电平。

1.2 概述

1.2.1 功能概述

       RH850/F1L包含一个CAN接口单元(RS-CAN),该单元有6个符合ISO11898-1规范的CAN控制器通道(CAN0~CAN5)。

Table 1.21 RS-CAN模块规格

 

1.2.2 框架图

Figure 1.1 RS-CAN模块框图

Note :m = 0 to 5

BRP[9:0]:RSCAN0CmCFG寄存器中的位

DCS :RSCAN0GCFG寄存器中的位

FCANTQm :CANmTq时钟

FCAN :CAN时钟

 

1.3 寄存器

1.3.1 寄存器列表

下表列出了RS-CAN寄存器。

寄存器列表

 

1.3.2 RSCAN0CmCFG — Channel Configuration Register (m = 0 to 5)

访问:RSCAN0CmCFG寄存器可以32位进行读写。

RSCAN0CmCFGL、RSCAN0CmCFGH寄存器可以16位进行读写。

RSCAN0CmCFGLL、RSCAN0CmCFGLH、RSCAN0CmCFGHL、RSCAN0CMCFGH寄存器可以8位进行读写。

地址:RSCAN0CmCFG: <RSCAN0_base> + 0000H + (10H × m)

RSCAN0CmCFGL: <RSCAN0_base> + 0000H + (10H × m),

RSCAN0CmCFGH: <RSCAN0_base> + 0002H + (10H × m)

RSCAN0CmCFGLL: <RSCAN0_base> + 0000H + (10H × m),

RSCAN0CmCFGLH: <RSCAN0_base> + 0001H + (10H × m),

RSCAN0CmCFGHL: <RSCAN0_base> + 0002H + (10H × m),

RSCAN0CmCFGHH: <RSCAN0_base> + 0003H + (10H × m)     

复位值:0000 0000H

 

在通道复位模式或通道停止模式下修改RSCAN0CmCFG寄存器。在切换到通道通信模式或通道停止模式之前,将该寄存器设置为通道复位模式。

SJW[1:0]位

这些位用于指定重新同步跳转宽度的Tq值。允许值为1 Tq到4 Tq(含)。

设置一个小于或等于TSEG2位的值。

TSEG2[2:0]位

这些位用于指定相位段2(PHASE_SEG2)长度的Tq值。允许值为2 Tq到8 Tq(含)。

设置一个小于TSEG1位的值。

TSEG1[3:0]位

这些位用于指定传播段(PROP_SEG)和相位段1(PHASE_SEG1)的总长度的Tq值。

允许值为4 Tq到16 Tq(含)。

BRP[9:0]位

通过将CAN时钟(fCAN)除以波特率预分频器(BRP[9:0])+1)来计算CANmTq时钟(fCANTQm)CANmTq时钟的一个时钟周期是1个时间量(Tq)。

1.3.3 RSCAN0CmCTR-通道控制寄存器(m = 0 to 5)

访问: RSCAN0CmCTR寄存器可以32位进行读写。

RSCAN0CmCTRL、RSCAN0CmCTRH寄存器可按16位进行读写。

RSCAN0CmCTRLL、RSCAN0CmCTRLH、RSCAN0CMCTRCHL、RSCAN0CmCTRHH寄存器可以8位进行读写。       

地址:RSCAN0CmCTR: <RSCAN0_base> + 0004H + (10H × m)

         RSCAN0CmCTRL: <RSCAN0_base> + 0004H + (10H × m),

         RSCAN0CmCTRH: <RSCAN0_base> + 0006H + (10H × m)

         RSCAN0CmCTRH: <RSCAN0_base> + 0006H + (10H × m)

         RSCAN0CmCTRLL: <RSCAN0_base> + 0004H + (10H × m),

         RSCAN0CmCTRLH: <RSCAN0_base> + 0005H + (10H × m),

         RSCAN0CmCTRHL: <RSCAN0_base> + 0006H + (10H × m),

         RSCAN0CmCTRHH: <RSCAN0_base> + 0007H + (10H × m)

         复位值:0000 0005H

CTMS[1:0] bits

这些位用于选择通信测试模式。仅在通道暂停模式下修改这些位。

在通道复位模式下,这些位设置为0。

CTME Bit

将此位设置为1将启用通信测试模式。在通道暂停模式下修改这些位。在通道复位模式下,该位设置为0。

ERRD Bit

该位用于控制RSCAN0CmERFL寄存器中位14~8的显示模式。

当此位清除为0时,只有第一个错误事件的标志设置为1。如果在第一个错误事件中发生两个或多个错误,则检测到的错误的所有标志都设置为1。

当该位设置为1时,无论错误发生顺序如何,所有已发生错误的标志都设置为1。

仅在通道复位模式或通道停止模式下修改此位。

BOM[1:0] Bits

这些位用于选择RS-CAN模块的bus-off恢复模式。

       当BOM[1:0]位设置为00B时,从bus-off状态恢复到error active 状态符合CAN规范。也就是说,在连续检测到11个隐性位128次后,RS-CAN模块重新进入CAN通信(error active状态)。从bus-off状态恢复时生成bus-off恢复中断请求。即使在128次检测到隐性位之前CHMDC[1:0]位被置为10B(信道暂停模式),RS-CAN模块也不会转换到通道暂停模式,直到128次检测到隐性位RS-CAN模块才会转换到通道暂停模式。

       当BOM[1:0]位置为01B且RS-CAN模块达到bus-off状态时,RSCAN0CmCTR寄存器(m=0~5)中的CHMDC[1:0]位置为10B,RS-CAN模块转换到通道停止模式。bus-off恢复中断请求不生成,且RSCAN0CmSTS寄存器中的TEC[7:0]和REC[7:0]位被清除为00H。

       当RS-CAN模块达到bus-off状态且BOM[1:0]位设置为10B时,从bus-off状态(连续检测到11个隐性位128次)恢复后CHMDC[1:0]位置为10B且RS-CAN模块转换到通道停止模式。从bus-off状态恢复时生成bus-off恢复中断请求,同时TEC[7:0]和REC[7:0]位置为00H。

       当BOM[1:0]位置为11B且CHMDC[1:0]位置为10B但RS-CAN模块处于bus-off状态时,RS-CAN模块转换为通道停止模式。从总线断开状态恢复时,不产生总线断开恢复中断请求,并且TEC[7:0]和REC[7:0]位置为00H。但是,如果在CHMDC[1:0]位置为10B之前,连续检测到11个隐性位128次,并且RS-CAN模块已从总线断开状态恢复到错误激活状态,则会产生总线断开恢复中断请求。

       如果程序在RS-CAN模块转换到信道暂停模式的同时写入CHMDC[1:0]位(at bus-off entry when the BOM[1:0] bits are 01B or at bus-off end when the BOM[1:0] bits are 10B),则优先写入。仅在通道复位模式下修改BOM[1:0]位。

TAIE Bit

当发送缓冲区的发送中止完成且TAIE位设置为1时,生成中断请求。仅在通道复位模式下修改此位。

ALIE Bit

当RSCAN0CmERFL寄存器中的ALF位置1且ALIE位置为1时,产生错误中断请求。仅在通道复位模式下修改此位。

BLIE Bit

当RSCAN0CmERFL寄存器中的BLF位置1且BLIE位置1时,将生成错误中断请求。仅在通道复位模式下修改此位。

OLIE Bit

当RSCAN0CmERFL寄存器中的OVLF位置1且OLIE位置1时,将生成错误中断请求。仅在通道复位模式下修改此位。

BORIE Bit

当RSCAN0CmERFL寄存器中的BORF位置为1且BORIE位置为1时,将生成错误中断请求。仅在通道复位模式下修改此位。

BOEIE Bit

当RSCAN0CmERFL寄存器中的BOEF位置为1且BOEIE位置为1时,将生成错误中断请求。仅在通道复位模式下修改此位。

EPIE Bit

当RSCAN0CmERFL寄存器中的EPF位置为1且EPIE位置为1时,将生成错误中断请求。仅在通道复位模式下修改此位。

EWIE Bit

当RSCAN0CmERFL寄存器中的EWF位置为1且EWIE位置为1时,将生成错误中断请求。仅在通道复位模式下修改此位。

BEIE Bit

当RSCAN0CmERFL寄存器中的BEF位置为1且BEIE位置为1时,将生成错误中断请求。仅在通道复位模式下修改此位。

RTBO Bit

       在总线断开状态下将该位置1将强制将状态从总线断开状态返回到错误激活状态。此位自动清除为0。该位置1,将会使RSCAN0CmSTS寄存器中的TEC[7:0]和REC[7:0]位清除为00H,并将RSCAN0CmSTS寄存器中的BOSTS标志清除为0(非总线关闭状态)。其他寄存器保持不变。在这种情况下,从总线关闭状态恢复时,不会生成总线关闭恢复中断请求。仅当RSCAN0CmCTR寄存器中的BOM[1:0]位为00B(符合ISO11898-1)时才使用此位。RTBO位置1到RS-CAN模块转换到错误激活状态,最多会延迟1个CAN位时间。在信道通信模式下,将该位置为1。

CSLPR Bit

将此位置为1使通道进入通道停止模式。

将此位置为0使通道退出通道停止模式。

在通道通信模式或通道暂停模式下不可修改该位。

CHMDC[1:0] Bits

       这些位用于选择通道模式(通道通信模式、通道复位模式或通道暂停模式)。信道复位模式下将CSLPR位置为1可允许转换到通道停止模式。不要将CHMDC[1:0]位置为11B。当CAN模块根据BOM[1:0]位的设置自动转换到通道停止模式时,CHMDC[1:0]位自动变为10B。

1.3.4 RSCAN0CmSTS — Channel Status Register (m = 0 to 5)

访问:RSCAN0CmSTS寄存器是只读寄存器,可以32位进行读取。

         RSCAN0CmSTSL、RSCAN0CmSTSH寄存器是可按16位读取的只读寄存器。

         RSCAN0CmSTSLL、RSCAN0CmSTSHL、RSCAN0CmSTSHH寄存器是可按8位读取的只

读寄存器。

地址:RSCAN0CmSTS: <RSCAN0_base> + 0008H + (10H × m)

         RSCAN0CmSTSL: <RSCAN0_base> + 0008H + (10H × m)

         RSCAN0CmSTSH: <RSCAN0_base> + 000AH + (10H × m)

         RSCAN0CmSTSLL: <RSCAN0_base> + 0008H + (10H × m)

         RSCAN0CmSTSHL: <RSCAN0_base> + 000AH + (10H × m)

         RSCAN0CmSTSHH: <RSCAN0_base> + 000BH + (10H × m)

复位值:0000 0005H

TEC[7:0] Bits

这些位包含传输错误计数器值。有关传输错误计数器递增/递减条件,请参阅CAN规范(ISO11898-1)。在通道复位模式下,这些位清0。

REC[7:0] Bits

这些位包含接收错误计数器值。有关接收错误计数器递增/递减条件,请参阅CAN规(ISO11898-1)。在通道复位模式下,这些位被清除为0。

COMSTS Flag

该位表示通信准备就绪。当CAN模块从通道复位模式或通道停止模式转换到通道通信模式后,检测到11个连续的隐性位时,此标志位置为1。在通道复位模式或通道停止模式下,此标志位清0。

RECSTS Flag

当接收开始时,该标志位设置为1;当总线空闲或传输开始时,该标志位清0。

TRMSTS Flag

当传输启动时,此标志位置为1,当总线变为空闲或接收已启动时,该标志位清0。此标志位在总线关闭状态下保持1。

BOSTS Flag

当进入总线关闭状态(TEC[7:0]>255)时,此标志设置为1。当CAN模块退出总线关闭状态时,清除为0。

EPSTS Flag

当RS-CAN模块进入错误被动状态((128)时,此标志位设置为1((128 ≤ TEC[7:0] ≤

255) or (128 ≤ REC[7:0])) ,当RS-CAN模块退出错误被动状态或进入通道复位模式时,清除为0。

CSLPSTS Flag

当CAN模块转换到通道停止模式时,此标志位置为1;当CAN模块从通道停止模式退出时,此标志位清0。

CHLTSTS Flag

当CAN模块转换到信道暂停模式时,此标志位置为1;当CAN模块从信道暂停模式返回时,此标志位清0。

CRSTSTS Flag

当CAN模块转换到通道复位模式时,此标志位置为1;当CAN模块转换到通道通信模式或通道停止模式时,此标志清0。当CAN模块从通道复位模式转换到通道停止模式时,此标志位保持为1。

1.3.5 RSCAN0CmERFL — Channel Error Flag Register (m = 0 to 5)

访问:RSCAN0CmERFL寄存器可以32位进行读写。

         RSCAN0CmERFLL寄存器可按16位进行读写。

         RSCAN0CmERFLH是16位只读寄存器。

         RSCAN0CmERFLLL, RSCAN0CmERFLLH寄存器可以8位进行读写。

         RSCAN0CmERFLHL, RSCAN0CmERFLHH是8位只读寄存器。

地址:RSCAN0CmERFL: <RSCAN0_base> + 000CH + (10H × m)

            RSCAN0CmERFLL: <RSCAN0_base> + 000CH + (10H × m),

            RSCAN0CmERFLH: <RSCAN0_base> + 000EH + (10H × m)

            RSCAN0CmERFLLL: <RSCAN0_base> + 000CH + (10H × m),

            RSCAN0CmERFLLH: <RSCAN0_base> + 000DH + (10H × m),

            RSCAN0CmERFLHL: <RSCAN0_base> + 000EH + (10H × m),

            RSCAN0CmERFLHH: <RSCAN0_base> + 000FH + (10H × m)

复位值:0000 0000H

写入该标志位的唯一有效值是0,这将清除该位。否则写入该标志位会导致保留其状态。

       有关错误发生条件的说明,请参阅CAN规范(ISO11898-1)。要清除这个寄存器的每个标志位,程序必须在相应的位上写0。程序无法将这些标志位设置为1。如果在程序将0写入标志位的同时将这些标志位中的任何一个设置为0,则标志位仍设置为1。通道复位模式转换将所有这些标志清除为0。如果RSCAN0CmCTR寄存器中的ERRD位设置为0(即,仅显示第一个错误事件的标志),并且检测到与RSCAN0CmERFL的位14至8相关的错误,当错误发生且bit14~bit8均为0时,则错误事件设置标志位。

CRCREG[14:0] Flag

当RSCAN0CmCTR寄存器中的CTME位置为1(启用通信测试模式)时,可以读取发送或收消息计算的CRC值。当CTME位置为0(通信测试模式被禁用)时,这些位始终为0。

ADERR Flag

在传输期间ACK分隔符中检测到格式错误时,此标志位置为1。

B0ERR Flag

当通过传输显性位检测到隐性位时,此标志设置为1。

B1ERR Flag

当通过传输隐性位检测到显性位时,此标志设置为1。

CERR Flag

当检测到CRC错误时,此标志位置为1。

AERR Flag

当检测到ACK错误时,此标志位置为1。

FERR Flag

当检测到格式错误时,此标志位置为1。

SERR Flag

当检测到填充位错误时,此标志位置为1。

ALF Flag

当检测到仲裁丢失时,此标志位置为1。

BLF Flag

当在信道通信模式下的CAN总线上检测到32个连续的显性位时,此标志位置为1。之后,当满足以下任一条件时,重新开始dominant lock的检测。

◆ BLF位从1清除到0后检测到隐性位。

◆ BLF位从1清除到0后,CAN模块转换到通道复位模式并返回到通道通信模式。

OVLF Flag

当在执行接收或发送时检测到过载帧发送时,该标志位设置为1。

BORF Flag

当连续检测到11个隐性位128次且CAN模块从bus-off状态返回时,此标志位置为1。但是,如果在128次检测到11个连续的隐性位之前,CAN模块以下列任一方式从bus-off状态返回,则此标志位不置为1。

◆ RSCAN0CmCTR寄存器中的CHMDC[1:0]位设置为01B(通道复位模式)。

◆ RSCAN0CmCTR寄存器中的RTBO位置为1(从bus-off状态强制恢复)。

◆ RSCAN0CmCTR寄存器中的BOM[1:0]位置为01B(在bus-off entry状态下转换为通道停止模式)。

◆ 在连续检测到11个隐性位128次前,RSCAN0CmCTR寄存器中的CHMDC[1:0]位被置为10B(通道暂停模式)同时BOM[1:0]位被设置为11B(在bus-off期间由程序请求转换到通道暂停模式)。

BOEF Flag

当达到总线关闭状态(TEC[7:0]值>255)时,此标志位置为1。当RSCAN0CmCTR寄存器(m=0到5)中的BOM[1:0]位置为01B(在bus-off entry时转换到通道停止模式)时,如果达到总线断开状态,此标志位也置为1。

EPF Flag

当达到错误被动状态(REC[7:0] or TEC[7:0] value > 127)时,此标志位变为1。

仅当REC[7:0]或TEC[7:0]的值首次超过127时,此标志才变为1。因此,如果程序在REC[7:0]或TEC[7:0]的值大于127时对该标志位写0,则该位不会置为1,直到REC[7:0]和TEC[7:0]的值都小于或等于127,然后REC[7:0]或TEC[7:0]的值再次超过127。

BEF Flag

当RSCAN0CmERFL寄存器中的ADERR、B0ERR、B1ERR、CERR、AERR、FERR和SERR之一置为1时,此标志位置为1。

NOTE

要将此寄存器的标志清除为0,请使用存储指令将“0”写入给定标志位,将“1”写入其他标志位。

1.3.6 RSCAN0GCFG — Global Configuration Register

访问:

RSCAN0GCFG寄存器可以32位进行读写。

RSCAN0GCFGL, RSCAN0GCFGH寄存器可以16位进行读写。

RSCAN0GCFGLL, RSCAN0GCFGLH, RSCAN0GCFGHL, RSCAN0GCFGHH寄存器可以8位进行读写。

地址:   

RSCAN0GCFG: <RSCAN0_base> + 0084HRSCAN0GCFGL: <RSCAN0_base> + 0084H, RSCAN0GCFGH: <RSCAN0_base> + 0086HRSCAN0GCFGLL: <RSCAN0_base> + 0084H, RSCAN0GCFGLH: <RSCAN0_base> + 0085H,RSCAN0GCFGHL: <RSCAN0_base> + 0086H, RSCAN0GCFGHH: <RSCAN0_base> + 0087H

复位值:0000 0000H

当指定pclk/2作为时间戳计数器计数源时,将TSBTCS[2:0]设置为000B。

仅在全局复位模式下修改RSCAN0GCFG寄存器。

ITRCP[15:0] Bits

这些位用于设置FIFO缓冲区间隔计时器的时钟源分频值。请参阅Section 19.7.3.1, Interval Transmission Function.

TSBTCS[2:0] Bits

当TSSS位为1时,这些位用于选择将成为时间戳计数器的时钟源的位时钟的通道。

TSSS Bit

该位用于选择时间戳计数器的时钟源。

TSP[3:0] Bits

通过对时钟源分频得到的时钟被用作时间戳计数器计数源,该时钟源由TSBTCS[2:0]位和TSSS位选择,分频系数由TSP[3:0]位决定。

DCS Bit

当该位设置为0时,clkc用作CAN时钟(fCAN)的时钟源。

当该位设置为0时,clk_xincan用作CAN时钟(fCAN)的时钟源。

MME Bit

将此位设置为1将使mirror功能可用。

DRE Bit

当DRE位设置为1时,接收规则的DLC值被存储在缓冲器中,在这种情况下,超出接收规则DLC值的每个数据字节中存储着00。只有当DCE位设置为1(启用了DLC检查)时,DLC替换功能才可用。

DCE Bit

将此位设置为1将使DLC检查功能可用。禁用DLC检查功能时,将RSCAN0GAFLP0j寄存器中的GAFLDLC[3:0]位设置为0000B,然后将RSCAN0GCFG寄存器中的DCE位清除为0。

TPRI Bit

该位用于设置传输优先级。当该位设置为0时,选择ID优先级,传输优先级符合CAN总线仲裁规则(ISO11898-1规范)。当该位设置为1时,选择传输缓冲区编号优先级,其中最低的传输缓冲区编号具有最高优先级。在使用传输队列时,该位应设置为0。

1.3.7 RSCAN0GCTR — Global Control Register

访问:

RSCAN0GCTR寄存器可以32位进行读写。

RSCAN0GCTRL, RSCAN0GCTRH寄存器可以16位进行读写。

RSCAN0GCTRLL, RSCAN0GCTRLH, RSCAN0GCTRHL寄存器可以8位进行读写。

地址:

RSCAN0GCTR: <RSCAN0_base> + 0088H

RSCAN0GCTRL: <RSCAN0_base> + 0088H, RSCAN0GCTRH: <RSCAN0_base> + 008AH

RSCAN0GCTRLL: <RSCAN0_base> + 0088H, RSCAN0GCTRLH: <RSCAN0_base> + 0089H,

RSCAN0GCTRHL: <RSCAN0_base> + 008AH

复位值:0000 0005H

TSRST Bit

此位用于复位时间戳计数器。当该位设置为1时,RSCAN0GTSC寄存器被清除为0000H。

THLEIE Bit

当THLEIE位置为1且RSCAN0GERFL寄存器中的THLES标志位置为1时,将生成中断请求。仅在全局重置模式下修改此位。

MEIE Bit

当MEIE位置为1且RSCAN0GERFL寄存器中的MES标志位置为1时,生成中断请求。仅在全局重置模式下修改此位。

DEIE Bit

当DEIE位置为1且RSCAN0GERFL寄存器中的DEF标志位置为1时,将生成中断请求。仅在全局重置模式下修改此位。

GSLPR Bit

将该位置为1,使RS-CAN模块进入全局停止模式。

将该位除为0,使RS-CAN模块退出全局停止模式。

该位不运行在全局操作模式或全局测试模式下进行修改。

GMDC[1:0] Bits

这些位用于选择整个RS-CAN模块的模式(全局操作模式、全局复位模式或全局测试模式)。

1.4 Interrupt Sources 中断源

RS-CAN模块有20个中断,分为全局中断和通道中断。

全局中断(2个中断源):

接收FIFO中断

全局错误中断

通道中断(3个中断源/通道):

CANm传输中断(m=0到5)

CANm传输完全中断

CANm传输中止中断

CANm传输/接收FIFO传输完全中断(在传输模式、网关模式下)

CANm传输历史中断

CANm传输队列中断

CANm发送/接收FIFO接收完全中断(在接收模式、网关模式下)

CANm错误中断

       产生中断请求时,相应的中断请求标志位置为1(存在中断请求)。在该情况下,当中断使能位置为1(使能中断)时,RS-CAN模块输出中断请求(中断的产生还取决于中断控制器的中断控制寄存器设置)。

       将中断请求标志位置为0(不存在中断请求)或将中断使能位置为0(失能中断)清除当前中断请求。在中断请求标志位被清除之前,当前中断请求仍然输出。

 

1.5 CAN Modes

       RS-CAN模块有四种全局模式控制整个RS-CAN模块状态,四种通道模式控制单个通道状态。Section 19.5.1, Global Modes 讲述了全局模式的详细介绍。Section 19.5.2, Channel Modes.讲述了通道模式的详细介绍。

全局停止模式:停止整个模块的时钟,以实现低功耗。

全局重置模式:对整个模块执行初始设置。

全局测试模式:执行测试设置和RAM测试。

全局操作模式:使整个模块可操作。

通道停止模式:停止通道时钟。

通道重置模式:执行通道的初始设置。

信道停止模式:停止CAN通信并允许信道测试。

信道通信模式:执行CAN通信

       在某些情况下,全局模式转换也会强制通道模式转换。Table 19.89 显示全局模式下的信道模式转换,全局模式由GMDC[1:0]位和GSLPR位指定

正在使用的通道在最低通信速度情况下的CAN帧时间。

1.5.1.1 Global Stop Mode

在全局停止模式下,CAN时钟不运行,功耗得以降低。可以读取CAN寄存器,但禁止向其写入数据。保留寄存器值。只有CPU用于写入GSLPR位的时钟在此模式下运行。

MCU复位后,CAN模块切换到Global Stop Mode。在全局复位模式下,将RSCAN0GCTR寄存器中的GSLPR位置为1(在全局停止模式下),会使每个RSCAN0CmCTR寄存器中的CSLPR位置为1(通道停止模式)。之后,如果所有通道都被迫转换到通道停止模式,CAN模块将转换到全局停止模式。在全局操作模式和全局测试模式下禁止修改GSLPR位。

1.5.1.2 Global Reset Mode

在全局复位模式下,执行RS-CAN模块设置。当RS-CAN模块转换到全局复位模式时,一些寄存器被初始化。Table 19.93和Table 19.94列出了将被初始化的寄存器。

将RSCAN0GCTR寄存器的GMDC[1:0]位置为01B,将会使每个RSCAN0CmCTR寄存器(m=0~5)的CHMDC[1:0]位置为01B(通道复位模式)。如果强制将所有通道转换到通道复位模式,CAN模块将转换到全局复位模式。已经处于通道复位模式或通道停止模式的通道不转换(因为CHMDC[1:0]位已经置为01B)。

1.5.1.3 Global Test Mode

在全局测试模式下,设置测试相关寄存器。当CAN模块转换到全局测试模式时,所有CAN通信将被禁用。

将RSCAN0GCTR寄存器的GMDC[1:0]位置为10B,将会使每个RSCAN0CmCTR寄存器中的CHMDC[1:0]位置为10B(通道暂停模式)。如果所有通道被强制转换到通道停止模式,CAN模块将切换到全局测试模式。处于通道停止模式、通道复位模式或通道停止模式的通道不切换。

1.5.1.4 Global Operating Mode

RS-CAN模块工作在全局工作模式下。

当RSCAN0GCTR寄存器的GMDC[1:0]位置为00B时,RS-CAN模块切换到全局操作模式。

1.5.2 Channel Modes

Figure 19.5显示了信道模式状态转换图。Table 19.91显示了信道模式转换时间。

CHMDC[1:0], CSLPR, BOM[1:0]位在寄存器RSCAN0CmCTR中(m=0到5)BOSTS, TRMSTS, RECSTS, COMSTS 位在寄存器RSCAN0CmSTS中(m=0到5)

从总线关闭状态过渡到通道停止模式的时间

BOM[1:0]=01B时:当TEC超过255时,切换到通道停止模式

BOM[1:0]=10B时:当连续检测到11个隐性位128次时,转换到通道暂停模式

BOM[1:0]=11B时:当CHMDC[1:0]位置为10B时,转换到通道暂停模式

当CAN总线锁定在显性时,不会转换到通道暂停模式。在这种情况下,进入通道复位模式。

 

1.5.2.1 Channel Stop Mode

在通道停止模式下,停止通道时钟进一步降低功耗。可以读取CAN寄存器,但禁止向其写入数据。保留寄存器值。

MCU复位后,每个通道进入通道停止模式。在通道复位模式下,当RSCAN0CmCTR寄存器(m=0到5)中的CSLPR位设置为1(通道停止模式)时,通道切换到通道停止模式。在通道通信模式和通道暂停模式下,不能修改CSLPR位。

1.5.2.2 Channel Reset Mode

在通道复位模式下,进行通道设置。当通道转换到通道复位模式时,一些通道相关的寄存器被初始化。Table 19.93 列出了将被初始化的寄存器。

在CAN通信期间,当RSCAN0CmCTR寄存器的CHMDC[1:0]位置为01B(信道复位模式)时,通信在完成前会被终止,通道转换为信道复位模式。Table 19.92展示了在CAN通信期间将CHMDC[1:0]位置为01B(信道复位模式)时的操作。

1.5.2.3 Channel Halt Mode

在通道暂停模式下,设置通道测试相关的寄存器。当通道转换到通道暂停模式时,通道的CAN通信停止。

 要允许在通信完成后转换到通道复位模式,请将CHMDC[1:0]位置为10B,并确认通信已完成,并且已转换到信道暂停模式,然后将CHMDC[1:0]位置为01B。

当CAN总线保持显性时,不会转换到通道暂停模式。在这种情况下,进入通道复位模式。当检测到显性时,可以用RSCAN0CmERFL寄存器的BLF标志为(BLF标志位置1)确认CAN总线状态。

当需要从通道复位模式转换到通道停止模式时,可通过以下方式进行设置–将RSCAN0CmCFG寄存器设置为通道复位模式,然后切换到通道停止模式。

1.5.2.4 Channel Communication Mode

在通道通信模式下进行CAN通信。在CAN通信过程中,每个通道具有以下通信状态。

◆ Idle(空闲) :接收和传输都没有进行。

◆ Reception(接收) :接收从另一个节点发送的消息。

◆ Transmission(传送):传送信息。

◆ Bus-off(总线关闭) :与CAN通信隔离

       当RSCAN0CmCTR寄存器的CHMDC[1:0]位置为00B时,通道转换为通道通信模式。切换到通道通信模式后,一旦检测到11个连续的隐性位,RSCAN0CmSTS寄存器(m=0到5)的COMSTS标志位置1(通信准备就绪),并且在CAN网络上作为活动节点启用发送和接收。此时,可以开始发送和接收消息。

1.5.2.5 Bus-off State

根据CAN规范的发送/接收错误计数器递增/递减规则,通道转换到bus-off状态。

从bus-off返回的条件由RSCAN0CmCTR寄存器中的BOM[1:0]位确定。

◆ When BOM[1:0] = 00B:

Bus-off恢复符合CAN规范。在连续检测到11个隐性位128次后,通道从bus-off状态返回到CAN通信就绪状态(错误激活状态)。此时,RSCAN0CmSTS寄存器的TEC[7:0]和REC[7:0]位被初始化为00H,RSCAN0CmERFL寄存器的BORF标志位被置为1(检测到bus-off恢复),并生成bus-off恢复中断请求。当RSCAN0CmCTR寄存器的CHMDC[1:0]位在bus-off状态下置为10B(通道暂停模式)时,在bus-off恢复完成后,转换到通道暂停模式(已检测到11个连续的隐性位128次)。

◆ When BOM[1:0] = 01B:

当某个通道转换到bus-off状态时,CHMDC[1:0]位置为10B,通道转换到通道停止模式。此时,TEC[7:0]和REC[7:0]位被初始化为00H。BORF标志位不会被置为1,并且不生成bus-off恢复中断请求。

◆ When BOM[1:0] = 10B:

当通道转换到bus-off状态时,CHMDC[1:0]位被置为10B。Bus-off恢复后(已检测到11个连续的隐性位128次),通道转换到通道停止模式。此时,TEC[7:0]和REC[7:0]位被初始化为00H,BORF标志位被置为1,并且生成bus-off恢复中断请求。

◆ When BOM[1:0] = 11B:

       当CHMDC[1:0]位在bus-off状态下设置为10B时,在bus-off恢复完成之前,通道转换到通道停止模式。此时,TEC[7:0]和REC[7:0]位被初始化为00H,但是BORF标志位未被置为1。此外,不生成bus-off恢复中断。但是,如果在CHMDC[1:0]位设置为10B之前,CAN模块转换到错误激活状态(通过检测到11个连续隐性位128次),则BORF标志位变为1,并生成bus-off恢复中断请求。

       如果RS-CAN模块在向通道停止模式切换的同时有软件程序在写CHMDC[1:0]位,则优先软件程序写入操作。当BOM[1:0]位置为01B或10B时,仅当CHMDC[1:0]位为00B(通道通信模式)时,才会自动转换到通道暂停模式。

       此外,将RSCAN0CmCTR寄存器中的RTBO位置1可允许从bus-off状态强制恢复。一旦RTBO位置为1,状态就变为error active状态。在检测到11个连续的隐性位之后,CAN模块可以开始通信。在这种情况下,BORF标志位不会被置为1,TEC[7:0]和REC[7:0]位被初始化为00H。仅当BOM[1:0]值为00B时,才将1写入RTBO位。只能在bus-off状态对RTBO位写1,并且RTBO位立即置为0。

 

1.6 Reception Function

有两种接收类型。

◆ 通过接收缓冲buffer接收:

所有通道可以共享0到96个接收缓冲buffer。由于存储在接收缓冲buffer中的消息在每次接收时都会被覆盖,因此始终可以读取最新的接收数据。

◆ 通过接收FIFO缓冲buffer和发送/接收FIFO缓冲buffer的接收(接收模式):

8个接收FIFO缓冲器可由所有通道共享,每个通道提供三个专用的发送/接收FIFO缓冲器。用RFDC[2:0]和CFDC[2:0]位指定的最多缓冲级数的消息可以存储在FIFO缓冲区中,并且可以从最早的缓冲区顺序读取。

1.6.1 Data Processing Using the Receive Rule Table

使用接收规则表的数据处理允许将选定的消息分派到指定的缓冲区。数据处理包括接受滤波处理、DLC滤波处理、路由处理、标签添加处理和Mirror功能处理。

每个通道最多可注册128个接收规则(64 * 通道数),整个模块都可以注册接收规则(该模组有6个通道,最多可注册384个规则)。为每个通道设置接收规则。接收规则不能与其他通道共享。如果未设置接收规则,则无法接收任何消息。Figure 19.6说明了如何注册接收规则。

CAUTION

每个通道的接收规则必须在连续块中设置。

通道1规则和通道0规则必须分别设置

    每个接收规则由RSCAN0GAFLIDj、RSCAN0GAFLMj、RSCAN0GAFLP0j和RSCAN0GAFLP1j寄存器中的16个字节组成(j=0到15)。RSCAN0GAFLIDj寄存器用于设置GAFLID、GAFLIDE位、GAFLRTR位和Mirror功能,RSCAN0GAFLMj寄存器用于设置掩码,RSCAN0GAFLP0j寄存器用于设置要添加的标签信息、DLC值和存储接收缓冲区,RSCAN0GAFLP1j寄存器用于设置存储FIFO缓冲区。每页最多可设置16个接收规则。

1.6.1.1 Acceptance Filter Processing

       在接受过滤处理中,将接收到消息中的ID数据、IDE位和RTR位与在相应通道的接收规则中设置的ID数据、IDE位和RTR位进行比较。当所有这些位匹配时,消息将通过接受过滤处理。接收消息–与RSCAN0GAFLMj寄存器中设置为0的位(不参与比较的位)相对应–中的ID数据、IDE位和RTR位不参与比较,并视为匹配。

       从相应通道的最小数量的接收规则开始检查。当接收到的消息中要比较的所有位与接收规则中设置的位匹配时,或者接收到的信息于所有接收规都不匹配时,停止过滤。如果没有匹配的接收规则,则接收的消息不会存储在接收缓冲区或FIFO缓冲区中。

1.6.1.2 DLC Filter Processing

当RSCAN0GCFG寄存器的DCE位置为1(启用了DLC检查)时,DLC 过滤处理将添加到通过接收过滤处理的消息中。当消息中的DLC值等于或大于接收规则中设置的DLC值时,消息将通过DLC过滤处理。

当message通过了DLC过滤处理,且RSCAN0GCFG寄存器中的DRE位置为0(禁用DLC替换)时,接收message的DLC值存储在buffer中。在这种情况下,接收message中的所有数据字节都存储在缓冲区中。

当消息已通过DLC过滤处理,且RSCAN0GCFG寄存器中的DRE位置为1(启用DLC替换)时,接收规则中的DLC值将存储在缓冲区中,而不是接收消息中的DLC值存储在缓冲区中。在这种情况下,接收规则中由DLC指定的字节数之外的每个数据字节置为00H。

当接收到的消息中的DLC值小于接收规则中的值时,消息不能通过DLC过滤处理。在这种情况下,消息不会存储在接收缓冲区或FIFO缓冲区中,并且RSCAN0GERFL寄存器中的DEF标志设位置为1(存在DLC错误)。

1.6.1.3 Routing Processing

通过接收过滤处理和DLC过滤处理的消息存储在接收缓冲器、接收FIFO缓冲器或发送/接收FIFO缓冲器(设置为接收模式或网关模式)中。消息存储位置由RSCAN0GAFLP0j寄存器(j=0到15)的GAFLRMV和GAFLRMDP[6:0]位以及RSCAN0GAFLP1j寄存器设置。通过接收过滤处理和DLC过滤处理的消息最多可以存储在8个缓冲区中。

1.6.1.4 Label Addition Processing

可以将12位宽的标签信息添加到通过过滤处理的消息中,并将标签信息存储在缓冲区中。该标签信息由RSCAN0GAFLP0j寄存器的GAFLPTR[11:0]位设置。

1.6.1.5 Mirror Function Processing

Mirror功能允许CAN节点接收自己传输的信息。通过将RSCAN0GCFG寄存器中的MME位置为1(启用Mirror功能),可以使用Mirror功能。

在使用Mirror功能时,当接收从其他CAN节点发送的消息时,RSCAN0GAFLIDj寄存器中GAFLLB位置为0的接收规则用于数据处理。当CAN节点接收自己发送的消息时,GAFLLB位设置为1的接收规则用于数据处理。

1.6.1.6 Timestamp

时间戳计数器是用于记录消息接收时间的16位自由运行计数器。时间戳计数值在消息的帧开始(SOF)时获取,然后与消息ID和数据一起存储在接收缓冲器或FIFO缓冲器中。可以使用RSCAN0GCFG寄存器的TSBTCS[2:0]和TSSS位选择使用pclk/2或CANm位时钟(m=0到5)作为时间戳计数器的时钟源。通过将所选时钟源除以RSCAN0GCFG寄存器中的TSP[3:0]值来获得时间戳计数器计数源。CANm位时钟用作时钟源时,当相应的通道转换到通道复位模式或通道停止模式时,时间戳计数器停止。当pclk/2用作时钟源时,时间戳功能不受信道模式的影响。通过将RSCAN0GCTR寄存器的TSRST位置为1,将时间戳计数器值复位为0000H。

1.7 Transmission Functions

有三种类型的传输。

使用传输缓冲器传输:

每个channel有16个buffers。

使用发送/接收FIFO缓冲器进行传输(传输模式):

每个通道有三个FIFO缓冲器。单个FIFO缓冲区最多可包含128条消息。每个FIFO缓冲区与传输缓冲区的链接一起使用。只有下一个在FIFO缓冲区中传输的消息才成为传输优先级确定的目标。消息以先进先出的方式依次传输。

使用传输队列传输:

每个通道最多可为传输队列分配16个传输缓冲区。传输缓冲器((16× m) +15)用作相应信道的访问窗口。传输缓冲区按缓冲区数目的降序分配给传输队列。由优先级确定的传输队列中的所有消息都按ID号的顺序传输。

1.7.1 Transmit Priority Determination

如果传输请求是从多个缓冲区或同一通道上的队列发出的,则使用以下方法之一确定传输优先级。

通过使用以下方法之一确定优先级。

◆ ID priority (TPRI bit = 0)

◆ Transmit buffer number priority (TPRI bit = 1)

所有CAN通道都使用RSCAN0GCFG寄存器中TPRI位的设置。

       当TPRI位设置为0时,根据存储的消息id的优先级发送消息。ID优先级符合CAN规范中定义的CAN总线仲裁规范。挂起的传输消息的所有ID都是由优先级确定的对象,不管它们是存储在传输缓冲区、传输/接收FIFO缓冲区(设置为传输模式或网关模式)还是传输队列中。如果使用了单个传输队列,请选择ID优先级。当使用发送/接收FIFO缓冲buffer时,FIFO缓冲buffer中最早的消息成为优先级确定的目标。当从发送/接收FIFO缓冲buffer发送消息时,FIFO缓冲buffer中的下一条消息成为优先级确定的目标。使用传输队列时,传输队列中的所有消息都是优先级确定的目标。如果为两个或多个缓冲buffer设置了相同的ID,则缓冲buffer编号较小的优先级更高。

       当TPRI位置为1时,最先发送传输buffer中的消息,这个传输buffer是所有发送请求的buffer中编号最小的。当发送/接收FIFO缓冲buffer链接到传输缓冲buffer时,根据链接的发送缓冲buffer编号确定发送优先级。当由于仲裁丢失或错误而重新发送消息时,根据TPRI位再次确定传输优先级。

1.7.2 Transmission Using Transmit Buffers

将传输缓冲器中的传输请求位(RSCAN0TMCp寄存器的TMTR位)置为1(请求传输)可允许传输数据帧或远程帧。发送结果由相应RSCAN0TMSTSp寄存器(p=0到95)的TMTRF[1:0]标志位显示。传输成功时,TMTRF[1:0] 标志位置为10B(传输完成(没有传输中止请求))或11B(传输完成(有传输中止请求))。

1.7.2.1 Transmit Abort Function

对于RSCAN0TMSTSp寄存器的TMTRM位置为1的传输缓冲buffer(存在传输请求),当RSCAN0TMCp寄存器的TMTAR位置为1(请求中止传输)时,取消传输。传输中止完成时,RSCAN0TMSTSp寄存器的TMTRF[1:0]标志位置为01B(传输中止已完成),传输请求被取消(将TMTRM位置为0)。

根据传输优先级确定的正在传输或下一个将要传输的信息,不能被中止。但是对于传输过程中仲裁丢失或或发生错误的message(该message对应的TMTAR位置为1),不进行重传。

1.7.2.2 One-Shot Transmission Function (Retransmission Disabling Function)

当RSCAN0TMCp寄存器中的TMOM位设置为1(启用一次传输)时,仅执行一次传输。即使仲裁失败或发生错误,也不会执行重传。

单次发送的结果由相应RSCAN0TMSTSp寄存器的TMTRF[1:0]标志位显示。当单次传输成功时,TMTRF[1:0]标志设置为10B或11B。当仲裁丢失或发生错误时,TMTRF[1:0]标志位置为01B(中止传输已完成)。

1.7.3 Transmission Using FIFO Buffers

多条消息可以存储在一个发送/接收FIFO缓冲buffer中,最多由FIFO缓冲buffer深度决定了最多能够存储多少条信息,该深度由RSCAN0CFCCk寄存器的CFDC[2:0]位(k=0到17)设置。消息按照先进先出的顺序传输。

每个发送/接收FIFO缓冲buffer都链接到一个传输缓冲buffer,该传输缓冲buffer由RSCAN0FCCK寄存器CFTML[3:0]位选择。当RSCAN0CFCCk寄存器中的CFE位置为1(使用发送/接收FIFO缓冲器)时,发送/接收FIFO缓冲器成为发送优先级确定的目标。只有下一个传输消息的优先级在FIFO缓冲区中确定。

当CFE位设置为0(不使用发送/接收FIFO缓冲区)时,CFEMP标志位在以下时间置为1(发送/接收FIFO缓冲区不包含消息(缓冲区为空))。

◆ 如果发送/接收FIFO缓冲区中的消息未被发送或下一次也不被发送,则该缓冲区立即变为空。

◆ 如果发送/接收FIFO缓冲器中的消息正在发送或将在下一次发送,则发送/接收FIFO缓冲器在发送完成、CAN总线错误检测或仲裁丢失后变为空。

当CFE位清0时,发送/接收FIFO缓冲区中的所有消息都将丢失,并且消息不能存储在FIFO缓冲区中。在再次将CFE位置为1之前,需要先确认CFEMP标志位置为1。

1.7.3.1 Interval Transmission Function

当使用设置为传输模式或网关模式的发送/接收FIFO缓冲器时,可以设置消息传输间隔时间,以便为来自同一FIFO缓冲器的消息传输留出空间。

在RSCAN0CFCCk寄存器中的CFE位置为1的情况下,FIFO buffer的第一条message传输成功后,间隔计时器立即开始计数(CAN协议的EOF7之后)。之后,间隔时间超时后,传输下一条消息。间隔计时器在通道复位模式下或通过将CFE位清0而停止。

间隔时间由RSCAN0CFCCk寄存器的CFITT[7:0]位设置。不使用间隔计时器时,将CFITT[7:0]位设置为00H。

使用RSCAN0CFCCk寄存器中的CFITR和CFITSS位选择间隔计时器计数源。当CFITR和CFITSS位设置为00B时,通过将ITRCP[15:0]位的值除以pclk/2来获得计数源。当CFITR和CFITSS位设置为10B时,通过将RSCAN0GCFG寄存器中ITRCP[15:0]位的值 × 10 除以pclk/2来获得计数源。当CFITR和CFITSS位设置为x1B时,CANm位时钟用作计数源。

间隔时间由以下公式计算,其中M是ITRCP[15:0]的值,N是CFITT[7:0]的值。

(1)间隔计时器在传输完成时开始计数。由于在传输完成时预分频器没有初始化,因此一个间隔时间最多包含一个间隔计时器计数错误。

(2)间隔计时器从下一个计数启用信号递减。

(3)当间隔计时器减少到0时,发送/接收FIFO缓冲器发出传输请求。

(4)发送/接收FIFO缓冲器通过优先级来确定下一次发送,然后开始发送数据。传输通常从发出传输请求起延迟三个或更少的CANm位时钟周期开始。如果在所有信道中发生多个内部处理(例如,接收滤波器处理、消息路由和发送优先级确定),则可能产生高达582个pclk周期的延迟。

1.7.4 Transmission Using Transmit Queues

为每个信道的传输队列分配三到十六个缓冲器,并且这些传输缓冲器((16× m) +15)用作相应信道的访问窗口。

传输队列中的所有消息都是传输优先级确定的目标,并且以ID优先级顺序传输,而与存储顺序无关。如果两个具有相同ID的消息存储在传输队列中,则这些消息并不总是按照它们在传输队列中的存储顺序进行传输。

RSCAN0TXQCCm寄存器的TXQE位置为0将禁用传输队列。当TXQE位设置为0时,RSCAN0TXQSTSm寄存器的TXQEMP标志位在以下时间置为1(传输队列不包含消息(亦即传输队列为空))。

◆ 当传输队列中没有消息正在传输或也不在下次传输时,传输队列立即变为空。

◆ 当队列中的消息正在传输或将要传输时,传输队列在传输完成、CAN总线错误检测或仲裁丢失后变为空。

当TXQE位被清除为0时,传输队列中的所有消息都将丢失,并且消息不能存储在传输队列中。在再次将TXQE位置为1之前,确认TXQEMP标志位置为1。

1.7.5 Transmit History Function

有关传输完成message的信息可以存储在传输历史缓冲区中。每个通道都有一个传输历史缓冲区,可以包含16组传输历史数据。

可以通过RSCAN0THLCCm寄存器中的THLDTE位选择消息传输源缓冲区类型。RSCAN0CFIDk(k=0到17)寄存器中的第n位确定是否为每条消息的传输历史数据已经存储。成功完成传输后,关于传输message的以下信息将被存储在传输历史缓冲器中。存储成功完成传输的历史数据将占用多达150个pclk周期。

 标签数据用于标识每条消息。唯一标签数据可以添加到传输缓冲区、传输队列或传输/接收FIFO缓冲区传输的每条消息中。

传输历史数据可以从RSCAN0THLACCm寄存器读取。如果试图在缓冲区已满时存储新的传输历史数据,则缓冲区溢出,新数据被丢弃。

1.8 Gateway Function

当发送/接收FIFO缓冲区设置为网关模式时,接收消息可以从任意通道发送,无需CPU干预。

当RSCAN0CFCCk寄存器的CFM[1:0]位置为10B(网关模式)并且由寄存器RSCAN0GAFLP1j选定的传输message的收发FIFO缓冲buffer时,根据接收规则通过滤波处理的消息存储在指定的发送/接收FIFO缓冲器中,并从缓冲器自动发送。

存储在发送/接收FIFO缓冲器中的消息以先进先出的方式依次发送。只有下一个要传输的消息会成为传输优先级确定的目标。

通过将RSCAN0CFCCk寄存器中的CFE位置为0,并且CFEMP标志位根据下面的定时变为1,网关模式下的发送/接收FIFO缓冲区被禁用。

◆ 当发送/接收FIFO缓冲区中的消息未被发送且下一次也不被发送时,该缓冲区立即变空。

◆ 当发送/接收FIFO缓冲区中的消息正在传输或在下一次进行传输时,发送/接收FIFO缓冲区在传输完成、CAN总线错误检测或仲裁丢失后变位空。

当CFE位被清除为0时,发送/接收FIFO缓冲区中的所有消息都将丢失,消息不能再存储在发送/接收FIFO缓冲区中。再次将CFE位置为1前,先确认CFEMP标志位置为1。

1.9 RS-CAN Setting Procedure

1.9.1 Initial Settings

在MCU复位后,RS-CAN模块初始化CAN RAM。RAM初始化时间是7298个pclk周期。在RAM初始化期间,RSCAN0GSTS寄存器中的GRAMINIT标志位置为1(CAN RAM初始化正在进行),初始化完成时,将清除为0(CAN RAM初始化完成)。GRAMINIT标志位清0后可进行CAN设置。显示了MCU复位后的CAN设置流流程。

                                      |

 

1.9.1.1 Clock Setting

将CAN时钟(fCAN)设置为RS-CAN模块的时钟源。使用RSCAN0GCFG寄存器的DCS位选择clk_xincan或clkc。

1.9.1.2 Bit Timing Setting

在CAN协议中,通信帧的每一位由三个段SS、TSEG1和TSEG2组成,其中两个段TSEG1和TSEG2可由RSCAN0CmCFG寄存器为每个信道设置。可以通过设置这两段来确定采样点timing。该timing可以以1个时间量(以下称为Tq)为单位进行调整。1Tq等于一个CANmTq时钟周期。通过在RSCAN0GCFG寄存器中用DCS位选择时钟源,并在RSCAN0CmCFG寄存器中用BRP[9:0]位选择时钟分频比,可以获得CANmTq时钟。

19.9.1.3 Communication Speed Setting

使用fCAN、波特率预分频器除法值(RSCAN0CmCFG寄存器中的BRP[9:0]位)和每个位时间的Tq数来设置每个通道的CAN通信速度。

CAN时钟控制框图,通信速度设置的示例。

 

1.9.1.4 Receive Rule Setting

可以使用接收规则相关寄存器设置接收规则。

每页最多可以注册16个接收规则。通过RSCAN0GAFLECRT寄存器的AFLPN[4:0]位指定页0到23。使用AFLDAE位设置接收规则表写入使能/写入失能。

 

1.9.1.5 Buffer Setting

设置缓冲区的大小和中断源。对于设置为传输模式的传输/接收FIFO缓冲区,将其链接到传输缓冲区。

1.10 Notes on the RS-CAN Module

◆ 更改全局模式时,请检查RSCAN0GSTS寄存器中的GSLPSTS、GHLTSTS和GRSTSTS标志位是否转换。更改通道模式时,检查RSCAN0CmSTS寄存器(m=0到5)中的CSLPSTS、CHLTSTS和CRSTSTS标志位是否转换。

◆ 接收过滤处理按从小到大的编号检查接收规则。如果多个接收规则设置了相同的ID、IDE位或RTR位值,则接收规则的最小编号将用于接收过滤处理。

◆ 将传输缓冲区链接到传输/接收FIFO缓冲区或将传输缓冲区分配到传输队列时,将相应传输缓冲区的控制寄存器(RSCAN0TMCp)置为00H。不可使用相应传输缓冲区的状态寄存器(RSCAN0TMSTSp)。其他状态寄存器(寄存器RSCAN0TMTRSTS0到RSCAN0TMTRSTS2,RSCAN0TMTARSTS0到RSCAN0TMTARSTS2,RSCAN0TMTCSTS0到RSCAN0TMTCSTS2,以及RSCAN0TMTASTS0到RSCAN0TMTASTS2)的标志位保持不变,这些标志位对应于链接到发送/接收FIFO缓冲区或分配给发送队列的发送缓冲区。将相应中断使能寄存器(寄存器RSCAN0TMIEC0到RSCAN0TMIEC2)中的使能位置为0(传输缓冲区中断被禁用)。

◆ 链接到传输/接收FIFO缓冲区的传输缓冲区不得分配给传输队列。

◆ 一个发送/接收FIFO缓冲区链接到一个发送缓冲区。不要将两个或多个发送/接收FIFO缓冲区链接到相同编号的发送缓冲区。

◆ CANm位时钟作为时间戳计数器时钟源时,当相应的信道转换到信道复位模式或信道停止模式时,时间戳计数器停止。

◆ 如果在接收FIFO缓冲区和发送/接收FIFO缓冲区已满时尝试存储新接收的消息,则新消息被丢弃。如果要在发送/接收FIFO缓冲区或发送队列中存储新的发送消息,请检查发送/接收FIFO缓冲区或发送队列是否已满。

◆ 当RS-CAN模块从全局复位模式退出转换到全局操作模式或全局测试模式时,未使用的接收缓冲区(RSCAN0RMIDq、RSCAN0RMPTRq、RSCAN0RMDF0q和RSCAN0RMDF1q寄存器)、接收FIFO缓冲区访问寄存器(RSCAN0RFIDx、RSCAN0RFPTRx、RSCAN0RFDF0x和RSCAN0RFDF1x寄存器)和发送/接收FIFO缓冲区访问寄存器(RSCAN0CFIDk、RSCAN0CFPTRk、RSCAN0CFDF0k、RSCAN0CFDF1k寄存器)

11

      例程:

/******************************************************************************

* Function Name : void R_CAN_Init( void )

* Description   : This function initializes RS-CAN.

* Argument    : none

* Return Value  : none

******************************************************************************/

void R_CAN_Init( void )

{       

    /* RAM initialize */

    while ((RSCAN0GSTS & R_CAN_GRAMINIT_ON) != 0UL)

    {

        __asm( "nop");

    }

    /* Global stop mode -> Global reset mode

    RSCAN0GCTR    – Global Control Register

    */

    RSCAN0GCTR &= ~(1<<2);

    while ((RSCAN0GSTS & R_CAN_GSLPSTS_ON) != 0UL)

    {

        __asm( "nop");

    }

    /* Channel stop mode -> Channel reset mode (Channel 0)

    RSCAN0CmCTR   – Channel Control Register

    */

    RSCAN0C0CTR &= ~(1<<2); /* Sets the channel communication mode */

    while ((RSCAN0C0STS & (0x00000004)) != 0UL)

    {

        __asm( "nop");

    }

    RSCAN0C1CTR &= ~(1<<2); /* Sets the channel communication mode */

    while ((RSCAN0C1STS & (0x00000004)) != 0UL)

    {

        __asm( "nop");

    }

    RSCAN0C2CTR &= ~(1<<2);//(0x3UL); /* Sets the channel communication mode */

    while ((RSCAN0C2STS & (0x00000004)) != 0UL)

    {

        __asm( "nop");

    }

    /* Set RSCAN0GCFG register.

    RSCAN0GCFG    – Global Configuration Register

    */

    RSCAN0GCFG       = 0x00000010UL; /* DCS=1 use clk_xincan(16M)*/

    /* Set RSCAN0CmCFG register.

    RSCAN0CmCFG   – Channel Configuration Register

    Baud rate = fCAN / (SJW * TSEG1 * TSEG2) / BRP */

    RSCAN0C0CFG      = (CAN0_SJW << 24) | (CAN0_TSEG2 << 20) | (CAN0_TSEG1 << 16) | CAN0_BRP;

    RSCAN0C1CFG      = (CAN1_SJW << 24) | (CAN1_TSEG2 << 20) | (CAN1_TSEG1 << 16) | CAN1_BRP;

    RSCAN0C2CFG      = (CAN2_SJW << 24) | (CAN2_TSEG2 << 20) | (CAN2_TSEG1 << 16) | CAN2_BRP;

    /* Set Rx rules.

    RSCAN0GAFLCFG0- Receive Rule Configuration Register 0

    */

    RSCAN0GAFLCFG0   = 0x01010100UL;

    /* Receive Rule Table Write Enable, and select page 0

    RSCAN0GAFLECTR- Receive Rule Entry Control Register

    */

    RSCAN0GAFLECTR   = R_CAN_AFLDAE_ON | 0x00000000;

    /* Setting of the reception rule ID

    RSCAN0GAFLIDj – Receive Rule ID Register 0

    */

    RSCAN0GAFLID0    = CAN0_ID_FORMAT | 0x00000000UL; /* Data frame */

    RSCAN0GAFLID1    = CAN1_ID_FORMAT | 0x00000000UL; /* Data frame */

    RSCAN0GAFLID2    = CAN2_ID_FORMAT | 0x00000000UL; /* Data frame */

    /* Setting of the reception rule mask

    RSCAN0GAFLMj  – Receive Rule Mask Register 0

    */

    RSCAN0GAFLM0     = 0xC0000000UL; /* Consider IDE and RTR */

    RSCAN0GAFLM1     = 0xC0000000UL; /* Consider IDE and RTR */

    RSCAN0GAFLM2     = 0xC0000000UL; /* Consider IDE and RTR */

    /*Set RSCAN0GAFLP0j register.

    RSCAN0GAFLP0j – Receive Rule Pointer 0 Register 0

    */

    RSCAN0GAFLP00    = 0x00000000UL; /* No DLC check, use Rx buffer 0 */

    RSCAN0GAFLP01    = 0x00000000UL; /* No DLC check, use Rx buffer 1 */

    RSCAN0GAFLP02    = 0x00000000UL; /* No DLC check, use Rx buffer 1 */

    /*Set RSCAN0GAFLP1j register.

    RSCAN0GAFLP1j – Receive Rule Pointer 1 Register 0

    */

    RSCAN0GAFLP10    = 0x00000001UL; /* not use FIFO */

    RSCAN0GAFLP11    = 0x00000002UL; /* not use FIFO */

    RSCAN0GAFLP12    = 0x00000004UL; /* not use FIFO */

    RSCAN0RFCC0 = 0x0000F703;

    RSCAN0RFCC1 = 0x0000F703;

    RSCAN0RFCC2 = 0x0000F703;

    /* Receive Rule Table Write Disabel

    RSCAN0GAFLECTR- Receive Rule Entry Control Register

    */

    RSCAN0GAFLECTR   = 0x00000000UL;

    /* Set Rx buffer number.

    RSCAN0RMNB    – Receive Buffer Number Register

    */

    RSCAN0RMNB       = 2UL;

    /* Set RSCAN0GCTR register. */

    RSCAN0GCTR       = 0x00000001UL; /* GMDC[1:0]=01B */

    /* Channel stop mode -> Channel reset mode (Channel 0)

    RSCAN0CmCTR   – Channel Control Register

    */

    RSCAN0C0CTR      = 0x00000001UL| (3<<11) |(3<<21); /* CHMDC[1:0]=01B */

    RSCAN0C1CTR      = 0x00000001UL; /* CHMDC[1:0]=01B */

    RSCAN0C2CTR      = 0x00000001UL; /* CHMDC[1:0]=01B */

    /* Set interrupt flags. */

    INTC1MKRCANGERR0               = 1U;

    INTC1RFRCANGERR0               = 0U;

    INTC1TBRCANGERR0               = 0U;

    INTC1MKRCAN0ERR               = 0U;

    INTC1RFRCAN0ERR               = 0U;

    INTC1TBRCAN0ERR               = 1U;

    INTC1MKRCAN0TRX               = 1U;

    INTC1RFRCAN0TRX               = 0U;

    INTC1TBRCAN0TRX               = 0U;

    /* Global reset mode -> global communication mode

    RSCAN0GCTR    – Global Control Register

    */

    RSCAN0GCTR &= ~R_CAN_GMDC_MASK; /* GMDC[1:0] = 00B */

    while ((RSCAN0GSTS & R_CAN_GRSTSTS_ON) != 0UL)

    {

        __asm( "nop");

    }

    /* Channel reset mode -> Channel communication mode (Channel 0)

    RSCAN0CmCTR   – Channel Control Register

    */

    RSCAN0C0CTR &= ~R_CAN_CHMDC_MASK; /* CHMDC[1:0] = 00B */

    while ((RSCAN0C0STS & R_CAN_CRSTSTS_ON) != 0UL)

    {

        __asm( "nop");

    }

    RSCAN0C1CTR &= ~R_CAN_CHMDC_MASK; /* CHMDC[1:0] = 00B */

    while ((RSCAN0C1STS & R_CAN_CRSTSTS_ON) != 0UL)

    {

        __asm( "nop");

    }

    RSCAN0C2CTR &= ~R_CAN_CHMDC_MASK; /* CHMDC[1:0] = 00B */

    while ((RSCAN0C2STS & R_CAN_CRSTSTS_ON) != 0UL)

    {

        __asm( "nop");

    }

    RSCAN0RFCC0 = 0x0000F703;

    RSCAN0RFCC1 = 0x0000F703;

    RSCAN0RFCC2 = 0x0000F703;

    INTC1P0RCAN0REC = 0;

    INTC1P1RCAN0REC = 0;

    INTC1P2RCAN0REC = 0;

    INTC2P0RCAN1REC = 1;

    INTC2P1RCAN1REC = 1;

    INTC2P2RCAN1REC = 1;

    INTC2P0RCAN2REC = 1;

    INTC2P1RCAN2REC = 1;

    INTC2P2RCAN2REC = 1;

    INTC1MKRCANGRECC0 = 0U;

    INTC1RFRCANGRECC0 = 0U;

    INTC1TBRCANGRECC0 = 1U;

}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平