下面的程序分析是基于CC2431的定位程序,使用的是CC2431中的相关定位寄存器,CC2430不能使用下面定位寄存器。
整个定位引擎的函数均放在LocationEngine.c/h文件里。现在我们看一下具体的定位程序。
//定位引擎使能宏定义
#define LOC_ENABLE() do { LOCENG |= 0x10; } while(0)
#define LOC_DISABLE() do { LOCENG &= ~0x10; } while(0)
// LOC_PARAMETER_LOAD宏定义
#define LOC_PARAMETER_LOAD( on )
do {
if(on) LOCENG |= 0x04;
else LOCENG &= ~0x04;
} while(0)
// LOC_REFERENCE_LOAD宏定义
#define LOC_REFERENCE_LOAD( on )
do {
if(on) LOCENG |= 0x02;
else LOCENG &= ~0x02;
} while(0)
//启动定位引擎
#define LOC_RUN() do { LOCENG |= 0x01; } while(0)
//执行定位
#define LOC_DONE() (LOCENG & 0x08)
//节点位置计算函数
void locationCalculatePosition( LocRefNode_t *ref, LocDevCfg_t *node )
{
LocRefNode_t *pRef = ref;
// Rev-B Chip have LocEng Ver 1.0 w/ cap=8, Rev-C have LocEng Ver 2.0 w/ 16.
const byte stop = ( ( CHVER == 0x01 ) ? LOC_ENGINE_NODE_CAPACITY_REVB :
LOC_ENGINE_NODE_CAPACITY_REVC);
byte idx;
//定位引擎使能
LOC_DISABLE();
LOC_ENABLE();
// LOC_REFERENCE_LOAD使能,准备写入参考坐标
LOC_REFERENCE_LOAD( TRUE );
for ( idx = 0; idx < stop; idx++ )
{
//参考坐标输入
REFCOORD = pRef->x;
REFCOORD = pRef->y;
pRef++;
}
LOC_REFERENCE_LOAD( FALSE ); //参考坐标写入完成
//使能LOC_PARAMETER_LOAD,准备写入测量参数
LOC_PARAMETER_LOAD( TRUE );
MEASPARM = node->param_a;
MEASPARM = node->param_n;
// CC2431 rev. C->
if ( CHVER != 0x01 )
{
MEASPARM = LOC_ENGINE_X_MIN;
MEASPARM = LOC_ENGINE_X_MAX;
MEASPARM = LOC_ENGINE_Y_MIN;
MEASPARM = LOC_ENGINE_Y_MAX;
}
// Load the measured RSSI values shifted for not used fractional bit.
for ( idx = 0; idx < stop; idx++ )
{
MEASPARM = ref->rssi * 2;
ref++;
}
LOC_PARAMETER_LOAD( FALSE ); //测量参数写入完成
LOC_RUN(); //启动定位估计计算
while( !(LOCENG & 0x08) );
if ( CHVER == 0x01 )
{
// Convert output format (LSB = .5m) to input format (2 LSB's = .25m).
node->x = (LOCX << 1);
node->y = (LOCY << 1);
node->min = LOCMIN;
}
else
{
node->x = LOCX + 2;
node->y = LOCY;
node->min = 0;
}
LOC_DISABLE(); //关闭定位引擎
}
整个程序解释的比较清楚了,相信大家也知道定位的相对过程了,现在可以继续我们的ZigBee定位了。