CH572_rfbasic双向透传
代码:
/* 头文件包含 */
#include "rf_basic.h"
#define ALIGNED4(x) ((x+3)/4*4)
rfipTx_t gTxParam;
rfipRx_t gRxParam;
#define MODE_RX 0
#define MODE_TX 1
#define WAIT_ACK 1 // 是否使能ACK
#define TEST_DATA_LEN 52//4 // 数据长度
#define TEST_FREQUENCY 16 // 通信频点
__attribute__((__aligned__(4))) uint8_t TxBuf[TEST_DATA_LEN] =
{0x00,0x00,
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,
};
__attribute__((__aligned__(4))) uint8_t rxmodesendBuf[TEST_DATA_LEN] =
{0x00,0x00,
0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,
};
__attribute__((__aligned__(4))) uint8_t RxBuf[264]; // 接收DMA buf不能小于264字节
# if 0
#define TEST_MODE MODE_TX // 发送模式
#else
#define TEST_MODE MODE_RX // 接收模式
#endif
#define RF_DEVICE_PERIDOC 10
uint32_t volatile gTxCount;
uint32_t volatile gRxCount;
int32_t volatile Rssi_sum=0;
int8_t gRssi=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;
// #if(TEST_MODE == MODE_RX) // rx
// Rssi_sum += (int8_t)pData[TEST_DATA_LEN+RSSI_OFFSET];
// #else
// #if( WAIT_ACK ) // tx ack
// uint8_t AckLen = pData[1];
// gRssi = (int8_t)pData[AckLen+RSSI_OFFSET];
// #endif
// #endif
// // for( int i=0;i<TEST_DATA_LEN;i++ )
// // {
// // PRINT("%x\n",pData[i]);
// // }
// // PRINT("\n");
// }
{
uint8_t *pData = (uint8_t *)gRxParam.rxDMA;
// PRINT("#R %d\n",(int8_t)pData[1]);
// 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();
uint8_t *pData = (uint8_t *)gRxParam.rxDMA;
for(uint8_t i =0;i<TEST_DATA_LEN;i++){
PRINT("%d ",pData[i]);
}PRINT("\n");PRINT("\n");
// PRINT("%d %d\n",pData[2],pData[3]);
#if( TEST_MODE == MODE_RX )
#if( WAIT_ACK )
rxmodesendBuf[0] = 0x55;
rxmodesendBuf[1] = TEST_DATA_LEN;
rf_tx_start( rxmodesendBuf );
#else
rf_rx_start( );
#endif
#endif
}
if( sta&RF_STATE_RX_CRCERR )
{
PRINT("crc -err.\n");
#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); // 清除中断标志
// 初始化发送的数据
TxBuf[0] = 0x55; //前2B固定位是固定位
TxBuf[1] = TEST_DATA_LEN;
GPIOA_SetBits(GPIO_Pin_4);
rf_tx_start( TxBuf );
GPIOA_ResetBits(GPIO_Pin_4);
}
}
/*******************************************************************************
* @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( );
{
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 = PHY_MODE_PHY_2M; // BLE 2M模式
PRINT("cfgVal=%x\n",Properties.cfgVal);
}
// RX相关参数,全局变量
{
gRxParam.accessAddress = ACCESS_ADR; // Rx接入地址
gRxParam.crcInit = CRC_INIT;
gRxParam.crcPoly = CRC_POLY;
gRxParam.properties = Properties.cfgVal;
gRxParam.rxDMA = (uint32_t)RxBuf;
gRxParam.rxMaxLen = TEST_DATA_LEN;
}
// TX相关参数,全局变量
{
gTxParam.accessAddress = ACCESS_ADR; // Tx接入地址
gTxParam.crcInit = CRC_INIT;
gTxParam.crcPoly = CRC_POLY;
gTxParam.properties = Properties.cfgVal;
gTxParam.waitTime = 80*2;
gTxParam.txPowerVal = LL_TX_POWEER_7_DBM; // Tx发射功率
gTxParam.txLen = 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();
PRINT("rx channel...%d\n",gRxParam.frequency);
// 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 ******************************/
浙公网安备 33010602011771号