一.RSSI的概念
有问题发送邮件至468078841@qq.com
RSSI :Received Signal Strength Indication 接收信号强度指示,用来判定链质量,以及是否 增大无线信号发送强度。
RSSI是指接受端芯片内部测量电路所得到的输入信号的平均强度指示。这一测量一般不包括天线增益或者传输系统的损耗。RSSI的实现是在反向通道基带接收滤波器之后进行的。
RSSI:Received Signal Strength Indicator不等同于Rx: Received power
二.cc2530的RSSI
为了获取反向信号的特征,在RSSI中进行如下处理,在104μs进行几代IQ功率积分得到RSSI的瞬时值,在1S内对这8192个瞬时值进行平均值计算,1S内计算方式
RSSI = sum(RSSI)/8192
cc2530芯片有专门读取RSSI的寄存器,当接收到数据包之后,CC2530讲该数据写入寄存器。
RSSI值与接受信号功率的换算关系为
P = RSSI_value + RSSI_OFFSET[dBm]
RSSI_OFFSET是经验值一般为-45
三.cc2530获取RSSI值
(一)获取函数
1.函数声明
uint8 basicRfReceive(uint8 *pRxData, uint16 len, int16 *pRssi)
解释 函数接收len字节数据进入pRxData同时将信号RSSI存入pRssi
uint8 basicRfReceive(uint8 *pRxData, uint16 len, int16 *pRssi)
{
// Accessing shared variables -> this is a critical region
// Critical region start
halIntOff();
memcpy(pRxData, rxi.pPayload, MIN(rxi.length, len));
if (pRssi != NULL)
{
if (rxi.rssi < 128)
{
*pRssi = rxi.rssi - halRfGetRssiOffset();
}
else
{
*pRssi = (rxi.rssi - 256) - halRfGetRssiOffset();
}
}
rxi.isReady = FALSE;
halIntOn();
// Critical region end
return MIN(rxi.length, len);
}
不同版本的函数不一样 但是只要认准RSSI即可。
(二)函数写入
在前一张基础上 将接受数据打印到串口并且显示RSSI的值
#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include "TIMER.h"
#include "hal_uart.h"
#define MAX_SEND_BUF_LEN 128
#define MAX_RECV_BUF_LEN 128
unsigned char len = 0; //串口数据接收长度
#define MAX_UART_SEND_BUF_LEN 128
#define MAX_UART_RECV_BUF_LEN 128
uint8 uTxData[MAX_UART_SEND_BUF_LEN];
uint8 uRxData[MAX_UART_RECV_BUF_LEN];
//uRxData[0]={'1'};
uint16 uTxlen = 0;
uint16 uRxlen = 0;
#define RF_CHANNEL 24
#define PAN_ID 0x11
#define MY_ADDR 0x1015
#define SEND_ADDR 0xAC3A
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
void ConfigRf_Init(void)
{
basicRfConfig.panId = PAN_ID; //zigbee的ID号设置
basicRfConfig.channel = RF_CHANNEL; //zigbee的频道设置
basicRfConfig.myAddr = MY_ADDR; //设置本机地址
basicRfConfig.ackRequest = TRUE; //应答信号
while(basicRfInit(&basicRfConfig) == FAILED); //检测zigbee的参数是否配置成功
basicRfReceiveOn(); // 打开RF
}
void Recv_UR_Data()
{
len = halUartRxLen();
if(len != 0)
{
len = 0;
halUartRead(uTxData, len);
basicRfSendPacket(SEND_ADDR, uTxData, len);
}
}
void Recv_RF_Data()
{
int16 *Rssi = NULL;
char *buf = '\0';
if(TRUE == basicRfPacketIsReady()) //接收到新的无线数据
{
basicRfReceive(uRxData, 32, Rssi);
halUartWrite(uRxData,sizeof(uRxData)/sizeof(uRxData[0]));
sprintf(buf,"Accept the value of RSSI as:%s",buf);
halUartWrite(buf,strlen(buf));
}
}
void main(void)
{
halUartInit(38400); //串口初始化下面要用
halBoardInit(); //模块相关资源的初始化
ConfigRf_Init(); //无线收发参数的配置初始化
HAL_LED_SET_1(); //点亮LED1这里是属于直接调用如果设备不符合可以改引脚
HAL_LED_SET_2();
while(1)
{
Recv_UR_Data(); //串口数据接收处理
Recv_RF_Data(); //无线数据接收处理
}
}
有问题请发邮件至468078841@qq.com
zigbee菜鸟笔记(十 一)ZStack工作流程点击进入