NXP MPC574X CAN接收滤波配置

概述

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位就行。
NXP MPC574X CAN接收滤波配置_第1张图片
如下图所示,是CAN模块ID的结构。其中标准ID11Bit扩展ID29Bit。这里以标准ID模式来说明如何配置CAN_RXMGMASK寄存器。
NXP MPC574X CAN接收滤波配置_第2张图片
通过上述描述,配置为标准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:
    拒绝所有帧;

NXP MPC574X CAN接收滤波配置_第3张图片
上电后默认滤波模式为FormatA形式,所以下面以FormatA形式来说明如何配置CAN_RXMGMASK寄存器。
如下图所示,A模式下的RXIDA占用FGM寄存器的[29:1]。这里要注意的是,MPC574X虽然是大端模式,但是这里的FGM31却对应存储的bit0
NXP MPC574X CAN接收滤波配置_第4张图片
关于带FIFO接收的ID滤波后续再补充。

你可能感兴趣的:(#,PowerPC,嵌入式平台)