Study/STM32F

CAN fitering 방법

Answer Choi 2020. 12. 4. 11:32
반응형

CAN통신에서 데이터를 구분해서 받기 위해 필터링이라는 것이 존재합니다.

 

즉, 내가 원하는 것만 받을래~ 하는 것입니다.

레퍼런스 메뉴얼

레퍼런스 메뉴얼을 보시면 CAN 필터링에 대한 부분이 나옵니다.

 

ID MASK는 32비트 1개, 16비트 2개를 사용가능하며, ID LIST의 경우 32비트 2개, 16비트 4개를 사용할 수 있습니다.

 

레퍼런스 메뉴얼

그리고 위 그림처럼 여러개의 필터를 혼합해서 사용 가능합니다.

 

필터링은 크게 ID LIST와 MASK 방식이 있는데,

ID LIST방식은 특정 ID만 필터링하는 방법이고, ID MASK방식은 범위를 지정할 수 있습니다.

 

MASK 설정방법입니다.

 

11

10

9

8

7

6

5

4

3

2

1

HEX

ID

0

1

0

0

0

0

0

0

0

0

0

0x200

MASK

1

1

1

1

1

1

1

0

0

0

0

0x7F0

Result

0

1

0

0

0

0

0

1

1

1

1

0x20F

위 표를 보시면 ID부분에 0x200으로 설정하고, MASK를 0x7F0으로 설정하였습니다.

 

MASK의 1은 ID와 같아야만 통과가 가능하고, 0은 0 don't care입니다.

 

따라서 필터를 통과하는 범위는 0x200~0x20F까지의 ID를 통과시킵니다.

{
    sFilterConfig.FilterNumber = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterIdHigh = 0x200<<5;
    sFilterConfig.FilterIdLow =  0;
    sFilterConfig.FilterMaskIdHigh = 0x7F0<<5;
    sFilterConfig.FilterMaskIdLow = 0x0000;    
    sFilterConfig.FilterFIFOAssignment = CAN_FIFO0; 
    sFilterConfig.FilterActivation = ENABLE;
    sFilterConfig.BankNumber = 14; 
    if(HAL_OK != HAL_CAN_ConfigFilter(phcan, &sFilterConfig)) {
        Error_Handler();
}

위 필터 마스크를 코드로 나타낸 것입니다.

 

32bit mask 방식을 사용하였으며, 0x200~0x20F까지의 ID를 통과시킵니다.

 

ID LIST방식은 통과시킬 ID를 그냥 적어주면 됩니다.

{
    sFilterConfig.FilterNumber = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterIdHigh = 0x200<<5;
    sFilterConfig.FilterIdLow =  0;
    sFilterConfig.FilterMaskIdHigh = 0x000;
    sFilterConfig.FilterMaskIdLow = 0x0000;    
    sFilterConfig.FilterFIFOAssignment = CAN_FIFO0; 
    sFilterConfig.FilterActivation = ENABLE;
    sFilterConfig.BankNumber = 14; 
    if(HAL_OK != HAL_CAN_ConfigFilter(phcan, &sFilterConfig)) {
        Error_Handler();
}

위와 같이 설정하면 ID 0x200만 통과하게 됩니다.

반응형