2.4G-RF_Basic模拟广播包数据
使用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
#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
}
rf_basic.h
#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号