19_realtime_rssi 实时RSSI测量例程

一、简介

本例程演示 PAN211 芯片的实时RSSI(Received Signal Strength Indication,接收信号强度指示)测量功能,用于测量接收信号的强度。RSSI功能必须要在开启AGC(自动增益控制)功能后才能使用。RSSI值的范围大约在-100dBm到-30dBm之间,具体值与接收信号的实际强度有关。RSSI值越大,表示接收信号越强。

二、条件说明

频点:2412MHz
芯片工作模式:PAN211_CHIPMODE_XN297
CRC:2字节
数据速率:1Mbps
SPI类型:3线SPI
接收地址:{0xcc,0xcc,0xcc,0xcc,0xcc}
数据长度:32字节
工作模式:普通型

三、接口(移植)实现

  1. 根据硬件实现以下配置:

  • SPI_CS引脚配置为推挽输出

  • SPI_SCK引脚配置为推挽输出

  • SPI_DATA引脚配置为推挽输出或输入模式,低功耗模式下需配置为输入模式并启用上拉电阻

#define SPI_CS_HIGH      CS_PIN = 1      /* 将SPI_CS引脚设置为高电平 */
#define SPI_CS_LOW       CS_PIN = 0      /* 将SPI_CS引脚设置为低电平 */
#define SPI_SCK_HIGH     SCK_PIN = 1     /* 将SPI_SCK引脚设置为高电平 */
#define SPI_SCK_LOW      SCK_PIN = 0     /* 将SPI_SCK引脚设置为低电平 */
#define SPI_DATA_HIGH    DATA_PIN = 1    /* 将SPI_DATA引脚设置为高电平 */
#define SPI_DATA_LOW     DATA_PIN = 0    /* 将SPI_DATA引脚设置为低电平 */
#define SPI_DATA_STATUS  DATA_PIN        /* 读取SPI_DATA引脚状态 */
#define SPI_DATA_OUTPUT  GPIO_SetModeByPin(P4_3, GPIO_MODE_OUTPUT)  /* 配置SPI_DATA引脚为输出模式 */
#define SPI_DATA_INPUT   GPIO_SetModeByPin(P4_3, GPIO_MODE_INPUT)   /* 配置SPI_DATA引脚为输入模式 */
  1. 根据实际使用的MCU修改SPI接口初始化代码:

/**
 * @brief 初始化PAN211 3线SPI接口
 * @param 无
 * @return 无
 * @note 该函数配置SPI_SCK、SPI_CS和SPI_DATA引脚为GPIO模式,并设置为输出模式
 * @note PAN211没有独立中断引脚,可开启SPI_DATA引脚中断复用功能
 * @note PAN216具有独立中断引脚,可通过P4_5来检测PAN216的中断事件
 */
void BSP_3LineSPIInit(void)
{
    CLK_AHBPeriphClockCmd(CLK_AHBPeriph_GPIO, ENABLE);

    // 将引脚配置为GPIO模式,以软件SPI实现
    SYS_ConfigMFP(P4_0, SYS_MFP_GPIO); // SPI_SCK
    SYS_ConfigMFP(P4_1, SYS_MFP_GPIO); // SPI_CS
    SYS_ConfigMFP(P4_3, SYS_MFP_GPIO); // SPI_DATA
    SYS_ConfigMFP(P4_5, SYS_MFP_GPIO); // IRQ引脚,PAN211未使用

    GPIO_SetModeByPin(P4_1, GPIO_MODE_OUTPUT); // 配置SPI_CS为输出模式
    GPIO_SetModeByPin(P4_0, GPIO_MODE_OUTPUT); // 配置SPI_SCK为输出模式
    GPIO_SetModeByPin(P4_3, GPIO_MODE_OUTPUT); // 配置SPI_DATA为输出模式,后续根据时序需要设置为输入模式
    GPIO_SetModeByPin(P4_5, GPIO_MODE_INPUT);  // PAN211没有中断引脚,PAN216有中断引脚,配置为输入模式

    P41 = 1; // SPI_CS置高,表示未选中
    P40 = 0; // SPI_SCK置低,SPI时钟极性为低电平有效
    P43 = 0; // SPI_DATA置低

    GPIO_EnablePullupPath(P4, BIT3); // 将SPI_DATA引脚设置为输入模式,并启用上拉电阻
}

