Re: Re: CAN Mask & Filter setting at ---- software level

Steinhoff <[email protected]>
Newsgroups gmane.comp.hardware.bus.can
Message-ID <[email protected]>
Dinesh Guleria wrote:
> How you are setting class or mask bit ?

  ??

>
> In my case :--
>
> ID_1  =  0x01;       // 0000 0001
> ID_2  =  0x33;       // 0011 0011
> mask = 0x32;       // 0011 0010 -------------------------------------> 
> 0 for common bits, ------ where bits are different put bit as 1 -- for 
> dont care
> filter =    0x01;       // 0000 0001 
> ------------------------------------->  copy common bits to the filter 
> & dont care for the diffrent bits

??  Well ... you are right ... the CAN controller does it wrong :)


>
> On Wed, Dec 5, 2012 at 11:18 PM, Steinhoff <[email protected] 
> <mailto:[email protected]>> wrote:
>
>
>     BTW ... !( ( filter ^ messageID_Rx ) is equivalent to the VHDL
>     operatoin "filter = messageID_Rx"
>
>     --Armin
>
>
>     Dinesh Guleria wrote:
>>     >> it must be: !( ( filter ^ messageID_Rx ) OR mask );// if ^
>>     means exlusive OR
>>
>>     But where in your VHDL code you are using  ---- exlusiveOR(^) and
>>     not (!)operator ...?
>>
>>     On Wed, Dec 5, 2012 at 3:42 PM, Steinhoff <[email protected]
>>     <mailto:[email protected]>> wrote:
>>
>>         Dinesh,
>>
>>         here is some VHDL code of a CAN core showing the filter process:
>>
>>            -- Working in basic mode. ID match for standard format
>>         (11-bit ID).
>>            match <= (((((((CONV_STD_LOGIC(id(3)  =
>>         acceptance_code_0(0)) OR acceptance_mask_0(0))
>>                       AND (CONV_STD_LOGIC(id(4)  =
>>         acceptance_code_0(1)) OR acceptance_mask_0(1)))
>>                       AND (CONV_STD_LOGIC(id(5)  =
>>         acceptance_code_0(2)) OR acceptance_mask_0(2)))
>>                       AND (CONV_STD_LOGIC(id(6)  =
>>         acceptance_code_0(3)) OR acceptance_mask_0(3)))
>>                       AND (CONV_STD_LOGIC(id(7)  =
>>         acceptance_code_0(4)) OR acceptance_mask_0(4)))
>>                       AND (CONV_STD_LOGIC(id(8)  =
>>         acceptance_code_0(5)) OR acceptance_mask_0(5)))
>>                       AND (CONV_STD_LOGIC(id(9)  =
>>         acceptance_code_0(6)) OR acceptance_mask_0(6)))
>>                       AND (CONV_STD_LOGIC(id(10) =
>>         acceptance_code_0(7)) OR acceptance_mask_0(7)) ;
>>
>>         The "=" operator means equivalence ...
>>
>>         --Armin
>>
>>
>>         Dinesh Guleria wrote:
>>>         Armin,
>>>
>>>         >>Isn't it?
>>>
>>>         The real result must be:-----
>>>          !( ( filter ^ messageID_Rx ) & mask );
>>>
>>>         Above equation is working for me very well many a time i
>>>         have  used it ..
>>>
>>>         //Dinesh
>>>
>>>         On Mon, Dec 3, 2012 at 11:25 PM, Steinhoff
>>>         <[email protected] <mailto:[email protected]>> wrote:
>>>
>>>
>>>             Well,
>>>
>>>             that what the SJA1000 specification is showing by the
>>>             "aceptance schemes" with the
>>>             logical gates is not correct ... there seems to be a
>>>             misinterpretation of the IEC gate symbol "=" :)
>>>
>>>             The real result must be:
>>>
>>>             result = NOT( filter XOR id ) OR mask;
>>>
>>>             Isn't it?
>>>
>>>             --Armin
>>>
>>>
>>>             Steinhoff wrote:
>>>>
>>>>             Dinesh.
>>>>
>>>>             the result should be:
>>>>
>>>>             result = ( filter XOR id ) OR mask;
>>>>
>>>>             Acceptance happens  if all bits are set in result.
>>>>
>>>>             Regards
>>>>
>>>>             --Armin
>>>>
>>>>             PS: SJA1000 spec / p. 45
>>>>
>>>>             Dinesh Guleria wrote:
>>>>>             Got the concept.
>>>>>
>>>>>             Now if i want DM to trigger for following types 0x01 &
>>>>>             0x33 :--
>>>>>
>>>>>             Type to be accepted :--
>>>>>             0x01;  // 0000 0001
>>>>>             0x33;  // 0011 0011
>>>>>
>>>>>             mask = 0xCD;   // 1100 1101  -----> put 0 for diffrent
>>>>>             bits ------ & ------ 1 for common bits
>>>>>             filter = 0x01;      // 0000 0001   ------>put 0 for
>>>>>             dont care bits ------ & ------ SAME VALUE for common bits
>>>>>
>>>>>             result = ( ( filter ^ a_ ) & mask );
>>>>>             if(!result)
>>>>>             {
>>>>>                  //accept
>>>>>             }
>>>>>
>>>>>
>>>>>             This will Rx 0x001, 0x003, 0x011, 0x013, 0x021, 0x023,
>>>>>             0x031 and 0x033 IDs.
>>>>>
>>>>>             Still in terms of CAN Rx workload for the processor,
>>>>>             only 6 unwanted IDs out of a possible total 2032 CAN
>>>>>             IDs (for 11 bit IDEs) to Rx may be of some reduced
>>>>>             workload benefit.
>>>>>
>>>>>             We can put further filtering at the next level of
>>>>>             software to accept message what we want.
>>>>>
>>>>>             BTW, weonly get 2032 and not 2048 11 bit CAN IDs
>>>>>             because no IDs are allowed to have all 7 most
>>>>>             significant bits set at the same time.
>>>>>
>>>>>             Regards,
>>>>>             Dinesh
>>>>>
>>>>>
>>>>>             On Sat, Dec 1, 2012 at 9:34 PM, Dinesh Guleria
>>>>>             <[email protected] <mailto:[email protected]>>
>>>>>             wrote:
>>>>>
>>>>>                 Hi,
>>>>>
>>>>>                 I have enable my can controller to receive all
>>>>>                 messages & trying to filtering messages it at
>>>>>                 software level.
>>>>>                 I referred following link by Heikki
>>>>>                 http://old.nabble.com/Setting-CAN-MASK---ID-registers-td14881913.html
>>>>>
>>>>>                 Suppose i want to receive only ID_1 & ID_2.
>>>>>                 But I was not able to get the desired result
>>>>>                 ID-0x03 is still passing the software filter
>>>>>
>>>>>
>>>>>                 ID_1  =  0x01;       // 0000 0001
>>>>>                 ID_2  =  0x33;       // 0011 0011
>>>>>                 mask = 0x32;       // 0011 0010
>>>>>                 filter =  0x01;       // 0000 0001
>>>>>
>>>>>                 if  ----  messageID_Rx  =  0x03
>>>>>
>>>>>                 ==========  CODE ======================
>>>>>
>>>>>                 result = !( ( filter ^ messageID_Rx ) & mask );
>>>>>
>>>>>                 if ( result )
>>>>>                 {
>>>>>                       // ID accepted
>>>>>                 }
>>>>>
>>>>>
>>>>>                 ====================================
>>>>>
>>>>>                 Can someone on list help me to correct this. Or
>>>>>                 can suggest me where i am getting wrong ?
>>>>>                 Any reply will be appreciable.
>>>>>
>>>>>                 Thanks & Regards,
>>>>>
>>>>>                 Dinesh
>>>>>
>>>>>
>>>>
>>>
>>>
>>
>>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.