前言:
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:
RSCAN0CmCFGL:
RSCAN0CmCFGH:
RSCAN0CmCFGLL:
RSCAN0CmCFGLH:
RSCAN0CmCFGHL:
RSCAN0CmCFGHH:
复位值: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:
RSCAN0CmCTRL:
RSCAN0CmCTRH:
RSCAN0CmCTRH:
RSCAN0CmCTRLL:
RSCAN0CmCTRLH:
RSCAN0CmCTRHL:
RSCAN0CmCTRHH:
复位值: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:
RSCAN0CmSTSL:
RSCAN0CmSTSH:
RSCAN0CmSTSLL:
RSCAN0CmSTSHL:
RSCAN0CmSTSHH:
复位值:0000 0005H
这些位包含传输错误计数器值。有关传输错误计数器递增/递减条件,请参阅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:
RSCAN0CmERFLL:
RSCAN0CmERFLH:
RSCAN0CmERFLLL:
RSCAN0CmERFLLH:
RSCAN0CmERFLHL:
RSCAN0CmERFLHH:
复位值: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:
复位值: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:
RSCAN0GCTRL:
RSCAN0GCTRLL:
RSCAN0GCTRHL:
复位值: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;
}