查看: 755|回复: 0

[技术交流] RF模组之RSSI篇

[复制链接]

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
发表于 2022-10-17 09:52:41 | 显示全部楼层 |阅读模式
  背景

  这份笔记描述RSSI(接收信号强度指示)的学习与使用,RSSI 值是对当前信道中信号功率电平的评估值。RSSI是CS的依据,另外在低成本无线定位中RSSI也有重要应用。

  过程

  一、术语说明和基本概念

  1、关于RSSI

  RSSI 的英文全称为Received Signal Strength Indicator,即接收信号强度指示。RSSI 值是对当前信道中信号功率电平的评估值。RSSI是无线发送层的可选部分,用来判定链接质量,以及是否增大广播发送强度。

  2 关于波特率

  Baud(波特,信号传输速度的一种单位,等于每秒内离散状态或信号事件的数量。例如,1波特在二进制 信号序列中等于每秒1比特;在八种不同状态中任选一种状态的信号序列中等于每秒1个3位值。异步传输中调制速率的单位,相当于每秒一个单位间隔。也就是说,如果单位间隔的宽度 是20毫秒,则调制速率是50波特。)

  3 关于dBm

  dBm(分贝毫瓦简写为dBm或dBmW,是一个表示绝对功率的量。其计算公式为 x = 10lg(P/1mW),用dB表达测量功率与1mW的比值。由于dBm可以方便的表示从很小的功率(如-100dBm = 0.1pW)到很大功率(如90dBm = 1MW)范围内的所有功率,因此它常被用于无线电,微波和光缆通讯中。0dBm = 1mW ,每增加3dBm表示功率翻倍,同理,每减少3dBm表示测量功率减半。 相关公式为:x = 10lg(P/1mW) = 10lg(1000P) = 10lgP + 10lg1000 = 10lgP + 30 ;功率翻倍:x’ = 10lg(2P/1mW) = 10lgP + 30 + 10lg2 = (10lgP + 30) + 3 ;功率减半:x’’ = 10lg((1/2)P/1mW) = 10lgP + 30 - 10lg2 = (10lgP + 30) - 3)【注:log是以任何数为底,lg是以10为底,ln是以e为底】

  二、概述

  SSI是CS(载波监听)的基础,如果开启了 PKTCTRL1.APPEND_STATUS ,则数据包的最后一个字节结接收完毕之后, RSSI 值便自动地被添加到有效负载之后附加的第一个字节。

  RSSI 值是对当前信道中信号功率电平的评估值。该值基于 RX 信号链中当前的增益设置和信道中测得的信号电平。在 RX 模式下,RSSI 值能连续地从 RSSI 状态寄存器中读取,直到解调器检测到一个同步字为止(同步字检测有效)。此时,RSSI 读取值被冻结,直到下一次芯片进入 RX 状态为止。另外需要请注意从无线电设备进入 RX 模式到 RSSI 寄存器中出现一个有效的 RSSI 值需要一些时间。

  本应用就是要在主机和从机的LCD上分别显示本机接收到对方发出的数据包时的RSSI值和对方接收到本机数据包时的RSSI值。

  三、RSSI测试现象

  双机通信主机和从机都在LCD的下方(大字部分)显示本机接收数据包时的RSSI值,在上方(小字部分)显示给本机发送数据的机器端的RSSI值

  既主机在下部显示主机接收数据时的RSSI值,在上部显示从机接收数据时的RSSI值;从机在下部显示从机接收数据时的RSSI值,在上部显示主机接收数据时的RSSI值

  本应用的测试效果,在\Picture文件夹里有照片。LCD上有显示信封图标和TX字样的为主机,LCD上有显示铃铛图标和RX字样的为从机。

  另外在下载程序时,本应用中主机和从机使用同一个工程,请在include.h文件中修改

  “/**************************单片机延时函数定义**************************/”

  上面的两行宏定义

  如果是主机请改为:
  #define _MASTER
  //#define _SLAVE

  如果是从机请改为:
  //#define _MASTER
  #define _SLAVE

  四、关于RSSI的应用

  1、发送机(master)端的程序

  关于文件:

  master的工程中主要包括如下文件(附带说明):

  (1)main.c文件

  本文件为该工程的主函数文件。

  (2)CC1100-CC2500.c文件

  本文件功能是CC1100/CC2500编程,包括初始化设定调用,发送数据包和接收数据包

  (3)TI_CC_spi.c文件

  本文件功能是实现MSP430单片机通过SPI总线读写CC1100/CC2500的寄存器

  (4)CC1100-CC2500.h文件

  本文件功能是为CC1100-CC2500.c声明函数

  (5)include.h文件

  本文件列出其他包含文件的高级包含文件

  (6)TI_CC_CC1000-CC2500.h文件

  本文件详细定义CC1100/2500芯片, 包括寄存器位置和使用这些寄存器的常用值

  (7)TI_CC_hardware_board_eZ430.h文件

  本文件除了端口是特定为eZ430-RF2500实验板配置的其他的定义和TI_CC_hardware_board.h类似. 使用底板的特殊宏定义; 这是MSP430和CC1100/2500之间的连接,比如GDO引脚。SPI 接口没有在这里定义因为他们已经在TI_CC_MSP430.h里定义过了。这个文件定义一般板级接口(需要改成本模块的实际引脚配置)

  (8)TI_CC_msp430.h文件

  本文件MSP430芯片的特定宏定义;主要的是SPI接口的引脚使用。包括USART0/1, USCI_A0/1/2/3,USCI_B0/1/2/3,USI和bit-banging的宏定义。另外,labels被定义用来做RF_SER_INTF系统变量使用。这用来为CCxxxx SPI 接口选择使用

  (9)TI_CC_spi.h文件

  本文件功能是为TI_CC_spi.c声明函数

  本应用中master的程序流程图如 图 1 所示。

  (10)LCD.h文件

  本文件功能是为LCD.c声明函数
  本应用中master的程序流程图如 图 1 所示。

  (11)LCD.c文件

  本文件功能是为LCD液晶的各种驱动函数
  本应用中master的程序流程图如 图 1 所示。
