CC2530中的源地址匹配

时间:2024-04-09 11:49:18
一.  背景知识:数据传输---直接传输和间接传输:
  • 直接传输
        协调点到普通节点、普通节点到协调点以及对等节点间的数据传输工作方式均可采用直接传输。
        CC2530中的源地址匹配

  • 间接传输:
        只用于协调器,当协调器向普通节点传输数据时才可采用间接传输的工作方式。
CC2530中的源地址匹配

二. 源地址匹配的应用场景
三个方面的应用:
1. 帧未决正确置的自确认:
当使用间接帧传输,设备发送数据请求来轮询存储在协调器中的帧。
要表示实际上是否为设备存储了一个帧,协调器必须在返回的确认帧中设置或清除帧未决位。但是在
大多数 8 位或 16  MCU 没有因此不管
(如IEEE 802.15.4  [1]所要求)。这在功耗方面是很浪费的,因为轮询设备必须保持它的
接收器使能相当长的一段时间, 即使使
使能AUTOPEND 线动设置
列中的表。
        
即,如果协调器存储了多个要转发的帧,假设这些帧的目的地址是各个终端设备,那么将这些目的地址加载到
源地址表中,只有地址匹配的终端设备地址请求,才会给予自动应答(如果使能了自动应答,并参见“确认帧”一节中的AUTOPEND)。
如果协调器中并未存储某个设备地址的帧,那么,协调器不会就此设备的轮询请求给予应答。
在通常的间接传输中(见上面第一节),首先终端设备向协调器发起数据请求命令,协调器不管有没有该设备的数据,
一般都是设置帧未决位并发送确认帧,终端设备收到此包含帧未决位的协调器的确认帧后,
会认为协调器中缓存有有本地设备的数据,然后会一直等待数据下发。所以"轮询设备必须保持它的
接收器使能相当长的一段时间, 即使使用。“,这在功耗方面是非常浪费的。
上述的设置帧未决位,即设置该位为1,表明还有后续的数据。
在FCF中,Frame Pending subfield此时不是指分片帧的后续片---这应该是ZIGBEE协议规范(应用层)所包含的功能,而非MAC层,
而这里的帧则是MAC帧。所以Frame Pending subfield指的是上述的含义。

下面的讨论主要基于此应用场景。

2. 安全材料查询:
   为了减少处理安全帧所需的时间,可以配置源地址表,这样条目匹配 CPU 的安全**表。
   表条目的第二级别的屏蔽允许这一应用与自动设置确认帧的未决位相结合。
3. 其他应用:
   之前的两个应用是源地址匹配功能的主要目标。但是,对于只依靠基本 IEEE 802.15.4 帧格式的特定协议,
   还有一些其他应用。例如,可以创建防火墙功能,即只承认一组规定规则的节点。 

三. 源地址内存表和相关配置内存表
1. 源地址表
CC2530中的源地址匹配

上述源地址表包括24个短地址(短地址+PAN ID),序号为0-23。以及重叠的12个扩展地址,序号为0-11。
这些地址条目为所要匹配的源地址。具体哪一个地址条目参与匹配还受下面匹配配置寄存器的影响。

2. 相关配置内存域(为了表述方便,此处称此内存区域为寄存器)
    2.1 源地址匹配控制寄存器:
