2.4G-RF_Basic接收广播包数据

前言:

基于RF例程接收广播包数据,优点:节省FLASH资源,不需要额外的主机协议栈。

广播包内容:

代码:

/* 头文件包含 */
#include "rf_basic.h"
#include "log.h"

#define  ALIGNED4(x)       ((x+3)/4*4)

rfipTx_t gTxParam;
rfipRx_t gRxParam;

__attribute__((__aligned__(4))) uint8_t TxBuf[64];
__attribute__((__aligned__(4))) uint8_t RxBuf[264]; // 接收DMA buf不能小于264字节

#define  MODE_RX     0
#define  MODE_TX     1

#define  WAIT_ACK         1               // 是否使能ACK
#define  TEST_DATA_LEN    37               // 数据长度
#define  TEST_FREQUENCY   37//16              // 通信频点

//#define  TEST_MODE     MODE_TX            // 发送模式
#define  TEST_MODE     MODE_RX            // 接收模式

#define  RF_DEVICE_PERIDOC    1000

uint32_t volatile gTxCount;
uint32_t volatile gRxCount;
volatile int Rssi_sum=0;

__HIGH_CODE
void rf_tx_set_frequency( uint32_t f )
{
    gTxParam.frequency = f;
}

__HIGH_CODE
void rf_tx_set_sync_word( uint32_t sync_word )
{
    gTxParam.accessAddress = sync_word;
}

__HIGH_CODE
void rf_tx_start( uint8_t *pBuf )
{
    //    RFRole_Stop();
    // 配置发送的频点
    gTxParam.frequency = TEST_FREQUENCY;
    // 发送的DMA地址
    gTxParam.txDMA = (uint32_t)pBuf;
    gTxParam.waitTime = 40*2; // 如果需要切换通道发送,稳定时间不低于80us
    RFIP_StartTx( &gTxParam );
}

__HIGH_CODE
void rf_rx_set_sync_word( uint32_t sync_word )
{
    gRxParam.accessAddress = sync_word;
}

__HIGH_CODE
void rf_rx_set_frequency( uint32_t f )
{
    gRxParam.frequency = f;
}

__HIGH_CODE
void rf_rx_start( void )
{
    // 配置发送的频点
    gRxParam.frequency = TEST_FREQUENCY;
    // 配置接收的超时时间,0则无超时
    gRxParam.timeOut = 0;
    RFIP_SetRx( &gRxParam );
}

__HIGH_CODE
void rf_rx_process_data( void )
{
    gRxCount ++;
    {
        uint8_t *pData = (uint8_t *)gRxParam.rxDMA;
        uint8_t datalen = pData[1];
        {
            for( int i=0;i<(datalen+2);i++ )
            {
                dbg_printf("%x ",pData[i]);//这里的打印,是用的打印函数,放在了RAM中,确保打印占用更小的时间
            }
            dbg_printf("\n"); 
        }

    }
}

__INTERRUPT
__HIGH_CODE
void LLE_IRQHandler( void )
{
    LLE_LibIRQHandler( );
}

__INTERRUPT
__HIGH_CODE
void BB_IRQHandler( void )
{
    BB_LibIRQHandler( );
}

__HIGH_CODE
void RF_ProcessCallBack( rfRole_States_t sta,uint8_t id  )
{
    if( sta&RF_STATE_RX )
    { 
        rf_rx_process_data();
#if( TEST_MODE == MODE_RX )
#if( WAIT_ACK )
        TxBuf[0] = 0x0d;
        TxBuf[1] = 0;
        rf_tx_start( TxBuf );
#else
        rf_rx_start( );
#endif
#endif
    }
    if( sta&RF_STATE_RX_CRCERR )
    {
#if( TEST_MODE == MODE_RX )
        rf_rx_start( );
#endif
    }
    if( sta&RF_STATE_TX_FINISH )
    {
#if( WAIT_ACK )
        rf_rx_start( );
#endif
        gTxCount ++;
    }
    if( sta&RF_STATE_TIMEOUT )
    {
        // PRINT("error.\n");   // rx地址匹配但接收超时,如果是发送则是发送失败
#if( TEST_MODE ==  MODE_RX )
        rf_rx_start( );
#endif
    }
}

