使用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號