Hi Seung-Tang,
I suppose that you mean functions:
SetAcceptanceMode(byte Mode);
SetAcceptanceCode(dword AccCode1, dword AccCode2);
SetAcceptanceMask(dword AccMask1, dword AccMask2);
In fact, these functions just write Mode, AccCode1, AccCode2, AccMask1 and AccMask2 values into appropriate CANIDAC_IDAM, CANIDARx and CANIDMRx registers.
Since you use standard ID (11bit ID), you could define up to 4 16bit filters (or up to 8 8bit filters).
Note: The bit IDE=0 in the case of standard IDs.
I will focus now only on 16bit filter mode – Mode=0x01
When we will write your IDs as binary, we could see that four 16bit filters will be enough and simultaneously you will also filter-out all other IDs.
0x1F0 -> 001 1111 0000
0x1F1 -> 001 1111 0001
0x1F2 -> 001 1111 0010
0x1F3 -> 001 1111 0011
The first filter will be 001 1111 00XX = 0011 1110 0XX0 0000 after left alignment -> 0x3E00 (0x3E10 in the case of Remote frame) as ID and 0x0067 (0x0077 if we do not care whether it is Data or Remote frame) as mask.
Note: We do not care about the last three bits in 16bit filter
CANIDAR1 =0x3E, CANIDAR0 =0x00, CANIDMR1 =0x00, CANIDMR0 =0x67
0x1F4 -> 001 1111 0100
The second filter will be 001 1111 0100 = 0011 1110 1000 0000 after left alignment -> 0x3E80 (0x3E90 in the case of Remote frame) as ID and 0x0007 (0x0017 if we do not care whether it is Data or Remote frame) mask.
CANIDAR3 =0x3E, CANIDAR2 =0x00, CANIDMR3 =0x00, CANIDMR2 =0x07
0x5FA -> 101 1111 1010
0x5FB -> 101 1111 1011
The third filter will be 101 1111 101X = 1011 1111 01X0 0000 after left alignment -> 0xBF40 (0xBF50 in the case of Remote frame) as ID and 0x0027 (0x0037 if we do not care whether it is Data or Remote frame) mask.
CANIDAR5 =0xBF, CANIDAR4 =0x40, CANIDMR5 =0x00, CANIDMR4 =0x27
0x5FC -> 101 1111 1100
The fourth filter will be 101 1111 1100 = 1011 1111 1000 0000 after left alignment -> 0xBF80 (0xBF90 in the case of Remote frame) as ID and 0x0007 (0x0017 if we do not care whether it is Data or Remote frame) mask.
CANIDAR7 =0xBF, CANIDAR6 =0x80, CANIDMR7 =0x00, CANIDMR6 =0x07
The AccCode1,2 and AccMask1,2 types are defined as:
typedef union {
dword dw;
struct {
byte b0;
byte b1;
byte b2;
byte b3;
}b;
}DwordSwap;
Therefore the AccCode1 should be 0x003E003E, AccCode2 should be 0x40BF80BF, AccMask1 should be 0x67000700 and AccMask2 should be 0x27000700.
I hope that I didn’t make any mistake in my calculations.
Please check it.
I hope it helps you.
Have a great day,
RadekS
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------