/* * @Descripttion: * @version: * @Author: sueRimn * @Date: 2023-12-12 14:23:55 * @LastEditors: sueRimn * @LastEditTime: 2024-03-28 11:25:14 */ /*! * \file main.c * * \brief Target main 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 "main.h" #include "xc6xxx_rf_ADV.h" #include "mtypes.h" /*------------------------------------------------------------------------------------ Macros -------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------ Global Variables -------------------------------------------------------------------------------------*/ uint8_t recv_adv_buf[ADV_BUFF_LEN] = {0}; uint8_t rf_adv_channel[] = {RF_ADV_CHANNEL_37, RF_ADV_CHANNEL_38, RF_ADV_CHANNEL_39}; uint8_t adv_index = 0; /*------------------------------------------------------------------------------------ Func Prototype -------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------ Functions -------------------------------------------------------------------------------------*/ /** * @brief clock_init * @details * @param void * @retval void */ void clock_init(void) { CLOCK_InitCfg_t clock_cfg; clock_cfg.hfclk_src = CLOCK_HFCLK_SRC_XTAL; clock_cfg.hfclk_in = CLOCK_HFCLK_IN_32M; #if (RC_32K) clock_cb.lfclk_src = CLOCK_LFCLK_SRC_RC; #endif //(RC_32K) #if (XTAL_32K) clock_cb.lfclk_src = CLOCK_LFCLK_SRC_XTAL; #endif // (XTAL_32K) #if (XTAL_32768K) clock_cb.lfclk_src = CLOCK_LFCLK_SRC_XTAL; #endif // (XTAL_32768K) if (clock_cfg.lfclk_src == CLOCK_LFCLK_SRC_XTAL) { clock_cfg.lfclk_in = CLOCK_LFCLK_IN_32768; } else if (clock_cfg.lfclk_src == CLOCK_LFCLK_SRC_RC) { clock_cfg.lfclk_in = CLOCK_LFCLK_IN_32K; } xc_clock_init_cfg(&clock_cfg); SysTick_Config(xc_clock_hfclk_in_get() / 100); SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; } void app_uart_init(void) { GPIO_InitCfg_t gpio_cfg = {0}; gpio_cfg.Mux = GPIO_Mux0; gpio_cfg.Pull = GPIO_PULLUP; gpio_cfg.Int = NOT_INT; gpio_cfg.FunSel = UART0_TX; gpio_cfg.Pin = GPIO_18; gpio_cfg.Dir = GPIO_DIR_OUTPUT; xc_gpio_init(&gpio_cfg); gpio_cfg.FunSel = UART0_RX; gpio_cfg.Pin = GPIO_19; gpio_cfg.Dir = GPIO_DIR_INPUT; xc_gpio_init(&gpio_cfg); UART_InitCfg_t uart_cfg = {0}; uart_cfg.Parity = UART_PARITY_DISABLE; uart_cfg.StopBits = UART_STOP_1_BITS; uart_cfg.WordLength = UART_DATA_8_BITS; uart_cfg.BaudRate = UART_BAUDRATE_115200; uart_cfg.HardwareFlowControl = UART_HWFC_DISABLE; xc_uart_init(UART0_IDX, &uart_cfg); } /** * @brief Rf 2.4g dump log * @param void * * @retval void */ #ifdef DEBUG_LOG void rf_dump_log(void) { LOGI("***************** 2.4G Param ******************\n"); LOGI("CFG_TOP: 0x%08x\r\n", XC_RF_2_4G->CFG_TOP); LOGI("EN_AA: 0x%08x\r\n", XC_RF_2_4G->EN_AA); LOGI("EN_RXADDR: 0x%08x\r\n", XC_RF_2_4G->EN_RXADDR); LOGI("SETUP_AW: 0x%08x\r\n", XC_RF_2_4G->SETUP_AW); LOGI("SETUP_RETR: 0x%08x\r\n", XC_RF_2_4G->SETUP_RETR); LOGI("RF_CH: 0x%08x\r\n", XC_RF_2_4G->RF_CH); LOGI("SETUP_RF: 0x%08x\r\n", XC_RF_2_4G->SETUP_RF); LOGI("STATUS: 0x%08x\r\n", XC_RF_2_4G->STATUS); LOGI("OBSERVE_TX: 0x%08x\r\n", XC_RF_2_4G->OBSERVE_TX); LOGI("RSSI: 0x%08x\r\n", XC_RF_2_4G->RSSI); LOGI("RX_ADDR_P0: 0x%02x %08x\r\n", 0xFF & (XC_RF_2_4G->RX_ADDR_P0_H), XC_RF_2_4G->RX_ADDR_P0_L); LOGI("RX_ADDR_P1: 0x%02x %08x\r\n", 0xFF & (XC_RF_2_4G->RX_ADDR_P1_H), XC_RF_2_4G->RX_ADDR_P1_L); LOGI("RX_ADDR_P2TOP5:0x%08x\r\n", XC_RF_2_4G->RX_ADDR_P2TOP5); LOGI("BER_RESULT: 0x%08x%08x\r\n", XC_RF_2_4G->BER_ERR_CNT, XC_RF_2_4G->BER_RECV_CNT); LOGI("AGC_SETTING: 0x%08x\r\n", XC_RF_2_4G->AGC_SETTING); LOGI("PGA_SETTING: 0x%02x %08x\r\n", ((XC_RF_2_4G->TX_ADDR_H) & 0xFF00) >> 8, XC_RF_2_4G->PGA_SETTING); LOGI("TX_ADDR: 0x%02x %08x\r\n", ((XC_RF_2_4G->TX_ADDR_H) & 0xFF), XC_RF_2_4G->TX_ADDR_L); LOGI("RX_PW_PX: 0x%04x %08x\r\n", 0xFFFF & (XC_RF_2_4G->RX_PW_Px_H), XC_RF_2_4G->RX_PW_Px_L); LOGI("STATUS_FIFO: 0x%08x\r\n", XC_RF_2_4G->STATUS_FIFO); LOGI("RSSIREC: 0x%08x\r\n", XC_RF_2_4G->RSSIREC); LOGI("TXPROC_CFG: 0x%08x\r\n", XC_RF_2_4G->TXPROC_CFG); LOGI("RXPROC_CFG: 0x%02x %08x\r\n", 0xFF & (XC_RF_2_4G->RXPROC_CFG_H), XC_RF_2_4G->RXPROC_CFG_L); LOGI("DYNPD: 0x%08x\r\n", XC_RF_2_4G->DYNPD); LOGI("FEATURE: 0x%08x\r\n", XC_RF_2_4G->FEATURE); LOGI("PGA_SETTING_H: 0x%08x\r\n", XC_RF_2_4G->TX_ADDR_H); LOGI("***********************************************\n"); LOGI("\r\n"); } #endif // DEBUG_LOG /** * @brief RF ADV data package filling * @param uint8_t * - buff * uint8_t - len * @return uint8_t - data len */ uint8_t rf_adv_packet(uint8_t *buff) { if (sizeof(buff) > ADV_LENGTH) { buff = NULL; return FAIL; } uint8_t l = 0; buff[l++] = 0x42; buff[l++] = ADV_LENGTH - 5; /* Simulate Bluetooth MAC address */ uint8_t rf_adv_mac_addr[6] = {MAC_ADDR_0, MAC_ADDR_1, MAC_ADDR_2, MAC_ADDR_3, MAC_ADDR_4, MAC_ADDR_5}; memcpy(&buff[l], rf_adv_mac_addr, sizeof(rf_adv_mac_addr)); l += sizeof(rf_adv_mac_addr); buff[l++] = 0x02; buff[l++] = 0x01; buff[l++] = 0x06; buff[l++] = ADV_LENGTH - 15; // Complete Local Name buff[l++] = 0x09; /* Simulate Bluetooth broadcast data */ uint8_t rf_adv_data_buff[26] = {"RF-ADV-TEST-123456789BLE52"}; memcpy(&buff[l], rf_adv_data_buff, sizeof(rf_adv_data_buff)); l += sizeof(rf_adv_data_buff); /* CRC */ buff[l++] = 0x55; buff[l++] = 0x55; buff[l++] = 0x55; return l; } /** * @brief Rf adv tx event * @param void * * @retval void */ void rf_adv_tx_evevt(void) { uint8_t len = 0; uint8_t buff[ADV_LENGTH]; LOGI("************ADV Send Start**************\r\n"); while (1) { /* Set testing frequency points */ rf_set_channel(RF_ADV_BASE + rf_adv_channel[adv_index]); /* Simulate Bluetooth broadcast data filling */ len = rf_adv_packet(buff); /* Simulate Bluetooth broadcast package software CRC */ ble_crc(buff, len - 3, buff + len - 3); /* Simulate Bluetooth broadcast package software whitening */ ble_whiten(buff, len, bleWhitenStart(RF_ADV_BASE + rf_adv_channel[adv_index])); /* Send data processing */ rf_tx_packet(buff, len); adv_index += 1; if (adv_index == sizeof(rf_adv_channel)) { adv_index = 0; } delay_ms(10); } } /** * @brief RF rx adv event * @param void * * @retval void */ #if (XINCX_RF_ADV_NVIC_MODE == true) void rf_adv_rx_evevt(void) { uint8_t data_len = 0; uint32_t blecrc = 0; uint8_t rf_adv_crc_stat = CRC_IDLE; LOGI("************ADV Recv Start**************\r\n"); /* Set testing frequency points */ rf_set_channel(XINCX_ADV_CHANNEL); /* Enable RF24G interrupt */ NVIC_EnableIRQ(RF24G_IRQn); /* Entering the receiver */ CE_CTL_HIGH; while (1) { if ((recv_len != 0) && (rf24g_handler_flag)) { /* Entering standby mode */ CE_CTL_LOW; rf24g_handler_flag = false; /* Whitening of packet software */ blecrc = rf_adv_packet_whiten(&data_len); /* Packet software CRC judgment */ rf_adv_crc_stat = rf_adv_crc(recv_adv_buf, &data_len, blecrc); if (rf_adv_crc_stat == CRC_OK) { /* Only after 5 bytes is valid data */ for (uint8_t i = 0; i < data_len + 5; i++) LOGI("%02x ", recv_adv_buf[i]); LOGI("\r\n"); } memset(recv_adv_buf, 0, sizeof(recv_adv_buf)); recv_len = 0; /* Entering the receiver */ CE_CTL_HIGH; } } } #else void rf_adv_rx_evevt(void) { uint8_t data_len = 0; uint32_t blecrc = 0; uint8_t rf_adv_crc_stat = CRC_IDLE; LOGI("************ADV Recv Start**************\r\n"); /* Set testing frequency points */ rf_set_channel(XINCX_ADV_CHANNEL); /* Entering the receiver */ CE_CTL_HIGH; while (1) { if ((XC_RF_2_4G->STATUS) & MASK_RX_DR) { /* Entering standby mode */ CE_CTL_LOW; recv_len = rf_rx_packet(recv_adv_buf); if (recv_len != 0) { /* Whitening of packet software */ blecrc = rf_adv_packet_whiten(&data_len); /* Packet software CRC judgment */ rf_adv_crc_stat = rf_adv_crc(recv_adv_buf, &data_len, blecrc); if (rf_adv_crc_stat == CRC_OK) { for (uint8_t i = 0; i < data_len + 5; i++) LOGI("%02x ", recv_adv_buf[i]); LOGI("\r\n"); } memset(recv_adv_buf, 0, sizeof(recv_adv_buf)); recv_len = 0; } /* Entering the receiver */ CE_CTL_HIGH; } } } #endif #define RF_BLE_ADDR 0x1AB51376 #define RF_BLE_CHN37 2402 uint8_t rf_rxdata[32]; uint8_t rf_rxlen, rf_rssi; uint8_t rf_irq_cnt = 0; uint8_t rf_rx_cnt = 0; mftest_t mftest = {0}; //生产测试 uint8_t getbuff[8] = {0}; uint8_t setbuff[8] = {0}; uint8_t saveflag = 1; //默认为断电保存状态 uint8_t setrad_flag = 0; volatile uint16_t cnt_ms1 = 0; volatile uint16_t cnt_ms2 = 0; volatile uint32_t ticks[64] = {0}; void app_tick_handler(void) { cnt_ms1++; cnt_ms2++; light_tick(); rad_tick(); //以下代码模拟定时器中运行的程序 for(int i = 0; i < 64; i++) { if(ticks[i] < 0xFFFFFFFF) { ticks[i]++; } } } extern void readreg(void); #define LED1_PIN GPIO_1 #define LED2_PIN GPIO_4 /** * @brief main * @details * @param[in] void * @param[out] void * @retval int - 0 * @retval void * @par identifier * reserve * @par other * void * @par change log * Alex created on 2023-05-31 */ int main(void) { /* Clock initialization */ clock_init(); /* Serial port initialization */ app_uart_init(); light_init(); rad_init(); test_init(20); LOGI("__START__\n"); /* Simulate broadcast initialization */ rf24g_adv_init(); GPIO_InitCfg_t GPIO_InitCfg = { 0 }; GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Pull = GPIO_PULLUP; // Board Led1 Initialization GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT; GPIO_InitCfg.Int = NOT_INT; GPIO_InitCfg.Pin = LED1_PIN; xc_gpio_init(&GPIO_InitCfg); GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Pull = GPIO_PULLUP; // Board Led1 Initialization GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT; GPIO_InitCfg.Int = NOT_INT; GPIO_InitCfg.Pin = LED2_PIN; xc_gpio_init(&GPIO_InitCfg); xc_gpio_write_pin(LED1_PIN, GPIO_PIN_RESET); xc_gpio_write_pin(LED2_PIN, GPIO_PIN_RESET); #ifdef DEBUG_LOG /* Register information printing */ rf_dump_log(); #endif // DEBUG_LOG uint8_t data_len = 0; uint32_t blecrc = 0; uint8_t rf_adv_crc_stat = CRC_IDLE; LOGI("************ADV Recv Start**************\r\n"); /* Set testing frequency points */ rf_set_channel(XINCX_ADV_CHANNEL); /* Enable RF24G interrupt */ NVIC_EnableIRQ(RF24G_IRQn); /* Entering the receiver */ CE_CTL_HIGH; #if (XINCX_ADV_MODE == TX_MODE) /* Send Event */ rf_adv_tx_evevt(); #elif (XINCX_ADV_MODE == RX_MODE) /* Receive events */ rf_adv_rx_evevt(); #endif ASSERT; }