0x6169 SRCSHORTPENDEN2 8 MSBs of the 24-bit mask that enables and disables automatic pending for each of the 24 short addresses
0x6168 SRCSHORTPENDEN1 ......
0x6167 SRCSHORTPENDEN0 ......
0x6166 SRCEXTPENDEN2 8 MSBs of the 24-bit mask that enables and disables automatic pending for each of the 12 extended addresses. Entry n is mapped toSRCEXTPENDEN[2n]. AllSRCEXTPENDEN[2n + 1] bits are don't care.
0x6165 SRCEXTPENDEN1 ......
0x6164 SRCEXTPENDEN0 ......
  • SRCSHORTPENDEN0-2
        SRCSHORTPENDEN0-2为一组,SRCEXTPENDEN0-2为一组。每一个地址8位,一组各24bits。
        RCSHORTPENDEN0-2组成的24位,每一位控制源地址表中,和位序相应的条目是否使能源地址匹配。
        这其中扩展地址占用了12位。
  • SRCEXTPENDEN0-2
    AUTOPEND功能使能位。SRCEXTPENDEN0-2组成的24位则表示,如果某一个源地址条目被匹配时,是否使能AUTOPEND。
        相应的,如果地址是扩展模式,就只使用其中的12位。
        注意SRCMATCH.AUTOPEND是总使能开关。关于AUTOPEND使能的更多细节,参见“确认帧”一节。

   2.2 源地址匹配结果寄存器:
        一旦接收帧的源地址和上述源地址条目相匹配,将由下面的匹配结果寄存器来反映匹配结果。

0x6163 SRCRESINDEX The bit index of the least-significant 1 in SRCRESMASK, or 0x3F when there is no source match. On a match, bit 5 is 0 when the match is on a short address and 1 when it is on an extended address. On a match, bit 6 is 1 when the conditions for automatic pending bit in acknowledgment have been met (see the description of SRCMATCH.AUTOPEND). The bit gives no indication of whether or not the acknowledgment actually is  transmitted, and does not take the PENDING_ORregister bit and the SACK, SACKPEND, and SNACK strobes into account.
0x6162 SRCRESMASK2 24-bit mask that indicates source address match for each individual entry in the source address table
0x6161 SRCRESMASK1 Short address matching. When there is a match on entry panid_n + short_n, bit n is set in SRCRESMASK.
0x6160 SRCRESMASK0 Extended address matching. When there is a match on entry ext_n, bits 2n and 2n + 1 are set in SRCRESMASK.

上面的寄存器分为两组,即SRCRESMASK0-2和SRCRESINDEX。
  • SRCRESMASK0-2
        SRCRESMASK0-2组成的24位,如果某一源地址条目被匹配,那么相应条目序号对应的bit就会被置位。
        如,如果第24个源地址条目被匹配,那么SRCRESMASK2的MSB就会被置位。
        如果接收帧中不包含源地址,或没有匹配,那么SRCRESMASK位6:0就为0x3F。
  • SRCRESINDEX
         SRCRESINDEX 为4:0存放的是该匹配条目的序号值,如第24个(序号为23)源地址条目被匹配,那么它的值就为23。
         当为扩展地址匹配时,SRCRESINDEX的第5位会被设置为1,而短地址匹配时,改位为0,以此来表明两者的区别。
         另外还有一点,如果发生任一地址匹配,且SRCEXTPENDEN中相应位的被使能,SRCRESINDEX的第6位会被置1。
         即SRCEXTPENDEN第6为AUTOPEND功能的结果。

四. 匹配算法
仅当帧过滤使能且收到的帧己被接受(accepted,见帧过滤一节)时才执行源地址匹配。

匹配算法C语言描述如下:
短地址匹配算法:
SRCRESMASK = 0x000000;
SRCRESINDEX = 0x3F;
for (n = 0; n < 24; n++) {
    bitVector = 0x000001 << n;
    if (SRCSHORTEN & bitVector) {
        if ((panid[n] == srcPanid) &&
        (short[n] == srcShort)) {
                SRCRESMASK |= bitVector;
            if (SRCRESINDEX == 0x3F) {
                SRCRESINDEX = n;
            }
        }
    } 
}

扩展地址匹配算法:
SRCRESMASK = 0x000000;
SRCRESINDEX = 0x3F;
for (n = 0; n < 12; n++) {
    bitVector = 0x000003 << (2 * n);
    if (SRCEXTEN & bitVector) {
        if (ext[n] == srcExt) {
                SRCRESMASK |= bitVector;
            if (SRCRESINDEX == 0x3F) {
                SRCRESINDEX = n | 0x20;
            }
        }
    } 
}