使用RF BASIC模拟广播和RF PHY是差不多的,
1.修改接入地址:#define AA 0X8e89bed6;
2.修改通信信道为37 38 39当中一个:#define TEST_FREQUENCY 37 // 通信频点
3.根据需要使能和关闭ACK:#define WAIT_ACK 0 // 是否使能ACK
4.修改数据长度:#define TEST_DATA_LEN 11 // 数据长度
5.将模式修改为发送模式:#define  TEST_MODE     MODE_TX            // 发送模式
6.修改数据长度:
 // 初始化发送的数据
        //广播类型
        TxBuf[0] = 0x02;     
        //数据长度(MAC地址长度+数据长度)
        TxBuf[1] =0x09;              
        //mac地址
        TxBuf[2] = 0x84;
        TxBuf[3] = 0xc2;
        TxBuf[4] = 0xe4;
        TxBuf[5] = 0x03;
        TxBuf[6] = 0x02;
        TxBuf[7] = 0x22;
        //广播数据
        TxBuf[8] = 0x02;
         TxBuf[9] = 0x09;
         TxBuf[10] = 0x55;
        rf_tx_start( TxBuf );
7.开启白话:
gTxParam.properties = 0;
下面是完整的.c和.h文件可以直接复制粘贴测试:
rf_basic.c
/********************************** (C) COPYRIGHT ******************************* * File Name : rf_basic.c * Author : WCH * Version : V1.0 * Date : 2024/08/15 * Description : 2.4G库基本模式收发测试例程 * * 功率设置 * RFIP_SetTxPower * 1. 支持-20dBm ~ 4dBm 动态调整 * * 发送状态切换稳定时间 * RFIP_SetTxDelayTime * 1.如果需要切换通道发送,稳定时间不低于80us * * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * SPDX-License-Identifier: Apache-2.0 *******************************************************************************/ /******************************************************************************/ /* 头文件包含 */ #include "rf_basic.h" /********************************************************************* * GLOBAL TYPEDEFS */ #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 0 // 是否使能ACK #define TEST_DATA_LEN 11 // 数据长度 #define TEST_FREQUENCY 37 // 通信频点 #define TEST_MODE MODE_TX // 发送模式 //#define TEST_MODE MODE_RX // 接收模式 #define RF_DEVICE_PERIDOC 40 uint32_t volatile gTxCount; uint32_t volatile gRxCount; volatile int Rssi_sum=0; /******************************** 发送相关函数 ********************************/ /** * @brief 配置发送的频点 * * @param f - 需要配置的频点 * * @return None. */ __HIGH_CODE void rf_tx_set_frequency( uint32_t f ) { gTxParam.frequency = f; } /******************************************************************************* * @brief 配置发送的地址 * * @param sync_word - 需要配置的接入地址 * * @return None. */ __HIGH_CODE void rf_tx_set_sync_word( uint32_t sync_word ) { gTxParam.accessAddress = sync_word; } /******************************************************************************* * @brief rf发送数据子程序 * * @param pBuf - 发送的DMA地址 * * @return None. */ __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 ); } /******************************** 接收相关函数 ********************************/ /** * @brief 配置接收的地址 * * @param sync_word - 需要配置的接入地址 * * @return None. */ __HIGH_CODE void rf_rx_set_sync_word( uint32_t sync_word ) { gRxParam.accessAddress = sync_word; } /******************************************************************************* * @fn rf_rx_set_frequency * * @param f - 需要配置的频点 * * @return None. */ __HIGH_CODE void rf_rx_set_frequency( uint32_t f ) { gRxParam.frequency = f; } /******************************************************************************* * @fn rf_rx_start * * @brief rf接收数据子程序 * * @return None. */ __HIGH_CODE void rf_rx_start( void ) { // 配置发送的频点 gRxParam.frequency = TEST_FREQUENCY; // 配置接收的超时时间,0则无超时 gRxParam.timeOut = 0; RFIP_SetRx( &gRxParam ); } /******************************************************************************* * @fn rf_rx_process_data * * @brief rf接收数据处理 * * @return None. */ __HIGH_CODE void rf_rx_process_data( void ) { gRxCount ++; { uint8_t *pData = (uint8_t *)gRxParam.rxDMA; Rssi_sum += (int8_t)pData[TEST_DATA_LEN+2]; // PRINT("#R %d\n",(int8_t)pData[6]); // for( int i=0;i<4;i++ ) // { // PRINT("%x\t",pData[i]); // } // PRINT("\n"); } } /******************************************************************************* * @fn LLE_IRQHandler * * @brief LLE_IRQHandler * * @return None. */ __INTERRUPT __HIGH_CODE void LLE_IRQHandler( void ) { LLE_LibIRQHandler( ); } /******************************************************************************* * @fn BB_IRQHandler * * @brief BB_IRQHandler * * @return None. */ __INTERRUPT __HIGH_CODE void BB_IRQHandler( void ) { BB_LibIRQHandler( ); } /******************************************************************************* * @fn RF_ProcessCallBack * * @brief rf中断处理程序 * * @param sta - 中断状态. * id - 保留 * * @return None. */ __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 } } /********************************************************************* * @fn TMR0_IRQHandler * * @brief TMR0中断函数 * * @return none */ __INTERRUPT __HIGH_CODE void TMR_IRQHandler(void) // TMR 定时中断 { if(TMR_GetITFlag(TMR_IT_CYC_END)) { TMR_ClearITFlag(TMR_IT_CYC_END); // 清除中断标志 #if( TEST_MODE == MODE_RX ) PRINT("rx %d, rssi %d\n",gRxCount, (Rssi_sum/(int)gRxCount)); gRxCount = 0; Rssi_sum = 0; #else // 初始化发送的数据 //广播类型 TxBuf[0] = 0x02; //数据长度(MAC地址长度+数据长度) TxBuf[1] =0x09; //mac地址 TxBuf[2] = 0x84; TxBuf[3] = 0xc2; TxBuf[4] = 0xe4; TxBuf[5] = 0x03; TxBuf[6] = 0x02; TxBuf[7] = 0x22; //广播数据 TxBuf[8] = 0x02; TxBuf[9] = 0x09; TxBuf[10] = 0x55; rf_tx_start( TxBuf ); #endif } } /******************************************************************************* * @fn RFRole_Init * * @brief RF应用层初始化 * * @param None. * * @return None. */ 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; #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 = 0; gTxParam.waitTime = 80*2; gTxParam.txPowerVal = LL_TX_POWEER_0_DBM; gTxParam.whiteChannel=0x37; gTxParam.txLen = TEST_DATA_LEN; } // RX相关参数,全局变量 { gRxParam.accessAddress = 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 ******************************/
rf_basic.h
/********************************** (C) COPYRIGHT ******************************* * File Name : rf_test.h * Author : WCH * Version : V1.0 * Date : 2022/03/10 * Description : *******************************************************************************/ #ifndef __RF_TEST_H #define __RF_TEST_H #ifdef __cplusplus extern "C" { #endif #include <CH572rf.h> #include "CH57x_common.h" #define TEST_PHY_MODE PHY_MODE_PHY_1M #if(TEST_PHY_MODE == PHY_MODE_2G4 ) #if(PHY_2G4_MODE == 0 ) #define AA 0x94826E8E // 接入地址(3-4字节) #define AA_EX 0 // 接入地址ex,在AA前 #define AA_LEN 1 // 0: 3字节; 1: 4字节; 2: 5字节 #define PRE_LEN 1 // 前导码长度, 1: 1字节; 3: 3字节 #define CRC_INIT 0xFFFF // CRC初始值 #define CRC_POLY 0x8810 // CRC多项式 #define CRC_LEN 2 // CRC长度, 0: 0字节; 1: 1字节; 2: 2字节 #define CTL_FILED 0 // 增强模式控制字长度,0:0bit,1:9bit,2:10bit #define DPL_EN 0 // 增强模式 0:关闭 ; 1:增强;增强模式最大发送长度为63字节 #define DATA_ORDER 0 // 数据bit顺序,0: MSB; 1: LSB #define MODE_2G4 PHY_2G4_1M // 速率,0: 2M; 1: 1M #define CRC_XOR_EN 0 // CRC异或使能, 0: 关闭; 1: 使能 #elif(PHY_2G4_MODE == 1 ) #define PKT_DET_CFG4( var ) { (*((PUINT32V)0x4000C120))= var; } // Demodulation parameter #define AA 0x94826E8E #define AA_EX 0 #define AA_LEN 1 #define PRE_LEN 1 #define CRC_INIT 0xFFFF #define CRC_POLY 0x8810 #define CRC_LEN 2 #define CTL_FILED 0 #define DPL_EN 0 #define DATA_ORDER 0 #define MODE_2G4 PHY_2G4_1M #define CRC_XOR_EN 0 #elif(PHY_2G4_MODE == 2 ) #define AA 0x94826E8E #define AA_EX 0 #define AA_LEN 1 #define PRE_LEN 1 #define CRC_INIT 0xFFFF #define CRC_POLY 0x8810 #define CRC_LEN 2 #define CTL_FILED 0 #define DPL_EN 0 #define DATA_ORDER 1 #define MODE_2G4 PHY_2G4_1M #define CRC_XOR_EN 1 #endif #else #define AA 0X8e89bed6; #define AA_EX 0 #define CRC_INIT 0X555555 #define CRC_POLY 0x80032d #endif typedef struct { uint32_t errContinue; uint32_t errCount; uint32_t txCount; uint32_t rxCount; uint8_t testCount; uint8_t testData; int8_t rssi; int8_t rssiMax; int8_t rssiMin; uint8_t boundEst; uint8_t boundConnect; } testBound_t; void RFRole_Init(void); void RF_LowPower( uint32_t time); void RF_ProcessRx( void ); #ifdef __cplusplus } #endif #endif
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号