TC389-MCMCAN模块
0 前言
1 MCMCAN模块
TC389的CAN模块称为MCMCAN模块,TC389共有3个MCMCAN模块,分别为CAN0,CAN1和CAN2,相关参数如下
每个MCMCAN模块在全局地址空间中都有一块专属的Message RAM区域,MCMCAN模块所有的寄存器、缓存空间不得超出这块区域,但是在区域内可自由分配
CAN0的功能最全,下面以CAN0模块为例:
- CAN0模块共有4个CAN Node和1个TTCAN Node
- CAN0模块的Message RAM共32K byte,所有的buffer、FIFO、Queue、register等等都在这段区域开辟,Host CPU可直接访问Message RAM
- CAN0模块有1个User Interface,管理CAN0模块的时钟、中断、引脚等等
每个CAN Node:
- 每个CAN Node都采用Bosch的M_CAN方法来实现
- 每个CAN Node都支持classical CAN和CAN FD,其中CAN FD支持64 bytes 数据传输
- 每个CAN Node有2个引脚,TXD和RXD
- 每个CAN Node有1个Node Timer
- 每个CAN Node有最多64个Rx Buffer,支持最多2个Rx FIFO
- 每个CAN Node有最多32个Tx Buffer,支持最多1个Tx FIFO / Tx Queue
2 CAN Node的配制
2.1 初始化
软件reset、硬件reset或者Bus Off后,CCCRi.INIT (i=0-3) 置1,CAN Node停止收发
CCCRi.INIT (i=0-3)置0使CAN Node进入运行状态,位流处理器(Bit Stream Processor,BSP) 等到下一个Bus Idle状态完成和CAN Bus的同步,可以进行CAN收发
CAN Node配置寄存器只有在CCCRi.INIT和CCCRi.CCE都为1的时候才能修改
- CCCRi.CCE只有在CCCRi.INIT为1的时候才能置1,在CCCRi.INIT为0自动置0
2.2 Normal Operation
默认模式
- event-driven,不是time triggers
- classical CAN,不是CAN FD
2.3 CAN FD Operation
CCCRi.FDOE (i=0-3) 是收发CAN FD frame功能启用位
- CCCRi.FDOE (i=0-3)置0(默认),则只收发classical CAN frame
- CCCRi.FDOE (i=0-3)置1且CCCRi.BRSE (i=0-3)置0,则开启没有bit rate switching的CAN FD frame功能
- CCCRi.FDOE (i=0-3)置1且CCCRi.BRSE (i=0-3)置1,则开启有bit rate switching的CAN FD frame功能
- 收发classical CAN frame总是可以的
有bit rate switching的CAN FD:CAN FD frame的control field, data field和CRC field以更高的bit rate进行传输
在CAN FD Operation下,之前CAN协议的保留位被解读为FDF位
- 11-bit ID的CAN frame的保留位为FDF位
- 29-bit ID的CAN frame的第一个保留位为FDF位
FDF=隐性(recessive,1)表示 CAN FD Frame
FDF=显性(dominant,0)表示 classical CAN Frame
在CAN FD Frame中,FDF之后的两个位res和BRS决定是否bit rate switching
- res=显性和BRS=隐性表示有bit rate switching
- res=隐性的编码保留用于协议的未来扩展
CAN FD Frame的Data Field可以设置12、16、20、24、32、48、64 byte
在CAN FD帧中,如果BRS位是隐性的,将在BRS位之后改变bit timing
- 在BRS位之前, CAN FD arbitration phase, the standard CAN bit timing使用Nominal Bit Timing 和 Prescaler Register NBTPi(i=0-3)
- 在BRS位之后, CAN FD data phase,the data phase bit timing使用Data Bit Timing和Prescaler Register DBTPi (i=0-3)
- bit timing在CRC位切换回来
- CAN FD data phase最大bit rate取决于fASYN
- fASYN=20 MHz且bit time为4 tq, data phase的bit rate为5 Mbit/s,MCMCAN模块可以稳定支持
- fASYN=80 MHz, data phase的bit rate为8 Mbit/s,需要用户自己考虑环境因素
唤醒信息必须以classical CAN格式传输
3 CAN Node的Receive
每个CAN Node都是CAN Message的收发实体
3.1 数据格式 Rx Buffer
CAN Node接收到Rx Frame以Rx Buffer的形式存放在Message RAM中,最多可以存放64个Rx Buffer数据
- 所有Rx Buffer地址必须连续,首地址在RXBCi.RBSA (i=0-3)中设置
每个Rx Buffer占用的RAM空间大小和能容纳的CAN Frame的Data Field大小是对应的
- RAM Size[byte] = Data Field[bytes] * 1/2 + 4
Rx Buffer由寄存器RxMsgk_R0 (k=0-63)、 RxMsgk_R1(k=0-63)和RxMsgk_DBm(k=0-63, m=0-63)组成
- RxMsgk_R0.ID (k=0-63)是Message ID,支持Standard ID和Extended ID,Standard ID放在高11位
- RxMsgk_R0.RTR (k=0-63)是Data Frame或Remote Frame标志位
- RxMsgk_R0.XTD (k=0-63)是Standard ID或Extended ID标志位
- RxMsgk_R0.ESI (k=0-63)是 Transmitting Node Error State Indicator
- RxMsgk_R1.RXTS (k=0-63)是 Rx Timestamp
- RxMsgk_R1.DLC (k=0-63)是 CAN Frame data length
- RxMsgk_R1.BRS (k=0-63)是 Bit Rate Switch标志位
- RxMsgk_R1.FDF (k=0-63)是classical CAN或者CAN FD标志位
- RxMsgk_R1.FIDX (k=0-63)对应的Filtering Element
- RxMsgk_R1.ANMF (k=0-63)没有被任何Filtering Element匹配的标志位
- RxMsgk_DBm(k=0-63, m=0-63)是8 bit寄存器,每个存储1 byte Data Field数据
3.2 数据接收管理
3.2.1 Dedicated Rx Buffer
Rx Buffer可以单个进行管理,每个Rx Buffer称为Dedicated Rx Buffer
- 所有的Dedicated Rx Buffer地址必须连续,首地址和Rx Buffer的首地址一样,在RXBCi.RBSA (i=0-3)中设置
- 所有Dedicated Rx Buffer占用Message RAM大小必须相同,按最大的设计,在RXESCi.RBDS (i=0-3)中设置
每个Dedicated Rx Buffer可设置过滤器(Filter),当CAN Bus上的CAN Message符合Filter时写入CAN Message数据
每个Dedicated Rx Buffer写入数据后都会被锁住,不会再从CAN Bus上写入新数据,直到CPU访问完Dedicated Rx Buffer后解锁
3.2.2 Rx FIFO
多个连续的Rx Buffer可以组成Rx FIFO进行管理,每个CAN Node最多可以设置2个Rx FIFO,分别为Rx FIFO 0,Rx FIFO 1
- FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存区域,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址
- FIFO可容纳元素数量称为深度Deepth,每个元素大小称为Size
- FIFO有写入指针WritePointer指向当前要写入数据的Element,完成一次写入后,WritePointer+1,指向下一个Element。写到最后Element后WritePointer回到第一个Element,循环往复
- FIFO有读取指针ReadPointer指向当前要读取数据的Element,完成一次读取后,WritePointer+1,指向下一个Element。读到最后Element后ReadPointer回到第一个Element,循环往复
- 当WritePointer追上ReadPointer时,代表所有Element都是最新值,称为Full状态,停止写入,等待读取
- 当ReadPointer追上WritePointer时,代表所有Element都已被读取,称为Empty状态,停止读取,等待写入
- 当FIFO进入Full状态后依然写入,则称为溢出(Overflow),为了避免溢出,可设置水线(Watermark),Watermark<Deepth。当已被读取的Element达到Watermark时降低读取速度或者提高写入速度
每个Rx FIFO最多可以包含64个Rx Buffer数据
- Rx FIFO的首地址为RXF0Ci.F0SA (i=0-3)和RXF1Ci.F1SA (i=0-3)
- 深度为RXF0Ci.F0S (i=0-3)和RXF1Ci.F1S (i=0-3)
- 水线为RXF0Ci.F0WM (i=0-3)和RXF1Ci.F1WM (i=0-3)
同一个Rx FIFO每个Rx Buffer的RAM Size必须相同,按最大的设计,在RXESCi.F0DS (i=0-3)和RXESCi.F1DS (i=0-3)中设置
Rx FIFO在溢出后的处理方式分为两种,Blocking Mode和Overwrite Mode,在RXF0Ci.F0OM (i=0-3)和RXF1Ci.F1OM (i=0-3)中设置
- Blocking Mode:FIFO溢出后不再写入数据,新Message被抛弃
- Overwrite Mode:FIFO溢出后用最新的Message覆盖最老的Element
Dedicated Rx Buffer和Rx FIFO 可以同时存在,但最多只能64个Rx Buffer,且按照Dedicated Rx Buffer、Rx FIFO 0、Rx FIFO 1的顺序排布
3.3 过滤器 Filter
Dedicated Rx Buffer和Rx FIFO可以设置过滤器(Filtering),确定CAN Bus上哪些Message被接收
CAN Node提供多个Filtering Element,每个Filtering Element定义1条过滤规则:
- 128个Standard Message ID Filtering Element,由StdMsgk_S0 (k=0-127)设置
- 64个Extended Message ID Filtering Element,由ExtMsgk_F0 (k=0-63)设置
每条Filtering Element可配制以下信息:
- Enable或者Disable此Filtering Element
- 设置过滤类型:范围过滤、精确过滤、bit mask过滤
- 设置优先级
- 设置按规则接收(Acceptance)或者拒绝(Rejection)
- 设置通过规则后储存给Dedicated Rx Buffer(64个独立)、Rx FIFO 0、Rx FIFO 1其中1个
每条Message都按顺序检测Filtering Element,只要任何1个Filtering Element检测成功,则接受Message,后续Filtering Element不再检测
4 CAN Node的Transmission
4.1 数据格式 Tx Buffer
CAN Node准备发送的Tx Frame以Tx Buffer的形式存放在Message RAM中,最多可以存放32个Tx Buffer数据
- 所有Tx Buffer地址必须连续,首地址在TXBCi.TBSA (i=0-3)中设置
每个Tx Buffer占用的RAM空间大小和能容纳的CAN Frame的Data Field大小是对应的
- RAM Size[byte] = Data Field[bytes] * 1/2 + 4
Tx Buffer由寄存器TxMsgk_T0 (k=0-31)、 TxMsgk_T1(k=0-31)和TxMsgk_DBm(k=0-31, m=0-63)组成
- TxMsgk_T0.ID (k=0-31)是Message ID,支持Standard ID和Extended ID,Standard ID放在高11位
- TxMsgk_T0.RTR (k=0-31) 是Data Frame或Remote Frame标志位
- TxMsgk_T0.XTD (k=0-31) 是Standard ID或Extended ID标志位
- TxMsgk_T0.ESI (k=0-31) 是 Transmitting Node Error State Indicator
- TxMsgk_T1.DLC (k=0-31) 是 CAN Frame data length
- TxMsgk_T1.BRS (k=0-31) 是 Bit Rate Switch标志位
- TxMsgk_T1.FDF (k=0-31) 是classical CAN或者CAN FD标志位
- TxMsgk_T1.EFC (k=0-31) 储存Tx Events控制位
- TxMsgk_T1.MM (k=0-31) CPU记录的信息
- TxMsgk_DBm(k=0-31, m=0-63) 是8 bit寄存器,每个存储1 byte Data Field数据
4.2 数据发送管理
4.2.1 Dedicated Tx Buffer
Tx Buffer可以单个进行管理,每个Tx Buffer称为Dedicated Tx Buffer
- 所有Dedicated Tx Buffer地址必须连续,首地址和Tx Buffer首地址一样,在TXBCi.TBSA (i=0-3)中设置
- 所有Dedicated Tx Buffer占用Message RAM大小必须相同,按最大的设计,在TXESCi.TBDS (i=0-3)中设置
- Dedicated Tx Buffer数量在TXBCi.NDTB (i=0-3)中设置
每个Dedicated Tx Buffer可通过TXBARi.ARn (i=0-3, n=0-31) 申请发送Message
多个Dedicated Tx Buffer同时申请发送时按Message ID仲裁,多个Dedicated Tx Buffer具有相同Message ID时按Tx Buffer的排序仲裁
4.2.2 Tx FIFO
多个连续的Tx Buffer可以组成Tx FIFO进行管理,Tx FIFO和Tx Queue只能二选一。通过TXBCi (i=0-3)切换FIFO模式和Queue模式
每个Tx FIFO最多可以包含32个Tx Buffer数据:
- 首地址在TXBCi.TBSA (i=0-3)中
- 深度在TXBCi.TFQS (i=0-3)中
Dedicated Tx Buffer和Tx FIFO 可以同时存在,但最多只能32个Tx Buffer,且按照Dedicated Tx Buffer、Tx FIFO的顺序排布
- 每次发送仲裁,将所有Dedicated Tx Buffer和最老的Tx FIFO Tx Buffer比较优先级,Message ID最小的先发送
4.2.3 Tx Queue
多个连续的Tx Buffer可以组成Tx Queue进行管理,Tx FIFO和Tx Queue只能二选一。通过TXBCi (i=0-3)切换FIFO模式和Queue模式
每个Tx Queue最多可以包含32个Tx Buffer数据:
- 首地址在TXBCi.TBSA (i=0-3)中
- 深度在TXBCi.TFQS (i=0-3)中
Tx Queue中Tx Buffer的Message ID越小优先级越高,Message ID小的先发送,Message ID相同则Tx Buffer顺序在前的先发送
Dedicated Tx Buffer和Tx Queue可以同时存在,但最多只能32个Tx Buffer,且按照Dedicated Tx Buffer、Tx Queue的顺序排布
- 每次发送仲裁,将所有Dedicated Tx Buffer和Tx Queue中的Tx Buffer比较优先级,Message ID最小的先发送,Message ID相同则Tx Buffer顺序在前的先发送
4.3 Tx Event FIFO
CAN Node每次发送Message,将本次发送的信息记录进一个Tx Event FIFO
Tx Event FIFO最大32 Element,由寄存器TxEventk_E0 (k=0-31)和TxEventk_E1(k=0-31)组成
- TxEventk_E0.ID (k=0-31)是Message ID,支持Standard ID和Extended ID,Standard ID放在高11位
- TxEventk_E0.RTR (k=0-31) 是Data Frame或Remote Frame标志位
- TxEventk_E0.XTD (k=0-31) 是Standard ID或Extended ID标志位
- TxEventk_E0.ESI (k=0-31) 是 Transmitting Node Error State Indicator
- TxEventk_E1.TXTS (k=0-31) 是时间戳Timestamp,记录发送时间
- TxEventk_E1.DLC (k=0-31) 是 CAN Frame data length
- TxEventk_E1.BRS (k=0-31) 是 Bit Rate Switch标志位
- TxEventk_E1.FDF (k=0-31) 是classical CAN或者CAN FD标志位
- TxEventk_E1.ET (k=0-31) Tx event或Transmission in spite of cancellation标志位
- TxEventk_E1.MM (k=0-31) CPU记录ID of Tx message status.
5 CAN Node的Timeout
CAN Node向Rx FIFO 0, Rx FIFO 1和Tx Event FIFO提供32 bit的Timeout Counter
- Timeout Counter由TOCCi (i=0-3)配制
- Timeout Counter的当前值由TOCVi.TOC (i=0-3)读取
Timeout Counter从TOCCi.TOP (i=0-3)开始递减,到达0时,set 中断标志位IRi.TOO (i=0-3)
- 当Timeout Counter配置为Continuous Mode,从CCCRi.INIT (i=0-3) reset开始第一次运行,触发中断后立即重置Timeout Counter继续运行
- 当Timeout Counter配置为Rx FIFO 0、Rx FIFO 1或Tx Event FIFO模式时,从相应FIFO存储第一个数据时开始第一次运行,触发中断后需要手动重置Timeout Counter