zigbee RSSI链路质量 From zigbee菜鸟笔记(十)

一.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工作流程点击进入

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值