NXP

NXP MPC574X CAN接收滤波配置

2019-07-12 11:56发布

概述

CAN模块的滤波器设计,主要是配置相应的ID MASK。MPC系列的PowerPC处理器的CAN滤波功能还是挺强大的,可以根据实际需要配置成多种形式,下面只是对一些常见的滤波形式做简单介绍。本人也是刚刚接触,如果有错误的地方,欢迎指正。

滤波器设计

CAN_RXMGMASK的寄存器配置作用于所有的Mail BoxID滤波,如果想每个Mail Box设置不同的滤波ID,可以使能MCR寄存器的IRMQ位。而IRMQ位上电后默认初始化为0,下面先说一下如何配置CAN_RXMGMASK寄存器。
由下图可知,和ID滤波相关的bit位为[28:0]。所以在设计滤波值时,只需要关注这29个bit位就行。
在这里插入图片描述
如下图所示,是CAN模块ID的结构。其中标准ID11Bit扩展ID29Bit。这里以标准ID模式来说明如何配置CAN_RXMGMASK寄存器。
在这里插入图片描述
通过上述描述,配置为标准ID模式时,只需要关注CAN_RXMGMASK寄存器的MG[28:18]就可以了。这里要注意的是,MPC574X虽然是大端模式,但是这里的MG31却对应存储的bit0 CAN_0.MB[8].CS.B.IDE = 0; /* MB 8 will look for a standard ID */ CAN_0.MB[8].ID.B.ID_STD = 0x500; /* MB 8 will look for ID = 0x555 */ CAN_0.MB[8].CS.B.CODE = 4; /* MB 8 set to RX EMPTY */ CAN_0.RXMGMASK.R = 0x1C03ffff; /* Global acceptance mask */ 在上述代码中,将RXMGMASK寄存器配置为0x1C03FFFF。及对应的MG[28:18]为111 0000 0000。故配置完后,只接收0x5xx类型的ID帧。

CAN配置详细代码

/* General init. No MB IDs iniialized */ void FlexCAN0_Init(void) { uint8_t i; CAN_0.MCR.B.MDIS = 1; /* Disable module before selecting clock source*/ CAN_0.CTRL1.B.CLKSRC= 0; /* Clock Source = oscillator Clock (8 MHz) */ CAN_0.MCR.B.MDIS = 0; /* Enable module for config. (Sets FRZ, HALT)*/ while (!CAN_0.MCR.B.FRZACK) {} /* Wait for freeze acknowledge to set */ /* CAN bus: 10 MHz clksrc, 500K bps with 16 tq */ /* PRESDIV+1 = Fclksrc/Ftq = 8 MHz/8MHz = 1 */ /* so PRESDIV = 0 */ /* PSEG2 = Phase_Seg2 - 1 = 4 - 1 = 3 */ /* PSEG1 = PSEG2 = 3 */ /* PROPSEG= Prop_Seg - 1 = 7 - 1 = 6 */ /* RJW = Resync Jump Width - 1 = 4 = 1 */ /* SMP = 1: use 3 bits per CAN sample */ /* CLKSRC=0 (unchanged): Fcanclk= Fxtal= 10 MHz*/ CAN_0.CTRL1.B.PRESDIV = 0; CAN_0.CTRL1.B.PSEG1 = 3; CAN_0.CTRL1.B.PSEG2 = 3; CAN_0.CTRL1.B.PROPSEG = 6; CAN_0.CTRL1.B.RJW = 3; CAN_0.CTRL1.B.SMP = 1; for(i=0; i<64; i++){ //MPC574xP has 64 buffers CAN_0.MB[i].CS.B.CODE = 0; /* Inactivate all message buffers */ } CAN_0.MB[0].CS.B.CODE = 8; /* Message Buffer 0 set to TX INACTIVE */ // interrupt mask CAN_0.IMASK1.R = 0x00000100; // mail buffer 8 set to receive CAN_0.MB[8].CS.B.IDE = 0; /* MB 8 will look for a standard ID */ CAN_0.MB[8].ID.B.ID_STD = 0x500; /* MB 8 will look for ID = 0x555 */ CAN_0.MB[8].CS.B.CODE = 4; /* MB 8 set to RX EMPTY */ CAN_0.RXMGMASK.R = 0x1C03ffff; /* Global acceptance mask */ /* set mask registers - all ID bits must match */ for(i=0;i<64;i++) { CAN_0.RXIMR[i].R = 0x00; } /* Configure the CAN0_TX pin to transmit. */ SIUL2.MSCR[PB0].B.SSS = 1; //PTB0 is for CAN0_TX. Select signal source select to CAN0_TX SIUL2.MSCR[PB0].B.OBE = 1; //Set pin to output. Enable output buffer SIUL2.MSCR[PB0].B.SRC = 3; //Maximum slew rate /* Configure the CAN0_RX pin. */ SIUL2.MSCR[PB1].B.IBE = 1; //PB1 is CAN0_RX pin. Enable input buffer SIUL2.IMCR[32].B.SSS = 0b0010; //Set PB1 as CAN0_RX. // CAN_0.MCR.B.AEN = 1; CAN_0.MCR.B.MAXMB = 0x3f; // CAN_0.MCR.B.IRMQ = 1; CAN_0.MCR.B.HALT = 0; while (CAN_0.MCR.B.FRZACK & CAN_0.MCR.B.NOTRDY) {} /* Wait to clear */ /* Good practice: wait for FRZACK on freeze mode entry/exit */ INTC_0.PSR[524].R = 0x8009; }

滤波模式

根据Module Configuration Register (CAN_MCR) 寄存器中的IDAM(ID 验收模式) 可知,CAN模块的ID滤波器可以工作于4种模式,分别为
  1. 形式A:
    每个滤波元素表包含一个全局的(标准或扩展)ID;
  2. 形式B:
    每个滤波元素表包含两个完全标准ID或者两个局部的14位(标准或扩展)ID;
  3. 形式C:
    每个滤波元素表包含四个8位宽标准ID;
  4. 形式D:
    拒绝所有帧;
IDAM
上电后默认滤波模式为FormatA形式,所以下面以FormatA形式来说明如何配置CAN_RXMGMASK寄存器。
如下图所示,A模式下的RXIDA占用FGM寄存器的[29:1]。这里要注意的是,MPC574X虽然是大端模式,但是这里的FGM31却对应存储的bit0
在这里插入图片描述
关于带FIFO接收的ID滤波后续再补充。