图 1 master的程序流程图如

  关于在主函数中调用到的一些函数:

  void TI_CC_SPISetup(void)函数
  主要用来完成MSP430F2132单片机的串口的配置,包括串口工作在4线SPI方式,串口的时钟来源等。

  TI_CC_PowerupResetCCxxxx()函数
  主要用来复位CCxxxx芯片

  writeRFSettings()函数
  主要用来写入配置寄存器RF设置,

  TI_CC_SPIWriteBurstReg()函数
  主要用来完成CCxxxx的功率配置Write PATABLE

  TI_CC_SPIStrobe()函数
  主要用来发送各种选通脉冲命令

  RFSendPacket()函数
  主要用来发送数据包,固定数据包和可变数据包都可以用这个函数发送

  前面带LCD标识的函数
  比如LCDShowMessage();这样以LCD开头的函数都是LCD显示的驱动函数

  2、接收机(slave)端的程序

  关于文件:

  slave的工程中主要包括如下文件(附带说明):

  (1)main.c文件
  本文件为该工程的主函数文件。

  (2)CC1100-CC2500.c文件
  本文件功能是CC1100/CC2500编程,包括初始化设定调用,发送数据包和接收数据包

  (3)TI_CC_spi.c文件
  本文件功能是实现MSP430单片机通过SPI总线读写CC1100/CC2500的寄存器

  (4)CC1100-CC2500.h文件

  本文件功能是为CC1100-CC2500.c声明函数

  (5)include.h文件

  本文件列出其他包含文件的高级包含文件

  (6)TI_CC_CC1000-CC2500.h文件
  本文件详细定义CC1100/2500芯片, 包括寄存器位置和使用这些寄存器的常用值

  (7)TI_CC_hardware_board_eZ430.h文件
  本文件除了端口是特定为eZ430-RF2500实验板配置的其他的定义和TI_CC_hardware_board.h类似. 使用底板的特殊宏定义; 这是MSP430和CC1100/2500之间的连接,比如GDO引脚。SPI 接口没有在这里定义因为他们已经在TI_CC_MSP430.h里定义过了。这个文件定义一般板级接口(需要改成本模块的实际引脚配置)

  (8)TI_CC_msp430.h文件
  本文件MSP430芯片的特定宏定义;主要的是SPI接口的引脚使用。包括USART0/1, USCI_A0/1/2/3,USCI_B0/1/2/3,USI和bit-banging的宏定义。另外,labels被定义用来做RF_SER_INTF系统变量使用。这用来为CCxxxx SPI 接口选择使用

  (9)TI_CC_spi.h文件
  本文件功能是为TI_CC_spi.c声明函数
  本应用中master的程序流程图如 图 1 所示。

  (10)LCD.h文件
  本文件功能是为LCD.c声明函数
  本应用中master的程序流程图如 图 1 所示。

  (11)LCD.c文件
  本文件功能是为LCD液晶的各种驱动函数
  本应用中slave的程序流程图如 图 2 所示。
图 2 slave的程序流程图如

  关于在主函数中调用到的一些函数:

  void TI_CC_SPISetup(void)函数
  主要用来完成MSP430F2132单片机的串口的配置,包括串口工作在4线SPI方式,串口的时钟来源等。

  TI_CC_PowerupResetCCxxxx()函数
  主要用来复位CCxxxx芯片

  writeRFSettings()函数
  主要用来写入配置寄存器RF设置,

  TI_CC_SPIWriteBurstReg()函数
  主要用来完成CCxxxx的功率配置Write PATABLE

  TI_CC_SPIStrobe()函数
  主要用来发送各种选通脉冲命令

  RFSendPacket()函数
  主要用来发送数据包,固定数据包和可变数据包都可以用这个函数发送

  RFCCAInit()函数
  主要功能是完成初始化CCA功能

  RFCCAEnable()函数
  主要功能是使能CCA功能

  前面带LCD标识的函数
  比如LCDShowMessage();这样以LCD开头的函数都是LCD显示的驱动函数

  3、RSSI应用过程中一些相关配置

  在 RX 模式下,RSSI 值能连续地从 RSSI 状态寄存器中读取,直到解调器检测到一个同步字为止(同步字检测有效)。此时,RSSI 读取值被冻结,直到下一次芯片进入 RX 状态为止。如果开启了 PKTCTRL1.APPEND_STATUS(如下图) ,则数据包的最后一个 RSSI 值便自动地被添加到有效负载之后附加的第一个字节。
  结论

  本应用中RSSI值的读取都是在每次接收到数据包后,在RX FIFO中在数据包后面加入两个字节,前一个字节就是RSSI的值。也可以在RX状态下,连续的读取RSSI状态寄存器来读取其值。

  关于RSSI值的换算:
  从 RSSI 状态寄存器中读取的 RSSI 值为一个 2 的补数。可使用下列步骤将RSSI 读数转换为一个绝对功率电平 (RSSI_dBm):
  1)读取 RSSI 状态寄存器
  2)将读数从一个十六进制数转换为一个十进数 (RSSI_dec)
  3)如果 RSSI_dec ≥ 128,则RSSI_dBm = (RSSI_dec - 256)/2 – RSSI_offset
  4)另外,如果RSSI_dec < 128,则RSSI_dBm = (RSSI_dec)/2–RSSI_offset) 。

  对此感兴趣想深入了解调试该文的应用代码的模组使用者可以下载如下附件参考。
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表