u_rc.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #include "u_global.h"
  2. #include "u_rc.h"
  3. #include "t_gpio.h"
  4. #include "t_timer.h"
  5. #include "system.h"
  6. uint8_t g_ir_code[4] = {0x00};
  7. uint8_t g_ir_recv_done_flag = 0x00;
  8. #if (NEC_ENABLE==1)
  9. //选择 nec接收的gpio, 开使能
  10. void nec_receive_enable(GPIO_NUM gpio)
  11. {
  12. GPIO_SetGpioMultFunction(gpio,GPCFG_PULLUP);
  13. HWRITE(mem_nec_gpio,gpio);
  14. HWRITE(mem_nec_receive_enable,1);
  15. }
  16. #define NEC_CMD 0x01
  17. #define NEC_REPEAT_CMD 0x02
  18. void Bt_NecCallBack(uint8_t len,uint8_t *dataPtr)
  19. {
  20. switch(*dataPtr)
  21. {
  22. case NEC_CMD:
  23. for(int i=0;i<len-1;i++)
  24. {
  25. g_ir_code[i]=dataPtr[i+1];
  26. g_ir_recv_done_flag=1;
  27. MyPrintf("nec data[%d]=%x\r\n",i,dataPtr[i+1]);
  28. }
  29. break;
  30. case NEC_REPEAT_CMD:
  31. MyPrintf("\r\n*************NEC_REPEAT_CMD****************\r\n");
  32. break;
  33. default:
  34. break;
  35. }
  36. }
  37. #endif
  38. void rc_init(void)
  39. {
  40. #if (NEC_ENABLE==1)
  41. nec_receive_enable(NEC_GPIO);
  42. #endif
  43. }
  44. uint8_t *rc_decode(void)
  45. {
  46. return (g_ir_code);
  47. }
  48. #if 0 //bk3431
  49. #include "t_icu.h"
  50. #include "driver_gpio.h"
  51. #include "bk3231s_reg.h"
  52. uint8_t g_ir_code[4] = {0x00};
  53. uint8_t g_ir_recv_done_flag = 0x00;
  54. typedef struct _rc_para
  55. {
  56. uint8_t shake_flag;
  57. uint8_t decode_cnt;
  58. uint8_t capture_flow;
  59. uint8_t sample_data[40];
  60. volatile uint16_t time_count;
  61. }RcPara_t;
  62. RcPara_t rc_para = {0x00};
  63. void rc_timer0_cb(void)
  64. {
  65. rc_para.time_count++;
  66. GPIO_output(0, 4, 0);
  67. GPIO_output(0, 4, 1);
  68. }
  69. void rc_timer1_cb(void)
  70. {
  71. rc_para.shake_flag = 0;
  72. }
  73. void rc_recv_clear(void)
  74. {
  75. //Timer_Stop(0);
  76. rc_para.capture_flow = RC_CAPTURE_IDLE;
  77. rc_para.decode_cnt = 0;
  78. rc_para.time_count = 0;
  79. GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, GPIO_MODE_GPIO, GPIO_IO_IN, GPIO_PULL_UP);
  80. GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, EN, GPIO_INTERRUPT_EDGE_DOWN); //中断触发,中断使能
  81. //memset(&rc_para, 0, sizeof(RcPara_t));
  82. }
  83. void u_gpio_int_handle(void)
  84. {
  85. if (rc_para.shake_flag == 0)
  86. {
  87. GPIO_output(0, 6, 1);
  88. GPIO_output(0, 6, 0);
  89. rc_para.shake_flag = 1;
  90. Timer_Start(1, 130);
  91. if(GpioGetIn(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F))
  92. {
  93. switch (rc_para.capture_flow)
  94. {
  95. case RC_CAPTURE_START_LOW:
  96. {
  97. //rc_para.capture_flow = RC_CAPTURE_START_HIGH;
  98. //U_UART_PRINTF("H_%d\n", rc_para.time_count);
  99. if (rc_para.time_count >= 30 && rc_para.time_count <= 42)//36
  100. {
  101. GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, GPIO_MODE_GPIO, GPIO_IO_IN, GPIO_PULL_UP);
  102. GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, EN, GPIO_INTERRUPT_EDGE_DOWN); //中断触发,中断使能
  103. rc_para.time_count = 0;
  104. rc_para.capture_flow = RC_CAPTURE_START_HIGH;
  105. }
  106. else
  107. {
  108. rc_recv_clear();
  109. //U_UART_PRINTF("cr_4\n");
  110. }
  111. }
  112. break;
  113. }
  114. //U_UART_PRINTF("fw_%d\n", rc_para.capture_flow);
  115. }
  116. else //gpio_low
  117. //if(!GpioGetIn(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F))
  118. {
  119. switch (rc_para.capture_flow)
  120. {
  121. case RC_CAPTURE_IDLE:
  122. {
  123. GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, GPIO_MODE_GPIO, GPIO_IO_IN, GPIO_PULL_UP);
  124. GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, EN, GPIO_INTERRUPT_EDGE_UP); //中断触发,中断使能
  125. rc_para.capture_flow = RC_CAPTURE_START_LOW;
  126. rc_para.time_count = 0;
  127. //U_UART_PRINTF("st\n");
  128. Timer_Start(0, 280);
  129. }
  130. break;
  131. case RC_CAPTURE_START_HIGH:
  132. {
  133. //U_UART_PRINTF("L_%d\n", rc_para.time_count);
  134. if (rc_para.time_count >= 13 && rc_para.time_count <= 23) //18
  135. {
  136. // GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, GPIO_MODE_GPIO, GPIO_IO_IN, GPIO_PULL_UP);
  137. // GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, EN, GPIO_INTERRUPT_EDGE_DOWN); //中断触发,中断使能
  138. rc_para.time_count = 0;
  139. rc_para.decode_cnt = 0;
  140. rc_para.capture_flow = RC_CAPTURE_STATE_CODE;
  141. }
  142. else
  143. {
  144. rc_recv_clear();
  145. //U_UART_PRINTF("cr_1\n");
  146. }
  147. }
  148. break;
  149. case RC_CAPTURE_STATE_CODE:
  150. {
  151. //U_UART_PRINTF("%d\n", rc_para.time_count);
  152. if (rc_para.time_count >= 2 && rc_para.time_count <= 11)
  153. {
  154. rc_para.sample_data[rc_para.decode_cnt] = rc_para.time_count; //12
  155. rc_para.decode_cnt++;
  156. rc_para.time_count = 0;
  157. if (rc_para.decode_cnt >= 32)
  158. {
  159. rc_recv_clear();
  160. //U_UART_PRINTF("cr_2\n");
  161. g_ir_recv_done_flag = 1;
  162. }
  163. }
  164. else
  165. {
  166. rc_recv_clear();
  167. //U_UART_PRINTF("cr_3\n");
  168. }
  169. }
  170. break;
  171. default:
  172. break;
  173. }
  174. }
  175. }
  176. }
  177. uint8_t *rc_decode(void)
  178. {
  179. uint8_t rc_code = 0, k = 0, i = 0;
  180. for(i = 0; i < 4; i++)
  181. {
  182. rc_code = 0;
  183. for (k = 0; k < 8; k++)
  184. {
  185. rc_code <<= 1;
  186. if (rc_para.sample_data[i * 8 + k] > RC_CODE_HIGH_PVT)
  187. {
  188. rc_code |= 0x01;
  189. }
  190. //U_UART_PRINTF(" %d", rc_para.sample_data[i * 8 + k]);
  191. g_ir_code[i] = rc_code;
  192. }
  193. //U_UART_PRINTF("\n");
  194. }
  195. U_UART_PRINTF("rc = %02X, %02X, %02X, %02X\n", g_ir_code[0], g_ir_code[1], g_ir_code[2], g_ir_code[3]);
  196. memset(rc_para.sample_data, 0, 40);
  197. return (g_ir_code);
  198. }
  199. void rc_init(void)
  200. {
  201. GPIO_config(0, 4, 1);
  202. GPIO_output(0, 4, 0);
  203. GPIO_config(0, 6, 1);
  204. GPIO_output(0, 6, 0);
  205. memset(&rc_para, 0, sizeof(RcPara_t));
  206. IcuPphCfg( ICU_PPH_GPIO,
  207. ICU_MCU_CLK_SRC_APH,
  208. ICU_CLK_SRC_FREQ_DPLL_96M,
  209. ICU_CLK_PRE_DIV_NONE,
  210. ICU_CLK_EN,
  211. EN,
  212. EN,
  213. DISEN);
  214. GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, GPIO_MODE_GPIO, GPIO_IO_IN, GPIO_PULL_UP);
  215. GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F, EN, GPIO_INTERRUPT_EDGE_DOWN); //中断触发,中断使能
  216. REG_AHB0_FIQ_PRIORITY_EN |= INT_STATUS_GPIO;
  217. Timer_Start(0, 280);
  218. //GpioIntHandleCbCfg((GPIO_INT_HANDLE_CB_PFN)&ir_callback);
  219. }
  220. #endif