这两个寄存器经常会搞混了,在这里记录一下,以备下次使用时查阅。
单片机为飞思卡尔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)。
-------------------------------------------------------------------------------------------下面摘自手册-------------------------------------------------------------------------------------------------------------------------
滤波器需要用到 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标志。
--------------------------------------------顺便记录下两种帧------------------------------------------------------------------------
其中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);
标准帧(发送)
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);
补充:
标准帧:数据长度8字节的情况下,占108位,再加上帧间隙3个位,总共111位
250k波特率下:每秒理论最多传输250000/111=2252帧
500k波特率下:每秒理论最多传输500000/111=4504帧
扩展帧:数据长度8字节的情况下,占128位,再加上帧间隙3个位,总共131位
250k波特率下:每秒理论最多传输250000/131=1908帧
500k波特率下:每秒理论最多传输500000/131=3816帧