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만 통과하게 됩니다.
반응형