14_rssi RSSI测量例程¶
一、简介¶
本例程演示 PAN211 芯片的RSSI(Received Signal Strength Indication,接收信号强度指示)测量功能,用于测量接收信号的强度。
二、条件说明¶
频点:2412MHz
芯片工作模式:PAN211_CHIPMODE_XN297
CRC:2字节
数据速率:1Mbps
SPI类型:3线SPI
接收地址:{0xcc,0xcc,0xcc,0xcc,0xcc}
数据长度:32字节
工作模式:普通型
三、接口(移植)实现¶
根据硬件实现以下配置:
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引脚为输入模式 */
根据实际使用的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值:
int GetRSSI(void)
{
int RSSIdBm;
unsigned char Index;
unsigned short RSSICode;
unsigned char RSSIRegs[2];
float th1,th2,th3;
static int LastRSSI = 0;
th1 = PAN211_ReadReg(0x55) - 249.5f;
th2 = PAN211_ReadReg(0x56) - 249.5f;
th3 = PAN211_ReadReg(0x57) - 249.5f;
PAN211_ReadRegs(0x7A, RSSIRegs, 2);
RSSICode = ((RSSIRegs[0] + ((unsigned short)RSSIRegs[1] << 8)) & 0x3FFF);
RSSIdBm = (int)((RSSICode - 16384) >> 2);
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(); /* 进入接收模式 */
while (1)
{
while (!IRQDetected()); /* 等待SPI_DATA/IIC_SDA引脚变低,指示发送完成 */
IRQFlag = PAN211_GetIRQFlags(); /* 获取中断标志 */
if (IRQFlag & RF_IT_RX_IRQ) /* 接收中断 */
{
PAN211_ReadFIFO(RxBuf, sizeof(RxBuf)); /* 读取FIFO数据到RxBuf缓冲区 */
int rssi = GetRSSI(); /* 获取RSSI值 */
PAN211_ClearIRQFlags(RF_IT_RX_IRQ); /* 清除接收中断标志 */
printf("Rx Count:%d, RSSI:%d\r\n", ++RxCount, rssi); /* 打印接收计数和RSSI值 */
PrintHex(RxBuf, sizeof(RxBuf)); /* 以十六进制方式打印接收数据 */
BSP_Led3Toggle(); /* 切换LED3状态 */
}
else if (IRQFlag == RF_IT_CRC_ERR_IRQ) /* CRC错误中断 */
{
PAN211_ClearIRQFlags(IRQFlag); /* 清除CRC错误中断标志 */
printf(">> RF_IT_CRC_ERR_IRQ[0x%02x]\r\n", IRQFlag);
}
}
}