一、概述
本文就是记录下自己目前对于MATCH功能的理解,主要参考文档《AN625: Si446x API Descriptions》。有些地方难免理解有误,有了新的理解,再进行修改。
MATCH的中文意思是匹配。开启MATCH功能,就是根据设置的规则,对频段内的数据帧进行过滤,只接收符合匹配规则的数据。所以无论是点对点通信,还是一对多通信,都难免要使用si4463的MATCH功能。
我的应用场景为一对多设备通信,最终实现网关依次轮询每个设备节点。通过MATCH功能,使得每个设备拥有自己的ID。相比于自定义一个软件协议,MATCH功能开启后,网关发送数据时包含A节点的ID,其他设备根本不会产生接收中断。
MATCH功能通过命令0x11设置属性来进行配置,从属性表找到相关部分:
从属性表上可以看出,Match功能分为4组进行设置,每组有VALUE、MASK、CTRL三个配置项。简单理解为有四个字节用于过滤,也就是ID占用四个字节。
二、设置寄存器
2.1 VALUE
首先看下VALUE的描述:
四组的VALUE是一样的,在这里写入要过滤的值,即我需要的32位ID::ID>>24、ID>>16、ID>>8、ID。当然我的节点没有那么多,可能只需要一个VALUE做ID,也是可以的。
这里提到更详细的信息可以查看《AN626: Packet Handler Operation for Si446x RFICs》文档。也就是的4.4. Match (Header Check) Functionality一节。详细说明了MATCH功能,这里就不展开了。
发送FIFO有64字节,发送数据时,设置的4个VALUE每次要填充在这64字节中。所以ID占用的字节多了,有效数据的长度就会减少。
2.2 MASK
MASK的描述如下:
四组的MASK也是一样的。根据MASK的含义,很容易理解,这个寄存器存在的意义就是,可以只匹配VALUE值的某几位。比如只匹配高四位–1111 xxxx(b)
,那么就写入0xF0。我的目的是为节点分配唯一的ID,需要完全匹配,MASK就都写成0xFF。
2.3 CTRL
四组CLTR的定义是不一致的,分为两种:
2.3.1 CTRL_1
描述如下:
POLARITY:写为0,则VALUE与MASK匹配后,结果为1;写为1,则VALUE与MASK不匹配时,结果才为1,相当于不接收指定帧的作用。
MATCH_EN:控制着是否开启MATCH功能,只有这个bit为1,其他的设置才会有意义。
OFFSET:这个偏移量表示了VALUE在64字节中的位置。
这个寄存器默认值为00,也就是不启用MATCH功能。
2.3.2 CTRL_2/3/4
描述如下:
POLARITY和OFFSET与CTRL_1是相同的,区别在于LOGIC。
LOGIC:写为0,
MATCH功能分为四组,根据VALUE和MASK匹配结果,会依次得到result1、result2、result3、result4。最终MATCH的结果是4个结果的总和,LOGIC的存在,允许自定义是result1&&result2&&result3&&result4
,还是result1||result2||result3||result4
,或者其他的组合方式。比如我的目的是为节点分配唯一的ID,需要4组全部匹配,所以是AND关系,这一位使用默认值0。
三、设置代码
看完寄存器描述,再看下设置代码,对比理解下:
int8_t siSetMatchID(uint32_t ID) {
abApi_Write[0] = 0x11;
abApi_Write[1] = 0x30;
abApi_Write[2] = 0x0C;
abApi_Write[3] = 0x00;
abApi_Write[4] = (uint8_t)((ID >> 24) & 0x000000ff);
abApi_Write[5] = 0xFF;
abApi_Write[6] = 0x40;
abApi_Write[7] = (uint8_t)((ID >> 16) & 0x000000ff);
abApi_Write[8] = 0xFF;
abApi_Write[9] = 0x01;
abApi_Write[10] = (uint8_t)((ID >> 8) & 0x000000ff);
abApi_Write[11] = 0xFF;
abApi_Write[12] = 0x02;
abApi_Write[13] = (uint8_t)(ID & 0x000000ff);
abApi_Write[14] = 0xFF;
abApi_Write[15] = 0x03;
siSendData(abApi_Write, 16);
siWaitForCTS();
return 0;
}
含义如下:
11 命令:设置属性
30 设置属性归属的组
0C 设置属性要写入的长度
00 设置属性起始地址
剩下12个字节,依次为VALUEx、MASKx、CTRLx。从这里可以看出,设置ID1、ID2、ID3、ID4分别在64字节FIFO的第一个字节、第二个字节、第三个字节、第四个字节,要求全部匹配才会产生接收中断。
四、只用一个VALUE
前面提到,只使用一个VALUE作为ID也是可以的:
int8_t siSetMatchID(uint32_t ID) {
abApi_Write[0] = 0x11;
abApi_Write[1] = 0x30;
abApi_Write[2] = 0x0C;
abApi_Write[3] = 0x00;
abApi_Write[4] = (uint8_t)((ID >> 24) & 0x000000ff);
abApi_Write[5] = 0xFF;
abApi_Write[6] = 0x40;
abApi_Write[7] = (uint8_t)((ID >> 16) & 0x000000ff);
abApi_Write[8] = 0xFF;
abApi_Write[9] = 0x41;
abApi_Write[10] = (uint8_t)((ID >> 8) & 0x000000ff);
abApi_Write[11] = 0xFF;
abApi_Write[12] = 0x42;
abApi_Write[13] = (uint8_t)(ID & 0x000000ff);
abApi_Write[14] = 0x00;
abApi_Write[15] = 0x43;
siSendData(abApi_Write, 16);
siWaitForCTS();
return 0;
}
不难看出,这段代码同样设置ID1、ID2、ID3、ID4分别在64字节FIFO的第一个字节、第二个字节、第三个字节、第四个字节,并且要求全部匹配。但是CTRL字节的LOGIC设置为了OR,也就是只要第一个VALUE匹配成功,后三组VALUE是否匹配,都不会影响最终的MATCH结果。这样接收端读出64字节以后,从第二个字节都作为有效数据即可。
可以想象,这种情况下,后面三组的POLARITY和OFFSET以及MASK设置成什么,都已经没有影响了。
五、结论
- 默认是关闭MATCH功能的,此时会接收当前频段的所有的数据,非常适用于广播。
- CTRL的设置是很重要的。
- 取消MATCH功能后,会收到错误数据 - - 可能是其他信道干扰。
- 一个网关能配置多少个节点? – 根据MATCH功能决定,而且为了扩展,软件可以增加自定义协议。