文章
Smart ID filter
Refer to NTCAN Application Developers Manual document charpter
- 3.8.3 Smart ID Filter
- 4.2.9 canIoctl, CAN message filter related I/O controls.
- 6.2.22 NTCAN_FILTER_MASK
1st filter stage
The CAN-IDs and Event-IDs are enabled or disabled with canIdRegionAdd() and canIdRegionDelete(). 第一阶段filter可以设定一个比较大的ID的范围。
2nd filter stage
- ACR: Acceptance Code Register
- AMR: Acceptance Mask Register
The acceptance filter is realized by a logical AND-combination of an acceptance code, followed by a logical OR-combination with the acceptance mask according to the following figure.

Example code
sif.c: CAN msgs with 11-bit ID=0x1, 0x5, 0x9, 0xC can be received.
/* 1st stage filter */
uint32_t idCnt = 0x800;
retvalue = canIdRegionAdd(rxhandle, 0, &idCnt);
if (retvalue != NTCAN_SUCCESS)
{
printf("canIdAdd() failed with error %d!\n", retvalue);
canClose(rxhandle);
return(-1);
}
/* 2nd stage filter */
filter.acr = 0x00000001;
filter.amr = 0x0000000C;
filter.idArea = NTCAN_IDS_REGION_20A;
canIoctl(rxhandle, NTCAN_IOCTL_SET_HND_FILTER, &filter);
- 第一阶段filter,用canIdRegionAdd把所有11-bit ID(0-0x7ff)都包含进来。
- 第二阶段是重点。取ACR为32bit的0x00000001,取AMR为32it的0x0000000C。idArea=NTCAN_IDS_REGION_20A设定了只会处理0x7ff以内的内容。把ACR,AMR和接收到的ID都展开成binary的形式,就会比较好理解。
要让一个ID能够被接收到,如下步骤可以通俗的理解一下。
- 如果ACM的某个bit位上设为1,则接收到的ID在此bit位上可以是任意值(不管是0还是1)。就是所谓的don't care condition。
- 如果ACM的某个bit位上设为0,则需要参考此bit位上的ACR的值。
- 所有非don't care condition的bit位上的取值都要与ACR一致。

执行结果
在Demo System中的Linux Debian主机上编译执行sif.c,处于持续接收CAN消息状态。然后在Demo System中Notebook PC上,执行如下cantest命令,连续发送32条CAN消息,消息ID为11-bit ID从0到0x1F。cantest 50 0 0x0 0x1F 0 10 100 50 5000 0 32 0x22 0x33
./sif过滤后,只有ID为0x1, 0x5, 0x9, 0xC的CAN消息能被收到。
bobtu@debian:~/ntcantest$ ./sif
CAN msgs with 11-bit ID=0x1, 0x5, 0x9, 0xC can be received.
Id of received message :1!
Len of received message :2!
Rtr of received message :0!
Byte 0 of received message :22!
Byte 1 of received message :33!
Id of received message :5!
Len of received message :2!
Rtr of received message :0!
Byte 0 of received message :22!
Byte 1 of received message :33!
Id of received message :9!
Len of received message :2!
Rtr of received message :0!
Byte 0 of received message :22!
Byte 1 of received message :33!
Id of received message :d!
Len of received message :2!
Rtr of received message :0!
Byte 0 of received message :22!
Byte 1 of received message :33!