rf_app.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. #include "bsp.h"
  2. #include "board_gpio.h"
  3. #include "board_spi.h"
  4. #include "timer3.h"
  5. #define isMaster 0
  6. #define CRC_ENABLE
  7. uint16_t rx_cnt =0;
  8. uint16_t tx_cnt =0;
  9. uint16_t rx_error_cnt;
  10. uint8_t vectRxBuffer[255];
  11. uint16_t cRxData;
  12. uint16_t nPayloadLength = 12;
  13. int rssi_value;
  14. volatile SFlagStatus xTxDoneFlag = S_RESET;
  15. volatile SFlagStatus xRxDoneFlag = S_RESET;
  16. const uint8_t PN9_Tab2[256]={
  17. 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1,
  18. 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4,
  19. 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC,
  20. 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53,
  21. 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59,
  22. 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D,
  23. 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A,
  24. 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0,
  25. 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1,
  26. 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4,
  27. 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC,
  28. 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53,
  29. 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59,
  30. 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D,
  31. 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A,
  32. 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0,
  33. 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1,
  34. 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4,
  35. 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC,
  36. 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53,
  37. 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59,
  38. 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D,
  39. 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A,
  40. 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0,
  41. 0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1,
  42. 0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4,
  43. 0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC,
  44. 0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53,
  45. 0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59,
  46. 0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D,
  47. 0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A,
  48. 0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0,
  49. };
  50. static PAN312xRadioInit RadioInit = {
  51. .FrequencyBase = 433920000,
  52. .FrequencyStep = 0,
  53. .FrequencyChannelNumber = 0,
  54. .ModulationSelect = MOD_2FSK,
  55. .DataRate = 10000,
  56. .TxDeviation = 10000,
  57. .RxDeviation = 10000,
  58. .PowerSelect = POWER_LDO_0603, //POWER_LDO_0603,
  59. .Power = POWER_20dBm, //LDO模式,功率最大20dBm
  60. };
  61. static PAN312xCrcInit CrcInit = {
  62. .CrcMode = CRC_MODE_16_BIT,
  63. .CrcPolynomial = 0x8005,
  64. .CrcSeed = 0xffff,
  65. .CrcBitOrder = CRC_BIT_ORDER_MSB_FIRST,
  66. .CrcByteSwap = CRC_BYTE_MSB_FIRST,
  67. .CrcRange = CRC_RANGE_WHOLE_PAYLOAD,
  68. .CrcBitInv = S_DISABLE,
  69. .CrcState = S_ENABLE,
  70. };
  71. static PAN312xPacketInit PacketInit = {
  72. .PacketType = VARIABLE_PACKET_TYPE,
  73. .PreambleLength = 8,
  74. .PreambleSeclect = PREAMBLE_0101,
  75. .NonStandardPreamblePattern = 0,
  76. .SyncwordLength = 4,
  77. .SyncwordPattern = 0x2dd42dd4,
  78. .PreambleManchesterMode = MANCHESTER_ZeroToTwo,
  79. .PreambleManchester = S_DISABLE,
  80. .SyncwordManchesterMode = MANCHESTER_ZeroToTwo,
  81. .SyncwordManchester = S_DISABLE,
  82. .PayloadManchesterMode = MANCHESTER_ZeroToTwo,
  83. .PayloadManchester = S_DISABLE,
  84. .FecEncoding = FEC_HAMING_DISABLE,
  85. .WhiteningPattern = WHITENING_DISABLE,
  86. .DataMode = DATA_MODE_PACKET,
  87. .PayloadBitOrder = PAYLOAD_BIT_ORDER_MSB_FIRST,
  88. };
  89. typedef enum
  90. {
  91. TX_LED,
  92. RX_LED
  93. }TX_RX_LED;
  94. RF_States rf_statues = RF_STAND_BY;
  95. void board_led_toggle( TX_RX_LED led )
  96. {
  97. if( led == TX_LED )
  98. {
  99. Gpio_WriteOutputIO(LED_TX_PORT, LED_TX_PIN, FALSE);
  100. delay1ms(15);
  101. Gpio_WriteOutputIO(LED_TX_PORT, LED_TX_PIN, TRUE);
  102. }
  103. else
  104. {
  105. Gpio_WriteOutputIO(LED_RX_PORT, LED_RX_PIN, FALSE);
  106. delay1ms(15);
  107. Gpio_WriteOutputIO(LED_RX_PORT, LED_RX_PIN, TRUE);
  108. }
  109. }
  110. void GPIO_SLEEP_state(void)
  111. {
  112. Gpio_SetAnalogMode(RADIO_IRQ_PORT, RADIO_IRQ_PIN);
  113. Gpio_SetAnalogMode(RADIO_NSS_PORT, RADIO_NSS_PIN);
  114. Gpio_SetAnalogMode(RADIO_RST_POT, RADIO_RST_PIN);
  115. Gpio_SetAnalogMode(RADIO_BUSY_PORT, RADIO_BUSY_PIN);
  116. Gpio_SetAnalogMode(RADIO_MISO_PORT, RADIO_MISO_PIN);
  117. Gpio_SetAnalogMode(RADIO_MOSI_PORT, RADIO_MOSI_PIN);
  118. Gpio_SetAnalogMode(RADIO_SCK_PORT, RADIO_SCK_PIN);
  119. }
  120. void board_rf_pan3120_init(void)
  121. {
  122. PAN312x_DIO8_INTDISABLE();
  123. PAN312x_Fsk_Init();
  124. uint16_t fwid_buf;
  125. PAN312x_Get_FwId(&fwid_buf);
  126. PAN312x_RadioInit(&RadioInit);
  127. PAN312x_PktInit(&PacketInit);
  128. PAN312x_CrcInit(&CrcInit);
  129. DIO8_EnableInterrupt();
  130. #if 0//cw test
  131. PAN312x_Enter_Carrier(433920000,POWER_21dBm);
  132. while(1);
  133. #endif
  134. #if 0 //sleep test
  135. PAN312x_Enter_Sleep(DEEP_SLEEP_MODE, WAKE_UP_STATE_READY);
  136. GPIO_SLEEP_state();//把所有与模块相接的IO口设置为模拟端口
  137. delay1ms(3000);//RF休眠3S后重新进入工作状态
  138. board_GpioInit();
  139. board_spi_int();
  140. PAN312x_DIO8_INTDISABLE();
  141. PAN312x_Fsk_Init();
  142. PAN312x_RadioInit(&RadioInit);
  143. PAN312x_PktInit(&PacketInit);
  144. PAN312x_CrcInit(&CrcInit);
  145. DIO8_EnableInterrupt();
  146. #endif
  147. rf_statues = RF_START_RX;
  148. }
  149. void board_rf_pan3120_task(void)
  150. {
  151. switch( rf_statues )
  152. {
  153. case RF_START_TX:
  154. PAN312x_Enter_Ready();
  155. #ifdef CRC_ENABLE
  156. PAN312x_Set_TxPacket_Config(TxVariablePackedCrcEnable);
  157. #else
  158. PAN312x_Set_TxPacket_Config(TxVariablePackedCrcDisable);
  159. #endif
  160. PAN312x_GpioIrq_Config((PAN312xIrqList)(IRQ_MASK_TX_DONE), S_ENABLE);
  161. PAN312x_System_Ctrl(SYS_CTRL_AUTO_CLEAR_STATUS);
  162. PAN312x_Irq_Clear_AllStatus();
  163. PAN312x_Write_Fifo((uint8_t *)PN9_Tab2, nPayloadLength);
  164. PAN312x_Enter_Tx(0, 0, nPayloadLength);
  165. rf_statues = RF_TX_RUNNING;
  166. break;
  167. case RF_TX_RUNNING:
  168. if(xTxDoneFlag)
  169. {
  170. xTxDoneFlag = S_RESET;
  171. board_led_toggle( TX_LED );
  172. tx_cnt++;
  173. rf_statues = RF_START_RX;
  174. //delay1ms(1000);
  175. // rf_statues = RF_START_TX;
  176. }
  177. break;
  178. case RF_START_RX:
  179. PAN312x_Enter_Ready();
  180. #if DCDC_ENABLE == 1
  181. PAN312x_DCDC_Enable();
  182. #endif
  183. #ifdef CRC_ENABLE
  184. if(CrcInit.CrcBitInv == S_DISABLE){
  185. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcEnable);
  186. }else if(CrcInit.CrcBitInv == S_ENABLE){
  187. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcBitInvCrcEnable);
  188. }
  189. #else
  190. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcDisable);
  191. #endif
  192. PAN312x_GpioIrq_Config((PAN312xIrqList)(IRQ_MASK_RX_DONE | IRQ_MASK_RX_CRC_ERROR), S_ENABLE);
  193. PAN312x_System_Ctrl(SYS_CTRL_AUTO_CLEAR_STATUS);
  194. PAN312x_Set_RxTimeOut(400000); //400ms
  195. PAN312x_Set_RxTimeout_ExitState(STATE_RX);
  196. PAN312x_Set_RxInvalid_ExitState(STATE_RX);
  197. PAN312x_Set_RxValid_ExitState(STATE_RX);
  198. #ifdef RX_TIMEOUT_ENABLE
  199. PAN312x_Enter_Rx(0, START_COND_ENABLE_TIMEOUT, 0);
  200. #else
  201. PAN312x_Enter_Rx(0, 0, 0);
  202. #endif
  203. rf_statues = RF_RX_RUNNING;
  204. break;
  205. case RF_RX_RUNNING:
  206. if(xRxDoneFlag)
  207. {
  208. rssi_value = PAN312x_GetRSSI();
  209. rx_cnt ++ ;
  210. cRxData = PAN312x_Get_Rx_Length();
  211. PAN312x_Read_Fifo(vectRxBuffer, cRxData);
  212. PAN312x_Irq_Clear_RxDone_Status();
  213. if(memcmp(vectRxBuffer, PN9_Tab2, cRxData) == 0)
  214. {
  215. board_led_toggle( RX_LED);
  216. printf("Rx Cnt = %d\r\n", rx_cnt);
  217. printf("Rssi Value = -%d\r\n", rssi_value);
  218. printf("Payload length = %d\r\n", nPayloadLength);
  219. /* print the received data */
  220. printf("B data received: [");
  221. for(uint8_t i = 0; i < nPayloadLength ; i++)
  222. printf("%02x ", vectRxBuffer[i]);
  223. printf("]\r\n");
  224. memset(vectRxBuffer,0,sizeof(vectRxBuffer));
  225. }
  226. xRxDoneFlag = S_RESET;
  227. #if isMaster
  228. rf_statues =RF_START_RX;
  229. #else
  230. //rf_statues = RF_START_ACK_TX;
  231. //rf_statues =RF_START_RX;
  232. #endif
  233. }
  234. break;
  235. case RF_STAND_BY: break;
  236. default:break;
  237. }
  238. }
  239. PAN312xIrqs xIrqStatus;
  240. void PortA_IRQHandler(void)
  241. {
  242. if(TRUE == Gpio_GetIrqStatus(RADIO_IRQ_PORT, RADIO_IRQ_PIN))
  243. {
  244. if(DIO8_GetState() == TRUE)
  245. {
  246. PAN312x_Irq_Get_Status(&xIrqStatus);
  247. if(xIrqStatus.IRQ_STATUS0_F.IRQ_TX_DONE){
  248. xTxDoneFlag = S_SET;
  249. }
  250. if(xIrqStatus.IRQ_STATUS0_F.IRQ_RX_DONE){
  251. xRxDoneFlag = S_SET;
  252. }
  253. if(xIrqStatus.IRQ_STATUS0_F.IRQ_RX_CRC_ERROR){
  254. PAN312x_Irq_Clear_RxCrcError_Status();
  255. }
  256. }
  257. Gpio_ClearIrq(RADIO_IRQ_PORT, RADIO_IRQ_PIN);
  258. }
  259. }