四、应用范例

配置为接收模式,测量实时RSSI值:


/**
 * @brief Get Real Time RSSI in dBm.
 *
 * @param None
 *
 * @return RSSI in dBm
 */
int PAN211_GetRealTimeRSSI(float th1, float th2, float th3)
{
    uint8_t RssiCode[2];
    uint8_t tmp = PAN211_ReadReg(0x46);
    tmp = tmp & 0x7F;
    static int LastRSSI = -200;
    int Index = 0;

    /* Lock up */
    PAN211_WriteReg(0x46, tmp | BIT7);
    PAN211_WriteReg(0x46, tmp | BIT7 | BIT6);
    PAN211_ReadRegs(0x7E, RssiCode, 2);
    int RSSIdBm = (int)(((RssiCode[0] + ((uint16_t)RssiCode[1] << 8)) & 0x3FFF) - 16384) / 4;
    PAN211_WriteReg(0x46, tmp);
    Index = ((PAN211_ReadReg(0x79) & (BIT4 | BIT5)) >> 4);
    if ((RSSIdBm >= th3 && Index == 3)\
        || (RSSIdBm >= th2 && Index == 2)\
         || (RSSIdBm >= th1 && Index == 1))
    {
        return LastRSSI;
    }
    LastRSSI = RSSIdBm;

    return RSSIdBm;
}
int main(void)
{
    /* MCU 初始化 */

    if (PAN211_Init() != 1) /* 初始化&校准 PAN211 芯片 */
    {
        printf("PAN211 init failed.\r\n");
        while (1);
    }

    PAN211_ClearIRQFlags(0xFF); /* 清除所有PAN211中断标志 */
    PAN211_RxStart();           /* 进入接收模式 */

    PAN211_ClearIRQFlags(0xFF); /* 清除所有PAN211中断标志 */
    PAN211_RxStart();           /* 进入接收模式 */

    printf("Getting Real Time RSSI...\r\n");
    while(1)
    {
        MaxRSSI = -200; // 重置最大RSSI值
        for(int i = 0; i < 500; i++)
        {
            int Rssi = PAN211_GetRealTimeRSSI(th1, th2, th3);
            if (Rssi > MaxRSSI)
            {
                MaxRSSI = Rssi;
            }
        }
        UpdateRSSIHistory();
    }
}

五、例程演示

使用步骤:

  1. 找到两块PAN211x开发板,作为测试设备。

  2. 用Type-C数据线供电。

  3. 用跳线帽连接电源跳线P9。

  4. 将电源切换开关S1切换至“USB”端。

  5. 将本例程烧录到开发板,然后将12_carrier_mode例程烧录到另一块开发板。

    • 注意:两块开发板的频点必须一致。

  6. 打开串口调试助手,设置波特率为115200,数据位8位,无校验位,停止位1位,选择开发板的串口,点击连接。

  7. 观察串口调试助手,开发板会定时打印实时RSSI变化图,可以看到不同RSSI值对应的信号强度变化。当另一块开发板发送载波时,明显观察到实时RSSI值变大。

RSSI Dynamic Chart (dBm) - Current: -15 dBm
 -14 |                        *                         
 -19 |                        |*************************
 -23 |                        ||||||||||||||||||||||||||
 -28 |                        ||||||||||||||||||||||||||
 -32 |                        ||||||||||||||||||||||||||
 -36 |                        ||||||||||||||||||||||||||
 -41 |                        ||||||||||||||||||||||||||
 -45 |             *          ||||||||||||||||||||||||||
 -49 |          *  |     *    ||||||||||||||||||||||||||
 -54 |*  *  *   |  |     |*  *||||||||||||||||||||||||||
 -58 ||  |  |   |  |     || *|||||||||||||||||||||||||||
 -62 ||  |  | **|* | *   || ||||||||||||||||||||||||||||
 -67 ||  |  | |||| | |   ||*||||||||||||||||||||||||||||
 -71 ||  |  | ||||*| |***|||||||||||||||||||||||||||||||
 -75 ||**|**|*||||||*|||||||||||||||||||||||||||||||||||
     +--------------------------------------------------
      Old                                               New

Statistics:
Current: -15 dBm | Max: -14 dBm | Min: -75 dBm | Range: 61 dB
Signal Quality: Excellent (>= -30 dBm)