MSCAN标识符验收及掩码寄存器配置

这两个寄存器经常会搞混了,在这里记录一下,以备下次使用时查阅。

单片机为飞思卡尔16位单片机,下面以自己的理解来解释这两个寄存器。

CANIDAR0-7(标识符验收寄存器):如果接收的ID中有对应的位都为1,则该位在此寄存器写1,不全为1的(00,01,10)均为0;

举例说明:

需要接收的ID(标准帧)

ID1:0x550;ID寄存器值:0xAA00;ID寄存器二进制值:1010 1010 0000 0000

ID2:0x750;ID寄存器值:0xEA00;ID寄存器二进制值:1110 1010  0000 0000

这里的ID寄存器值是指存放ID的寄存器里的值,可以看出这两个ID里共同为1的位为:1010 1010 0000 0000

CANIDMR0-7(标识符掩码寄存器):该寄存器为0的位为必须比较的位,为1的位为不用比较的位。

根据上例,这两个ID中的值大部分一样,只有高位中的第7位不同,因此该寄存器的值为0100 0000 0000 0000

在初始化里可以这样赋值

 CANIDAC_IDAM0=0;//2个32位的滤波器
  CANIDAC_IDAM1=0;
  //标识符验收寄存器
  CANIDAR0 = 0x20;
  CANIDAR1 = 0x00;
  CANIDAR2 = 0x00;
  CANIDAR3 = 0x00;


  //标识符掩码寄存器
  CANIDMR0 = 0x00;
  CANIDMR1 = 0x00;
  CANIDMR2 = 0x00;
  CANIDMR3 = 0x00; 

这两个寄存器相互配合使用,按照上面的配置,在标准帧中,只使用前2个(CANIDAR0/1,CANIDMR0/1);扩展帧中,使用前4个(CANIDAR0-3,CANIDMR0-3)。

 

-------------------------------------------------------------------------------------------下面摘自手册-------------------------------------------------------------------------------------------------------------------------

MSCAN标识符验收及掩码寄存器配置_第1张图片

滤波器需要用到 CANIDAC寄存器中的IDAM0和IDAM1,其组合关系见上图。


CAN 2.0B 标准的长扩展标识符提供两个滤波器。

图 12-39 显示第一个 32 位滤波器页 (CANIDAR0 – CANIDAR3、 CANIDMR0 – CANIDMR3)如何产生滤波器 0 匹配。 同样,第二个滤波器页 (CANIDAR4 – CANIDAR7、 CANIDMR4 – CANIDMR7) 产生滤波器 1 匹配。 
•   4 个标识符接收滤波器,每个应用于: 
— a) 扩展标识符的 14 个最重要位,加上CAN 2.0B 报文的 SRR 和 IDE 位,或 
— b) 标准标识符的 11 位、CAN 2.0A/B 报文的 RTR 和 IDE 位。图 12-40 显示第一个 32 位滤波器页 (CANIDAR0 – CANIDA3、 CANIDMR0 – 3CANIDMR)如何产生滤波 器 0 和 1 匹配。同样,第二个滤波器页 (CANIDAR4 – CANIDAR7、 CANIDMR4 – CANIDMR7)产生滤波器 2 和 3 匹配。 
•   8 个标识符接收滤波器,每个应用于标识符的前 8 位。这种模式为符合 CAN 2.0A/B 的标 准标识符或符合 CAN 2.0B 的扩展标识符的前 8 个位实施 8 个独立的滤波器。图 12-41 显 示第一个 32 位滤波器页 (CANIDAR0 – CANIDAR3、 CANIDMR0 – CANIDMR3)如 何产生滤波器 0-3 匹配。同样,第二个滤波器页 (CANIDAR4 – CANIDAR7、 CANIDMR4 – CANIDMR7)产生滤波器 4-7 匹配。 
•   关闭滤波器。没有CAN 报文被复制到前景缓冲器 RxFG,且从不设置 RXF标志。

MSCAN标识符验收及掩码寄存器配置_第2张图片

 

MSCAN标识符验收及掩码寄存器配置_第3张图片

 

 

 

MSCAN标识符验收及掩码寄存器配置_第4张图片

 

--------------------------------------------顺便记录下两种帧------------------------------------------------------------------------

其中s08和s12的格式相同

扩展帧(发送)

 

    CAN0TXIDR0 = (unsigned char)(msg.ID>>21);
    CAN0TXIDR1 = (unsigned char)(((msg.ID>>15)&0x07)|((msg.ID>>13)&0xE0)|0x18);
    CAN0TXIDR2 = (unsigned char)(msg.ID>>7);
    CAN0TXIDR3 = (unsigned char)(msg.ID<<1);

 

 

 

 

 

MSCAN标识符验收及掩码寄存器配置_第5张图片

 

标准帧(发送)

 

      CANTIDR0 = (unsigned char)(sendMsgBuf.ID>>3);
      CANTIDR1 = (unsigned char)(sendMsgBuf.ID<<5);
      CANTIDR1_SRR=sendMsgBuf.RTR;
      CANTIDR1_IDE=0;   

标准帧扩展帧(接收)

 

 

  if(!CAN0RXIDR1_IDE)                      
    RxMsg.ID = ((((UINT32)CAN0RXIDR0)<<8) + ((UINT32)CAN0RXIDR1)) >> 5;
  else
    RxMsg.ID = (UINT32)((UINT32)CAN0RXIDR0<<21)|(UINT32)((((CAN0RXIDR1>>5)<<3)| 
    ((UINT32)(CAN0RXIDR1&0b00000111)))<<15)| (UINT32)(CAN0RXIDR2<<7)|(CAN0RXIDR3>>1);

 

 

 

 

 

 

 

MSCAN标识符验收及掩码寄存器配置_第6张图片

 

补充:

标准帧:数据长度8字节的情况下,占108位,再加上帧间隙3个位,总共111位

250k波特率下:每秒理论最多传输250000/111=2252帧

500k波特率下:每秒理论最多传输500000/111=4504帧

扩展帧:数据长度8字节的情况下,占128位,再加上帧间隙3个位,总共131位

 

250k波特率下:每秒理论最多传输250000/131=1908帧

500k波特率下:每秒理论最多传输500000/131=3816帧

 

MSCAN标识符验收及掩码寄存器配置_第7张图片

 

 

 

 

 

 

你可能感兴趣的:(嵌入式)