/* * @Descripttion: * @version: * @Author: sueRimn * @Date: 2023-12-12 14:24:01 * @LastEditors: sueRimn * @LastEditTime: 2023-12-13 10:32:28 */ /*! * \file rf_2_4g.c * * \brief Target RF 2.4g implementation * * \copyright Revised BSD License, see section \ref LICENSE. * * \code * * _ __ _ ________ _ * | |/ /(_)___ / ____/ /_ (_)___ * | // / __ \/ / / __ \/ / __ \ * / |/ / / / / /___/ / / / / /_/ / * /_/|_/_/_/ /_/\____/_/ /_/_/ .___/ * /_/ * (C) 2022-2025 XinChip * * \endcode * * \author ( XinChip ) Alex-J * * \author ( XinChip ) */ /*----------------------------------------------------------------------------------- INCLUDE HEADE FILES ------------------------------------------------------------------------------------*/ #include "xc6xxx_rf_ADV.h" #include "xc6xxx_rf_2_4g.h" /*------------------------------------------------------------------------------------ Macros -------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------ Macros -------------------------------------------------------------------------------------*/ uint32_t recv_len; int sendchar(int c); uint8_t recv_adv_buf[ADV_LENGTH]; /*------------------------------------------------------------------------------------ Functions -------------------------------------------------------------------------------------*/ /** * @brief RF ADV Initialization * @param void * * @retval void */ void rf24g_adv_init(void) { /* Rf modem init*/ rf24g_modem_init(); /* Set up 2.4G RF modem*/ rf24g_config(); set_rf_dynpd(XINCX_2_4G_DYNPD); /* Set PTX address */ set_rf_txaddr(TX_ADDR_L_VAL, TX_ADDR_H_VAL); /* Set PRX address */ set_rf_pipe0_rxaddr(RX_ADDR_L_VAL, RX_ADDR_H_VAL); /* Set address width */ set_rf_tx_addr_width(XINCX_RF_TX_ADDR_WIDTH); /* Set transfer rate */ set_rf_DR(XINCX_RF_TRANS_RATE); /* Set retransmission delay and retransmission frequency */ set_rf_retr(XINCX_2_4G_RETRANS_CNT, XINCX_2_4G_RETRANS_DELAY); /* Set CRC */ set_rf_crc(XINCX_2_4G_CRC_BYTE); /* Set data frame format */ set_rf_feature(XINCX_ADV_LONG_PLD, XINCX_ADV_FEC, XINCX_ADV_WHITEN, XINCX_ADV_DPL, XINCX_ADV_ACK_PAY, XINCX_ADV_DYN_ACK); /* Set Payload */ set_rf_pipe_rx_payLen(PIPE0_LEN, PIPE1_LEN, PIPE2_LEN, PIPE3_LEN, PIPE4_LEN, PIPE5_LEN); /* Set ack pipe*/ set_rf_en_pipe(XINCX_RF_PIPE_ENABLE); /* Set transmission power */ set_rf_power(XINCX_POWER); /* Set mode */ set_rf_mode(XINCX_ADV_MODE); /* RC filtering calibration */ rf_rc_calib(); } /** * @brief RF ADV packet whiten * @param uint8_t * - len * @return uint32_t - blecrc */ uint32_t rf_adv_unpacket( uint8_t *data, uint8_t data_len, uint8_t *outlen) { for (int i = 0; i < data_len; i++) data[i] = reverseBits(data[i]); uint16_t channel = (XC_RF_2_4G->RF_CH & 0x3fff) + 1; ble_whiten(data, data_len, bleWhitenStart(channel)); for (int i = 0; i < data_len; i++) data[i] = reverseBits(data[i]); *outlen = (data[1] > (ADV_LENGTH - 5)) ? (ADV_LENGTH - 5) : data[1]; uint32_t blecrc = (data[*outlen + 5 - 1] << 16) + (data[*outlen + 5 - 2] << 8) + data[*outlen + 5 - 3]; data[*outlen + 5 - 1] = data[*outlen + 5 - 2] = data[*outlen + 5 - 3] = 0x55; ble_crc(data, *outlen + 5 - 3, data + *outlen + 5 - 3); return blecrc; } /** * @brief RF ADV software CRC determination * @param uint8_t * - adv_buff * @param uint8_t * - len * @param uint32_t - blecrc * @return uint8_t - 0 */ uint16_t rf_adv_crc(uint8_t *adv_buff, uint8_t *len, uint32_t blecrc) { if (blecrc == ((adv_buff[*len + 5 - 1] << 16) + (adv_buff[*len + 5 - 2] << 8) + adv_buff[*len + 5 - 3])) return 1; else return 0; } /** * @brief Reverse bits * @param uint8_t - input * @retval uint8_t - temp */ 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; } /** * @brief Ble whiten channel * @param uint16_t - fre * @retval uint8_t - temp | 2 */ uint8_t bleWhitenStart(uint16_t Fre) { uint8_t chan = (Fre == 2426) ? 38 : ((Fre == 2402) ? 37 : 39); return reverseBits(chan) | 2; } /** * @brief Ble whiten * @param uint8_t * - data * @param uint8_t - len * @param uint8_t - whitenCoeff * @retval void */ void ble_whiten(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; } // Flip variables *data = reverseBits(*data); data++; } } /** * @brief * @param void * @retval void */ void ble_crc(uint8_t *data, uint8_t len, uint8_t *dst) { // calculating the CRC based on a LFSR uint8_t i, temp, tempData; while (len--) { tempData = *data++; for (i = 0; i < 8; i++, tempData >>= 1) { temp = dst[0] >> 7; dst[0] <<= 1; if (dst[1] & 0x80) { dst[0] |= 1; } dst[1] <<= 1; if (dst[2] & 0x80) { dst[1] |= 1; } dst[2] <<= 1; if (temp != (tempData & 1)) { dst[2] ^= 0x5B; dst[1] ^= 0x06; } } } dst[2] = reverseBits(dst[2]); dst[1] = reverseBits(dst[1]); dst[0] = reverseBits(dst[0]); }