__INTERRUPT
__HIGH_CODE
void TMR_IRQHandler(void) // TMR 定时中断
{
    if(TMR_GetITFlag(TMR_IT_CYC_END))
    {
        TMR_ClearITFlag(TMR_IT_CYC_END); // 清除中断标志
        PRINT("rx %d, rssi %d\n",gRxCount, (Rssi_sum/(int)gRxCount));
        gRxCount = 0;
        Rssi_sum = 0;
    }
}

void RFRole_Init(void)
{
    sys_safe_access_enable( );
    R32_MISC_CTRL = (R32_MISC_CTRL&(~(0x3f<<24)))|(0xe<<24);
    sys_safe_access_disable( );

#if(PHY_2G4_MODE == 1 )
    PKT_DET_CFG4(0x78);
#endif

    {
        rfRoleConfig_t conf ={0};
        conf.rfProcessCB = RF_ProcessCallBack;
        conf.processMask = RF_STATE_RX|RF_STATE_RX_CRCERR|RF_STATE_TX_FINISH|RF_STATE_TIMEOUT;
        RFRole_BasicInit( &conf );
    }
    TPROPERTIES_CFG Properties;
    {
        // Properties.cfgVal = BB_WHITENING_OFF|TEST_PHY_MODE;
        Properties.cfgVal = TEST_PHY_MODE;
#if(TEST_PHY_MODE == PHY_MODE_2G4 )
        Properties.lengthCrc = CRC_LEN;
        Properties.ctlFiled = CTL_FILED;
        Properties.lengthAA = AA_LEN;
        Properties.lengthPreamble = PRE_LEN;
        Properties.dplEnable = DPL_EN;
        Properties.mode2G4 = MODE_2G4;
        Properties.bitOrderData = DATA_ORDER;
        Properties.crcXOREnable = CRC_XOR_EN;
#endif
        PRINT("cfgVal=%x\n",Properties.cfgVal);
    }

    // TX相关参数,全局变量
    {
        gTxParam.accessAddress = AA;
        gTxParam.accessAddressEx = AA_EX;
        gTxParam.crcInit = CRC_INIT;
        gTxParam.crcPoly = CRC_POLY;
        gTxParam.properties = Properties.cfgVal;
        gTxParam.waitTime = 80*2;
        gTxParam.txPowerVal = LL_TX_POWEER_0_DBM;
        gTxParam.txLen = TEST_DATA_LEN;
    }

    // RX相关参数,全局变量
    {
        gRxParam.accessAddress = 0X8e89bed6;//AA;
        gRxParam.accessAddressEx = AA_EX;
        gRxParam.crcInit = CRC_INIT;
        gRxParam.crcPoly = CRC_POLY;
        gRxParam.properties = Properties.cfgVal;
        gRxParam.rxDMA = (uint32_t)RxBuf;
        gRxParam.rxMaxLen = TEST_DATA_LEN;
    }
    PFIC_EnableIRQ( BLEB_IRQn );
    PFIC_EnableIRQ( BLEL_IRQn );

#if( TEST_MODE == MODE_RX )
    PRINT("----------------- rx -----------------\n");
    gTxCount = 0;
    gRxCount = 0;
    PRINT("start rx...%d\n",GetSysClock());
    rf_rx_start();
    TMR_TimerInit( GetSysClock() / 2 ); // 500ms统计一次
    TMR_ITCfg(ENABLE, TMR_IT_CYC_END);  // 开启中断
    PFIC_EnableIRQ(TMR_IRQn);
#else
    PRINT("----------------- tx -----------------\n");
    gTxCount = 0;
    gRxCount = 0;
    PRINT("start tx timer...\n");
    TMR_TimerInit( GetSysClock() / RF_DEVICE_PERIDOC );

    TMR_ITCfg(ENABLE, TMR_IT_CYC_END); // 开启中断
    PFIC_EnableIRQ(TMR_IRQn);
#endif
}

/******************************** endfile @rf ******************************/

注意点:

  1. 修改接入地址;
  2. 修改白化功能打开;
  3. 接收的打印信息,需要放在RAM中运行,否则打印占用时间,可能观察到的日志不对。

接收数据的打印:

 

posted @ 2025-07-01 14:20  SweetTea_lllpc  阅读(141)  评论(0)    收藏  举报