713 lines
18 KiB
C
713 lines
18 KiB
C
/*----------------------------------------------------------------------------------------------------
|
|
INCLUDE HEADE FILES
|
|
----------------------------------------------------------------------------------------------------*/
|
|
|
|
#include "Includes.h"
|
|
#include "bsp_2_4G.h"
|
|
|
|
#define AON_RF_AONREG ((volatile unsigned *)0x40002430)
|
|
|
|
#define RF_ANA02 ((volatile unsigned *)(0X4002F000 + 0x008))
|
|
#define RF_ANA03 ((volatile unsigned *)(0X4002F000 + 0x00C))
|
|
#define RF_ANA08 ((volatile unsigned *)(0X4002F000 + 0x020))
|
|
#define RF_ANA15 ((volatile unsigned *)(0X4002F000 + 0x03C))
|
|
#define RF_ANA21 ((volatile unsigned *)(0X4002F000 + 0x054))
|
|
#define RF_ANA26 ((volatile unsigned *)(0X4002F000 + 0x068))
|
|
#define RF_ANA27 ((volatile unsigned *)(0X4002F000 + 0x06C))
|
|
#define RF_ANA28 ((volatile unsigned *)(0X4002F000 + 0x070))
|
|
#define RF_ANA29 ((volatile unsigned *)(0X4002F000 + 0x074))
|
|
|
|
#define BT_RF_CTRL_SEL ((volatile unsigned *)(0X4002F000 + 0x0B8))
|
|
#define CPR_RF_REG0 ((volatile unsigned *)(0x40000000 + 0x1B0))
|
|
#define CPR_RF_REG1 ((volatile unsigned *)(0x40000000 + 0x1B4))
|
|
|
|
void delay_cn(uint32_t cn)
|
|
{
|
|
while (cn--)
|
|
__NOP();
|
|
}
|
|
|
|
/*! ********************************************************
|
|
* @name wbit
|
|
* @desc wbit
|
|
* *********************************************************/
|
|
static void wbit(uint16_t reg_addr, int end, int start, char *bit_str)
|
|
{
|
|
uint16_t reg_val = 0;
|
|
char ch = 0;
|
|
uint16_t i = 0;
|
|
uint16_t s_len = 0;
|
|
while (*(bit_str + s_len))
|
|
s_len++;
|
|
if (s_len != (end - start + 1))
|
|
while (1)
|
|
;
|
|
reg_val = *(uint16_t *)(0X4002F000 + reg_addr);
|
|
for (i = start; i <= end; i++)
|
|
{
|
|
int bit_idx = i - start;
|
|
ch = bit_str[(end - start) - bit_idx] - '0';
|
|
if (ch == 1)
|
|
setbit(reg_val, i);
|
|
else if (ch == 0)
|
|
clrbit(reg_val, i);
|
|
}
|
|
*(uint16_t *)(0X4002F000 + reg_addr) = reg_val;
|
|
}
|
|
/*! ********************************************************
|
|
* @name wbit
|
|
* @desc wbit
|
|
* *********************************************************/
|
|
static uint16_t rbit(uint16_t reg_addr)
|
|
{
|
|
return *(uint16_t *)(0X4002F000 + reg_addr);
|
|
}
|
|
|
|
/*! ********************************************************
|
|
* @name rf_rccali
|
|
* @desc rf rc filter calib
|
|
* *********************************************************/
|
|
void rf_rccalib(void)
|
|
{
|
|
static uint8_t rccalib_flag = 0;
|
|
if (rccalib_flag)
|
|
return;
|
|
uint32_t timeout = 0;
|
|
uint16_t val = 0;
|
|
wbit(0x0080, 10, 8, "111"); // RG_RCCAL_CTRL(Rccal 输出码值控制) def"100"
|
|
wbit(0x0080, 5, 5, "1"); // RG_RCCAL_RESETN=1
|
|
wbit(0x0080, 3, 3, "0"); // RG_RCCAL_SEL =0
|
|
wbit(0x0080, 2, 2, "1"); // RG_RCCAL_EN=1
|
|
wbit(0x0080, 4, 4, "1"); // RG_RCCAL_START=1
|
|
while (!(rbit(0x0084) & 0x8000))
|
|
{ // 等待AD_RCCAL_FINISH拉高 得出校准值 AD_RCCAL_CTRIM
|
|
if ((timeout++) > 0x10000)
|
|
break;
|
|
}
|
|
val = rbit(0x0084);
|
|
val = (val & 0x7FFF) >> 10; // 将校准值AD_RCCAL_CTRIM保存
|
|
wbit(0x0080, 3, 3, "1"); // RG_RCCAL_SEL =1
|
|
wbit(0x0080, 2, 2, "0"); // RG_RCCAL_EN=0
|
|
wbit(0x0080, 4, 4, "0"); // RG_RCCAL_START=0
|
|
char tb[6] = {0}; // 将保存的校准值转换成字符串
|
|
tb[4] = ((val & 0x01) ? '1' : '0');
|
|
tb[3] = ((val & 0x02) ? '1' : '0');
|
|
tb[2] = ((val & 0x04) ? '1' : '0');
|
|
tb[1] = ((val & 0x08) ? '1' : '0');
|
|
tb[0] = ((val & 0x10) ? '1' : '0');
|
|
wbit(0x0080, 15, 11, tb);
|
|
rccalib_flag = 1;
|
|
// printf("\nRG_RCCAL_CC:%X \n",rbit(0x80));
|
|
}
|
|
/*! ********************************************************
|
|
* @name reset_2_4g_modem
|
|
* @desc reset 2.4g modem
|
|
* *********************************************************/
|
|
void reset_2_4g_modem(void)
|
|
{
|
|
*CPR_RF_REG1 &= (~(1 << 21)); // reset
|
|
delay_cn(200);
|
|
*CPR_RF_REG1 |= (1 << 21); // unreset
|
|
delay_cn(200);
|
|
}
|
|
/*! ********************************************************
|
|
* @name _Ctune_Set
|
|
* @desc frequency offset tune
|
|
* *********************************************************/
|
|
void freq_tune(uint8_t tu)
|
|
{
|
|
*AON_RF_AONREG = (*AON_RF_AONREG & (~(0x3f << 20))) | ((tu & 0x3f) << 20); //- frequency offset
|
|
}
|
|
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void config_2_4g_rf(void)
|
|
{
|
|
|
|
// uint32_t val;
|
|
// *((uint32_t volatile*)0x40000070) = 0x4000400; //- bt_pclk
|
|
// *((uint32_t volatile*)0x40002450)|= 0x1; //- open rf digital
|
|
//
|
|
// freq_tune(0x36); //- frequency offset
|
|
#if 1
|
|
*BT_RF_CTRL_SEL |= 0xE000; //- sel_24G_rfchan sel_24G_rfldoen sel_24G_rampout use 2.4G signal
|
|
/*2.4 ack
|
|
ana8<9:6> 0001 to 0000
|
|
ana15<3:1> 010 to 100
|
|
ana21<5:2> 1000 to 1011
|
|
ana2<12> 1 to 0
|
|
*/
|
|
|
|
*RF_ANA08 = *RF_ANA08 & (~0x3C0);
|
|
*RF_ANA15 = (*RF_ANA15 & (~0xE)) | 0x8;
|
|
*RF_ANA21 = (*RF_ANA21 & (~0x3c)) | 0x2c;
|
|
*RF_ANA02 &= (~0x1000);
|
|
#if _24G_CLK_SOURCE == CLK_BBPLL64M
|
|
// bbpll 64M
|
|
*RF_ANA26 |= 0xF000;
|
|
*RF_ANA27 |= 0x02;
|
|
*RF_ANA26 = (*RF_ANA26 & (~0x3F)) | 0x04;
|
|
#elif _24G_CLK_SOURCE == CLK_BBPLL96M
|
|
// bbpll 96M
|
|
*RF_ANA26 |= 0xF000;
|
|
*RF_ANA27 |= 0x02;
|
|
*RF_ANA26 = (*RF_ANA26 & (~0x3F)) | 0x06;
|
|
#endif
|
|
|
|
#if (TRANS_RATE == RATE_1M)
|
|
*RF_ANA21 = (*RF_ANA21 & (0xFFFF8FFF)) | 0x3000; //- tx dac gc def110 Optimization
|
|
#elif (TRANS_RATE == RATE_2M)
|
|
*RF_ANA21 = (*RF_ANA21 & (0xFFFF8FFF)) | 0x2000; //- tx dac gc def110 Optimization
|
|
#else
|
|
*RF_ANA21 = (*RF_ANA21 & (0xFFFF8FFF)) | 0x6000; //- tx dac gc def110 Optimization
|
|
#endif
|
|
|
|
#if (TRANS_RATE == RATE_2M)
|
|
*RF_ANA03 |= 0x01;
|
|
#endif
|
|
|
|
*RF_ANA29 |= 0x02; //- manual afc
|
|
*RF_ANA28 |= 0x01; //- afc pulse
|
|
|
|
reset_2_4g_modem();
|
|
#if _24G_CLK_SOURCE == CLK_BBPLL64M
|
|
*CPR_RF_REG1 = (*CPR_RF_REG1 & 0xFFFF3F0F) | 0x00C030; // enable 2.4G_mclk 2.4G_hclk 4div
|
|
//*CPR_RF_REG1 =(*CPR_RF_REG1&0xFFFF3F0F)|0x00C070;//enable 2.4G_mclk 2.4G_hclk 8div
|
|
#elif _24G_CLK_SOURCE == CLK_BBPLL96M
|
|
*CPR_RF_REG1 = (*CPR_RF_REG1 & 0xFFFF3F0F) | 0x00C050; // enable 2.4G_mclk 2.4G_hclk 6div
|
|
#endif
|
|
*CPR_RF_REG0 |= 0x600; // set 2.4G agc and iq from 2.4 modem
|
|
#endif
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_power(uint8_t txgm)
|
|
{
|
|
*RF_ANA21 = (*RF_ANA21 & (~0xfc0)) | ((txgm & 0x3f) << 6);
|
|
}
|
|
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_channel(uint16_t channel)
|
|
{
|
|
printf("%x\n", *RF_CH);
|
|
#if (TRANS_RATE == RATE_2M)
|
|
*RF_CH = ((*CFG_TOP & 0x01) ? (channel - 2) : channel);
|
|
#else
|
|
*RF_CH = ((*CFG_TOP & 0x01) ? (channel - 1) : channel);
|
|
#endif
|
|
printf("%x\n", *RF_CH);
|
|
delay_cn(200);
|
|
*RF_ANA28 &= (~0x1); //- afc pulse
|
|
delay_cn(200);
|
|
*RF_ANA28 |= 0x1; //- afc pulse
|
|
delay_cn(200);
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_txaddr(uint32_t txaddr_l, uint32_t txaddr_h)
|
|
{
|
|
uint32_t val;
|
|
__write_hw_reg32(TX_ADDR_L, txaddr_l);
|
|
__read_hw_reg32(TX_ADDR_H, val);
|
|
__write_hw_reg32(TX_ADDR_H, (txaddr_h & 0xff) | (val & 0xffffff00));
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_pipe0_rxaddr(uint32_t rxaddr_l, uint32_t rxaddr_h)
|
|
{
|
|
__write_hw_reg32(RX_ADDR_P0_L, rxaddr_l);
|
|
__write_hw_reg32(RX_ADDR_P0_H, rxaddr_h & 0xff);
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_trx_addr_len(uint8_t len)
|
|
{
|
|
switch (len)
|
|
{
|
|
case 3:
|
|
__write_hw_reg32(SETUP_AW, 0xa5);
|
|
break;
|
|
case 4:
|
|
__write_hw_reg32(SETUP_AW, 0xaa);
|
|
break;
|
|
case 5:
|
|
__write_hw_reg32(SETUP_AW, 0xaf);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_rate(uint8_t rate)
|
|
{
|
|
__write_hw_reg32(SETUP_RF, rate);
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_feature(uint8_t long_pld, uint8_t fec, uint8_t whiten, uint8_t dpl, uint8_t ack_pay)
|
|
{
|
|
__write_hw_reg32(FEATURE, (long_pld << 5) | (fec << 4) | (whiten << 3) | (dpl << 2) | (ack_pay << 1));
|
|
}
|
|
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_mode(uint8_t mode)
|
|
{
|
|
uint32_t val;
|
|
__read_hw_reg32(CFG_TOP, val); //
|
|
#if (TRANS_RATE == RATE_2M)
|
|
__write_hw_reg32(CFG_TOP, (val & (~0x1ffff3)) | (mode & 0x01) | 0x1b8672);
|
|
#else
|
|
__write_hw_reg32(CFG_TOP, (val & (~0x1ffff3)) | (mode & 0x01) | 0x0b8272);
|
|
#endif
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_crc(uint8_t enable, uint8_t crc_bit)
|
|
{
|
|
uint32_t val;
|
|
__read_hw_reg32(CFG_TOP, val); //
|
|
if (enable)
|
|
{
|
|
if (crc_bit == CRC_1BIT)
|
|
{
|
|
__write_hw_reg32(CFG_TOP, (val | (~0x0C)) | 0x08);
|
|
}
|
|
else
|
|
{
|
|
__write_hw_reg32(CFG_TOP, val | 0x0C);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
__write_hw_reg32(CFG_TOP, val & (~0x08));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_p012345_revlen(uint32_t p0123len, uint32_t p45len)
|
|
{
|
|
__write_hw_reg32(RX_PW_PX_L, p0123len);
|
|
__write_hw_reg32(RX_PW_PX_H, p45len);
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_pipe0_revlen(uint8_t p0len)
|
|
{
|
|
*RX_PW_PX_L = (*RX_PW_PX_L & (~0xff)) | p0len;
|
|
}
|
|
|
|
void set_retry_cnt(uint8_t cnt)
|
|
{
|
|
*SETUP_RETR = (*SETUP_RETR & (~0x0f)) | cnt;
|
|
}
|
|
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void send_cmd(uint8_t cmd)
|
|
{
|
|
nop();
|
|
__write_hw_reg32(CMD_BYTE, cmd | CMD_DONE);
|
|
nop();
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void XC_AckPayload(uint8_t *txbuf, uint8_t len)
|
|
{
|
|
send_cmd(FLUSH_TX);
|
|
if (!((*STATUS_FIFO) & TX_FULL)) // tx FIFO is not full
|
|
{
|
|
send_cmd(W_ACK_PLOAD);
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
*TXFIFO_WDATA = txbuf[i];
|
|
nop();
|
|
}
|
|
}
|
|
}
|
|
void XC_TxPacket(uint8_t *txbuf, uint8_t len) // r
|
|
{
|
|
|
|
send_cmd(FLUSH_TX);
|
|
__write_hw_reg32(STATUS, ALL_IRQ_STATUS);
|
|
if (!((*STATUS_FIFO) & TX_FULL)) // tx FIFO is not full
|
|
{
|
|
send_cmd(W_TX_PLOAD);
|
|
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
*TXFIFO_WDATA = txbuf[i];
|
|
nop();
|
|
}
|
|
CE_High;
|
|
for (int i = 0; i < 0x1000; i++)
|
|
; // delay us
|
|
CE_Low;
|
|
}
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
|
|
uint8_t XC_RxPacket(uint8_t en_ack_pay, uint8_t *ack_pay_buf, uint8_t ack_len, uint8_t *rxbuf) // r
|
|
{
|
|
static uint8_t cnt = 0x01;
|
|
uint32_t status = 0, len = 0;
|
|
__read_hw_reg32(STATUS, status); // read status
|
|
if ((status & 0x0e) != 0x0e)
|
|
{
|
|
send_cmd(R_RX_PL_WID);
|
|
len = *RXFIFO_LEN & 0xFF; // pipe = (status & 0xe) >> 1;
|
|
for (int i = 0; i < 4; i++)
|
|
send_cmd(R_RX_PLOAD);
|
|
for (int i = 0; i < len; i++)
|
|
*(rxbuf + i) = *RXFIFO_RDTA;
|
|
ack_pay_buf[0] = cnt++;
|
|
switch (rxbuf[2])
|
|
{
|
|
|
|
case 1: // match packet
|
|
ack_pay_buf[4] = 0x02;
|
|
ack_pay_buf[5] = STATUS_OK;
|
|
break;
|
|
case 3: // bin info packet
|
|
ack_pay_buf[4] = 0x04;
|
|
// ack_pay_buf[5]=STATUS_OK;
|
|
ack_pay_buf[5] = info_24g.DataStatus;
|
|
break;
|
|
case 5: // bin packet
|
|
ack_pay_buf[4] = 0x05;
|
|
ack_pay_buf[5] = STATUS_OK;
|
|
break;
|
|
case 6: // ota result
|
|
ack_pay_buf[4] = 0x07;
|
|
ack_pay_buf[5] = info_24g.CheckStatus; // ack_pay_buf[5]=STATUS_OK;
|
|
break;
|
|
case 8: // ready
|
|
ack_pay_buf[4] = 0x09;
|
|
ack_pay_buf[5] = STATUS_READY;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (en_ack_pay)
|
|
XC_AckPayload(ack_pay_buf, ack_len); //
|
|
// if(en_ack_pay) XC_AckPayload(ack_pay_buf,5);//250K payload max 5
|
|
// if(en_ack_pay) XC_AckPayload(ack_pay_buf,32);//1M payload max 32
|
|
}
|
|
__write_hw_reg32(STATUS, ALL_IRQ_STATUS); // clear all status inter
|
|
send_cmd(FLUSH_RX);
|
|
return len;
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void set_dynpd(uint8_t val)
|
|
{
|
|
__write_hw_reg32(DYNPD, val);
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void go_rx(uint16_t ch)
|
|
{
|
|
uint8_t tv = *STATUS_FIFO;
|
|
if (((tv & 0x2) && (tv & 0x0C)))
|
|
{
|
|
printf("reset_2_4g_modem\n");
|
|
reset_2_4g_modem();
|
|
init_24G(RX_MODE);
|
|
}
|
|
else
|
|
{
|
|
send_cmd(FLUSH_RX);
|
|
set_mode(RX_MODE);
|
|
}
|
|
set_channel(ch);
|
|
}
|
|
|
|
void go_tx(uint16_t ch)
|
|
{
|
|
send_cmd(FLUSH_TX);
|
|
set_mode(TX_MODE);
|
|
set_channel(ch);
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
|
|
uint8_t wait_ack(uint8_t *ack_pay_buf, uint8_t *len, uint32_t timeout)
|
|
{
|
|
while (timeout--)
|
|
{
|
|
if ((*STATUS) & XC_TX_DS)
|
|
{
|
|
if (len != NULL)
|
|
*len = XC_RxPacket(0, NULL, 0, ack_pay_buf);
|
|
return 1; // rev ack
|
|
}
|
|
if ((*STATUS) & XC_MAX_RT)
|
|
{
|
|
return 0; // no rev ack
|
|
}
|
|
}
|
|
return 0; // no rev ack
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void init_adv(uint8_t mode)
|
|
{
|
|
|
|
set_txaddr(0x71917d6b, 0); // tx addr 4byte
|
|
set_pipe0_rxaddr(0x71917d6b, 0); // rx pipe0 addr 4byte
|
|
set_trx_addr_len(4); // set trx addrlen is 4byte
|
|
|
|
set_rate(TRANS_RATE); // set rate
|
|
set_crc(DIS_CRC, CRC_2BIT);
|
|
set_feature(EN_LONG_PLD, DIS_FEC, DIS_WHITEN, DIS_DPL, DIS_ACK_PAY);
|
|
set_pipe0_revlen(BUFF_ADV_LENGTH); // set_p012345_revlen(0x2A2A2A2A,0x2A2A);//pipe0-1-2-3-4-pipe5 payload 42byte
|
|
set_mode(mode); // set tx or rx
|
|
set_power(POWER_LEVEL);
|
|
rf_rccalib(); // Initialization finally performs the calibration rc filter,This function is executed only once internally
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void init_24G(uint8_t mode)
|
|
{
|
|
// set_retry_cnt(3);//set auto retransmit count
|
|
set_dynpd(0x3f); // enable dynamic payload
|
|
set_txaddr(0xE7E7C2E6, 0xC2); // tx addr 5byte
|
|
set_pipe0_rxaddr(0xE7E7C2E6, 0xC2); // rx pipe0 addr 5byte
|
|
set_trx_addr_len(5); // set trx addrlen is 5byte
|
|
|
|
set_rate(TRANS_RATE); // set rate
|
|
set_crc(EN_CRC, CRC_2BIT);
|
|
set_feature(DIS_LONG_PLD, EN_FEC, EN_WHITEN, EN_DPL, EN_ACK_PAY);
|
|
set_pipe0_revlen(BUFF_24G_LENGTH); // set_p012345_revlen(0x20202020,0x2020); //pipe0-1-2-3-4-pipe5 payload 32byte
|
|
set_mode(mode); // set tx or rx
|
|
set_power(POWER_LEVEL);
|
|
rf_rccalib(); // Initialization finally performs the calibration rc filter,This function is executed only once internally
|
|
}
|
|
|
|
/*******************************adv**********************************/
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
uint8_t reverseBits(uint8_t input)
|
|
{
|
|
uint8_t i = 0, temp = 0;
|
|
for (; i < 8; i++)
|
|
{
|
|
temp <<= 1;
|
|
temp = ((input >> i) & 0x01) ? (temp | 0x01) : (temp | 0x00);
|
|
}
|
|
return temp;
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
uint8_t bleWhitenStart(uint16_t Fre)
|
|
{
|
|
uint8_t chan = (Fre == RF_ADV_CHANNELS_38) ? 38 : ((Fre == RF_ADV_CHANNELS_37) ? 37 : 39);
|
|
return reverseBits(chan) | 2;
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
/*白化,LFSR的方式进行白化*/
|
|
void bleWhiten(uint8_t *data, uint8_t len, uint8_t whitenCoeff)
|
|
{
|
|
uint8_t m;
|
|
while (len--)
|
|
{
|
|
for (m = 1; m; m <<= 1)
|
|
{
|
|
if (whitenCoeff & 0x80)
|
|
{
|
|
whitenCoeff ^= 0x11;
|
|
(*data) ^= m;
|
|
}
|
|
whitenCoeff <<= 1;
|
|
}
|
|
*data = reverseBits(*data); // 新增 -- 翻转变量
|
|
data++;
|
|
}
|
|
}
|
|
/**
|
|
* Copyright (c) 2022 - 2025, XinChip
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Author :
|
|
*
|
|
*/
|
|
void BLEcrc(const uint8_t *data, uint8_t dataLen, uint8_t *outputCRC)
|
|
{
|
|
// calculating the CRC based on a LFSR
|
|
uint8_t i, temp, tempData;
|
|
while (dataLen--)
|
|
{
|
|
|
|
tempData = *data++;
|
|
for (i = 0; i < 8; i++, tempData >>= 1)
|
|
{
|
|
temp = outputCRC[0] >> 7;
|
|
|
|
outputCRC[0] <<= 1;
|
|
if (outputCRC[1] & 0x80)
|
|
{
|
|
outputCRC[0] |= 1;
|
|
}
|
|
outputCRC[1] <<= 1;
|
|
if (outputCRC[2] & 0x80)
|
|
{
|
|
outputCRC[1] |= 1;
|
|
}
|
|
outputCRC[2] <<= 1;
|
|
|
|
if (temp != (tempData & 1))
|
|
{
|
|
outputCRC[2] ^= 0x5B;
|
|
outputCRC[1] ^= 0x06;
|
|
}
|
|
}
|
|
}
|
|
outputCRC[2] = reverseBits(outputCRC[2]);
|
|
outputCRC[1] = reverseBits(outputCRC[1]);
|
|
outputCRC[0] = reverseBits(outputCRC[0]);
|
|
}
|