rf_app.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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. 433920000,
  52. 0,
  53. 0,
  54. MOD_2FSK,
  55. 10000,
  56. 10000,
  57. 10000,
  58. POWER_LDO_0603,
  59. POWER_20dBm,
  60. };
  61. static PAN312xCrcInit CrcInit = {
  62. CRC_MODE_16_BIT,
  63. 0x8005,
  64. 0xffff,
  65. CRC_BIT_ORDER_MSB_FIRST,
  66. CRC_BYTE_MSB_FIRST,
  67. CRC_RANGE_WHOLE_PAYLOAD,
  68. S_DISABLE,//S_ENABLE,//,
  69. };
  70. static PAN321xPacketInit PacketInit = {
  71. 4,
  72. PREAMBLE_0101,
  73. 0,
  74. 4,
  75. 0x2dd42dd4,
  76. MANCHESTER_ZeroToTwo,
  77. S_DISABLE,
  78. MANCHESTER_ZeroToTwo,
  79. S_DISABLE,
  80. MANCHESTER_ZeroToTwo,
  81. S_DISABLE,
  82. FEC_HAMING_DISABLE,
  83. WHITENING_DISABLE,
  84. DATA_MODE_PACKET,
  85. };
  86. typedef enum
  87. {
  88. TX_LED,
  89. RX_LED
  90. }TX_RX_LED;
  91. RF_States rf_statues = RF_STAND_BY;
  92. void board_led_toggle( TX_RX_LED led )
  93. {
  94. if( led == TX_LED )
  95. {
  96. Gpio_WriteOutputIO(LED_TX_PORT, LED_TX_PIN, FALSE);
  97. delay1ms(15);
  98. Gpio_WriteOutputIO(LED_TX_PORT, LED_TX_PIN, TRUE);
  99. }
  100. else
  101. {
  102. Gpio_WriteOutputIO(LED_RX_PORT, LED_RX_PIN, FALSE);
  103. delay1ms(15);
  104. Gpio_WriteOutputIO(LED_RX_PORT, LED_RX_PIN, TRUE);
  105. }
  106. }
  107. void GPIO_SLEEP_state(void)
  108. {
  109. Gpio_SetAnalogMode(RADIO_IRQ_PORT, RADIO_IRQ_PIN);
  110. Gpio_SetAnalogMode(RADIO_NSS_PORT, RADIO_NSS_PIN);
  111. Gpio_SetAnalogMode(RADIO_RST_POT, RADIO_RST_PIN);
  112. Gpio_SetAnalogMode(RADIO_BUSY_PORT, RADIO_BUSY_PIN);
  113. Gpio_SetAnalogMode(RADIO_MISO_PORT, RADIO_MISO_PIN);
  114. Gpio_SetAnalogMode(RADIO_MOSI_PORT, RADIO_MOSI_PIN);
  115. Gpio_SetAnalogMode(RADIO_SCK_PORT, RADIO_SCK_PIN);
  116. }
  117. void board_rf_pan3120_init(void)
  118. {
  119. PAN312x_DIO8_INTDISABLE();
  120. PAN312x_Fsk_Init();
  121. uint16_t fwid_buf;
  122. PAN312x_Get_FwId(&fwid_buf);
  123. PAN312x_RadioInit(&RadioInit);
  124. PAN312x_PktInit(&PacketInit);
  125. PAN312x_CrcInit(&CrcInit);
  126. DIO8_EnableInterrupt();
  127. #if 0//cw test
  128. PAN312x_Enter_Carrier(433920000,POWER_21dBm);
  129. while(1);
  130. #endif
  131. #if 0 //sleep test
  132. PAN312x_Enter_Sleep(DEEP_SLEEP_MODE, WAKE_UP_STATE_READY);
  133. GPIO_SLEEP_state();//把所有与模块相接的IO口设置为模拟端口
  134. delay1ms(3000);//RF休眠3S后重新进入工作状态
  135. board_GpioInit();
  136. board_spi_int();
  137. PAN312x_DIO8_INTDISABLE();
  138. PAN312x_Fsk_Init();
  139. PAN312x_RadioInit(&RadioInit);
  140. PAN312x_PktInit(&PacketInit);
  141. PAN312x_CrcInit(&CrcInit);
  142. DIO8_EnableInterrupt();
  143. #endif
  144. rf_statues = RF_START_RX;
  145. }
  146. void board_rf_pan3120_task(void)
  147. {
  148. switch( rf_statues )
  149. {
  150. case RF_START_TX:
  151. PAN312x_Enter_Ready();
  152. #ifdef CRC_ENABLE
  153. PAN312x_Set_TxPacket_Config(TxVariablePackedCrcEnable);
  154. #else
  155. PAN312x_Set_TxPacket_Config(TxVariablePackedCrcDisable);
  156. #endif
  157. PAN312x_GpioIrq_Config((PAN312xIrqList)(IRQ_MASK_TX_DONE), S_ENABLE);
  158. PAN312x_System_Ctrl(SYS_CTRL_AUTO_CLEAR_STATUS);
  159. PAN312x_Irq_Clear_AllStatus();
  160. PAN312x_Write_Fifo((uint8_t *)PN9_Tab2, nPayloadLength);
  161. PAN312x_Enter_Tx(0, 0, nPayloadLength);
  162. rf_statues = RF_TX_RUNNING;
  163. break;
  164. case RF_TX_RUNNING:
  165. if(xTxDoneFlag)
  166. {
  167. xTxDoneFlag = S_RESET;
  168. board_led_toggle( TX_LED );
  169. tx_cnt++;
  170. rf_statues = RF_START_RX;
  171. //delay1ms(1000);
  172. // rf_statues = RF_START_TX;
  173. }
  174. break;
  175. case RF_START_RX:
  176. PAN312x_Enter_Ready();
  177. #if DCDC_ENABLE == 1
  178. PAN312x_DCDC_Enable();
  179. #endif
  180. #ifdef CRC_ENABLE
  181. if(CrcInit.CrcBitInv == S_DISABLE){
  182. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcEnable);
  183. }else if(CrcInit.CrcBitInv == S_ENABLE){
  184. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcBitInvCrcEnable);
  185. }
  186. #else
  187. PAN312x_Set_RxPacket_Config(RxVariablePackedCrcDisable);
  188. #endif
  189. PAN312x_GpioIrq_Config((PAN312xIrqList)(IRQ_MASK_RX_DONE | IRQ_MASK_RX_CRC_ERROR), S_ENABLE);
  190. PAN312x_System_Ctrl(SYS_CTRL_AUTO_CLEAR_STATUS);
  191. PAN312x_Set_RxTimeOut(400000); //400ms
  192. PAN312x_Set_RxTimeout_ExitState(STATE_RX);
  193. PAN312x_Set_RxInvalid_ExitState(STATE_RX);
  194. PAN312x_Set_RxValid_ExitState(STATE_RX);
  195. #ifdef RX_TIMEOUT_ENABLE
  196. PAN312x_Enter_Rx(0, START_COND_ENABLE_TIMEOUT, 0);
  197. #else
  198. PAN312x_Enter_Rx(0, 0, 0);
  199. #endif
  200. rf_statues = RF_RX_RUNNING;
  201. break;
  202. case RF_RX_RUNNING:
  203. if(xRxDoneFlag)
  204. {
  205. rssi_value = PAN312x_GetRSSI();
  206. rx_cnt ++ ;
  207. cRxData = PAN312x_Get_Rx_Length();
  208. PAN312x_Read_Fifo(vectRxBuffer, cRxData);
  209. PAN312x_Irq_Clear_RxDone_Status();
  210. if(memcmp(vectRxBuffer, PN9_Tab2, cRxData) == 0)
  211. {
  212. board_led_toggle( RX_LED);
  213. printf("Rx Cnt = %d\r\n", rx_cnt);
  214. printf("Rssi Value = -%d\r\n", rssi_value);
  215. printf("Payload length = %d\r\n", nPayloadLength);
  216. /* print the received data */
  217. printf("B data received: [");
  218. for(uint8_t i = 0; i < nPayloadLength ; i++)
  219. printf("%02x ", vectRxBuffer[i]);
  220. printf("]\r\n");
  221. memset(vectRxBuffer,0,sizeof(vectRxBuffer));
  222. }
  223. xRxDoneFlag = S_RESET;
  224. #if isMaster
  225. rf_statues =RF_START_RX;
  226. #else
  227. //rf_statues = RF_START_ACK_TX;
  228. //rf_statues =RF_START_RX;
  229. #endif
  230. }
  231. break;
  232. case RF_STAND_BY: break;
  233. default:break;
  234. }
  235. }
  236. PAN312xIrqs xIrqStatus;
  237. void PortA_IRQHandler(void)
  238. {
  239. if(TRUE == Gpio_GetIrqStatus(RADIO_IRQ_PORT, RADIO_IRQ_PIN))
  240. {
  241. if(DIO8_GetState() == TRUE)
  242. {
  243. PAN312x_Irq_Get_Status(&xIrqStatus);
  244. if(xIrqStatus.IRQ_STATUS0_F.IRQ_TX_DONE){
  245. xTxDoneFlag = S_SET;
  246. }
  247. if(xIrqStatus.IRQ_STATUS0_F.IRQ_RX_DONE){
  248. xRxDoneFlag = S_SET;
  249. }
  250. if(xIrqStatus.IRQ_STATUS0_F.IRQ_RX_CRC_ERROR){
  251. PAN312x_Irq_Clear_RxCrcError_Status();
  252. }
  253. }
  254. Gpio_ClearIrq(RADIO_IRQ_PORT, RADIO_IRQ_PIN);
  255. }
  256. }