#include "bsp.h" #include "board_gpio.h" #include "board_spi.h" #include "timer3.h" #define isMaster 0 #define CRC_ENABLE uint16_t rx_cnt =0; uint16_t tx_cnt =0; uint16_t rx_error_cnt; uint8_t vectRxBuffer[255]; uint16_t cRxData; uint16_t nPayloadLength = 12; int rssi_value; volatile SFlagStatus xTxDoneFlag = S_RESET; volatile SFlagStatus xRxDoneFlag = S_RESET; const uint8_t PN9_Tab2[256]={ 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1, 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4, 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC, 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53, 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59, 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D, 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A, 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0, 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1, 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4, 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC, 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53, 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59, 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D, 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A, 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0, 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1, 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4, 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC, 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53, 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59, 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D, 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A, 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0, 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1, 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4, 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC, 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53, 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59, 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D, 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A, 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0, }; static PAN312xRadioInit RadioInit = { 433920000, 0, 0, MOD_2FSK, 10000, 10000, 10000, POWER_LDO_0603, POWER_20dBm, }; static PAN312xCrcInit CrcInit = { CRC_MODE_16_BIT, 0x8005, 0xffff, CRC_BIT_ORDER_MSB_FIRST, CRC_BYTE_MSB_FIRST, CRC_RANGE_WHOLE_PAYLOAD, S_DISABLE,//S_ENABLE,//, }; static PAN321xPacketInit PacketInit = { 4, PREAMBLE_0101, 0, 4, 0x2dd42dd4, MANCHESTER_ZeroToTwo, S_DISABLE, MANCHESTER_ZeroToTwo, S_DISABLE, MANCHESTER_ZeroToTwo, S_DISABLE, FEC_HAMING_DISABLE, WHITENING_DISABLE, DATA_MODE_PACKET, }; typedef enum { TX_LED, RX_LED }TX_RX_LED; RF_States rf_statues = RF_STAND_BY; void board_led_toggle( TX_RX_LED led ) { if( led == TX_LED ) { Gpio_WriteOutputIO(LED_TX_PORT, LED_TX_PIN, FALSE); delay1ms(15); Gpio_WriteOutputIO(LED_TX_PORT, LED_TX_PIN, TRUE); } else { Gpio_WriteOutputIO(LED_RX_PORT, LED_RX_PIN, FALSE); delay1ms(15); Gpio_WriteOutputIO(LED_RX_PORT, LED_RX_PIN, TRUE); } } void GPIO_SLEEP_state(void) { Gpio_SetAnalogMode(RADIO_IRQ_PORT, RADIO_IRQ_PIN); Gpio_SetAnalogMode(RADIO_NSS_PORT, RADIO_NSS_PIN); Gpio_SetAnalogMode(RADIO_RST_POT, RADIO_RST_PIN); Gpio_SetAnalogMode(RADIO_BUSY_PORT, RADIO_BUSY_PIN); Gpio_SetAnalogMode(RADIO_MISO_PORT, RADIO_MISO_PIN); Gpio_SetAnalogMode(RADIO_MOSI_PORT, RADIO_MOSI_PIN); Gpio_SetAnalogMode(RADIO_SCK_PORT, RADIO_SCK_PIN); } void board_rf_pan3120_init(void) { PAN312x_DIO8_INTDISABLE(); PAN312x_Fsk_Init(); uint16_t fwid_buf; PAN312x_Get_FwId(&fwid_buf); PAN312x_RadioInit(&RadioInit); PAN312x_PktInit(&PacketInit); PAN312x_CrcInit(&CrcInit); DIO8_EnableInterrupt(); #if 0//cw test PAN312x_Enter_Carrier(433920000,POWER_21dBm); while(1); #endif #if 0 //sleep test PAN312x_Enter_Sleep(DEEP_SLEEP_MODE, WAKE_UP_STATE_READY); GPIO_SLEEP_state();//把所有与模块相接的IO口设置为模拟端口 delay1ms(3000);//RF休眠3S后重新进入工作状态 board_GpioInit(); board_spi_int(); PAN312x_DIO8_INTDISABLE(); PAN312x_Fsk_Init(); PAN312x_RadioInit(&RadioInit); PAN312x_PktInit(&PacketInit); PAN312x_CrcInit(&CrcInit); DIO8_EnableInterrupt(); #endif rf_statues = RF_START_RX; } void board_rf_pan3120_task(void) { switch( rf_statues ) { case RF_START_TX: PAN312x_Enter_Ready(); #ifdef CRC_ENABLE PAN312x_Set_TxPacket_Config(TxVariablePackedCrcEnable); #else PAN312x_Set_TxPacket_Config(TxVariablePackedCrcDisable); #endif PAN312x_GpioIrq_Config((PAN312xIrqList)(IRQ_MASK_TX_DONE), S_ENABLE); PAN312x_System_Ctrl(SYS_CTRL_AUTO_CLEAR_STATUS); PAN312x_Irq_Clear_AllStatus(); PAN312x_Write_Fifo((uint8_t *)PN9_Tab2, nPayloadLength); PAN312x_Enter_Tx(0, 0, nPayloadLength); rf_statues = RF_TX_RUNNING; break; case RF_TX_RUNNING: if(xTxDoneFlag) { xTxDoneFlag = S_RESET; board_led_toggle( TX_LED ); tx_cnt++; rf_statues = RF_START_RX; //delay1ms(1000); // rf_statues = RF_START_TX; } break; case RF_START_RX: PAN312x_Enter_Ready(); #if DCDC_ENABLE == 1 PAN312x_DCDC_Enable(); #endif #ifdef CRC_ENABLE if(CrcInit.CrcBitInv == S_DISABLE){ PAN312x_Set_RxPacket_Config(RxVariablePackedCrcEnable); }else if(CrcInit.CrcBitInv == S_ENABLE){ PAN312x_Set_RxPacket_Config(RxVariablePackedCrcBitInvCrcEnable); } #else PAN312x_Set_RxPacket_Config(RxVariablePackedCrcDisable); #endif PAN312x_GpioIrq_Config((PAN312xIrqList)(IRQ_MASK_RX_DONE | IRQ_MASK_RX_CRC_ERROR), S_ENABLE); PAN312x_System_Ctrl(SYS_CTRL_AUTO_CLEAR_STATUS); PAN312x_Set_RxTimeOut(400000); //400ms PAN312x_Set_RxTimeout_ExitState(STATE_RX); PAN312x_Set_RxInvalid_ExitState(STATE_RX); PAN312x_Set_RxValid_ExitState(STATE_RX); #ifdef RX_TIMEOUT_ENABLE PAN312x_Enter_Rx(0, START_COND_ENABLE_TIMEOUT, 0); #else PAN312x_Enter_Rx(0, 0, 0); #endif rf_statues = RF_RX_RUNNING; break; case RF_RX_RUNNING: if(xRxDoneFlag) { rssi_value = PAN312x_GetRSSI(); rx_cnt ++ ; cRxData = PAN312x_Get_Rx_Length(); PAN312x_Read_Fifo(vectRxBuffer, cRxData); PAN312x_Irq_Clear_RxDone_Status(); if(memcmp(vectRxBuffer, PN9_Tab2, cRxData) == 0) { board_led_toggle( RX_LED); printf("Rx Cnt = %d\r\n", rx_cnt); printf("Rssi Value = -%d\r\n", rssi_value); printf("Payload length = %d\r\n", nPayloadLength); /* print the received data */ printf("B data received: ["); for(uint8_t i = 0; i < nPayloadLength ; i++) printf("%02x ", vectRxBuffer[i]); printf("]\r\n"); memset(vectRxBuffer,0,sizeof(vectRxBuffer)); } xRxDoneFlag = S_RESET; #if isMaster rf_statues =RF_START_RX; #else //rf_statues = RF_START_ACK_TX; //rf_statues =RF_START_RX; #endif } break; case RF_STAND_BY: break; default:break; } } PAN312xIrqs xIrqStatus; void PortA_IRQHandler(void) { if(TRUE == Gpio_GetIrqStatus(RADIO_IRQ_PORT, RADIO_IRQ_PIN)) { if(DIO8_GetState() == TRUE) { PAN312x_Irq_Get_Status(&xIrqStatus); if(xIrqStatus.IRQ_STATUS0_F.IRQ_TX_DONE){ xTxDoneFlag = S_SET; } if(xIrqStatus.IRQ_STATUS0_F.IRQ_RX_DONE){ xRxDoneFlag = S_SET; } if(xIrqStatus.IRQ_STATUS0_F.IRQ_RX_CRC_ERROR){ PAN312x_Irq_Clear_RxCrcError_Status(); } } Gpio_ClearIrq(RADIO_IRQ_PORT, RADIO_IRQ_PIN); } }