uart_transfer.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "include.h"
  2. #include "driver_gpio.h"
  3. #include "driver_uart.h"
  4. #include "uart_transfer.h"
  5. #if TRACE_EN
  6. #define TRACE(...) my_printf("[WIRELESS] ");\
  7. my_printf(__VA_ARGS__)
  8. #define TRACE_R(...) my_print_r(__VA_ARGS__);
  9. #else
  10. #define TRACE(...)
  11. #define TRACE_R(...)
  12. #endif // TRACE_EN
  13. #define UART_TX_PORT GPIOA_REG
  14. #define UART_TX_PIN GPIO_PIN_5
  15. #define UART_RX_PORT GPIOA_REG
  16. #define UART_RX_PIN GPIO_PIN_6
  17. #define USB_EP1_COOR_SIZE (PACKAGE_POINT_SIZE *(MAX_POINT/PACKAGE_POINT_NUM))
  18. uart_transfer_cb_typedef uart_rx = {
  19. .done = 0,
  20. .len = 0,
  21. .backlen = 0,
  22. .timeout = 50, //ms
  23. };
  24. u8 u8ReceiveDataStep = 0;
  25. AT(.com_text.isr)
  26. void uart_isr(void)
  27. {
  28. if (uart_get_flag(UART, UART_IT_RX) != RESET) {
  29. uart_rx.tick = tick_get();
  30. if (uart_rx.len < sizeof(uart_rx.buf))
  31. {
  32. switch (u8ReceiveDataStep)
  33. {
  34. case 0:
  35. if (uart_receive_data(UART) == 0x55)
  36. {
  37. uart_rx.buf[uart_rx.len++] = uart_receive_data(UART);
  38. u8ReceiveDataStep = 1;
  39. }
  40. else
  41. {
  42. uart_rx.len = 0;
  43. u8ReceiveDataStep = 0;
  44. }
  45. break;
  46. case 1:
  47. if (uart_receive_data(UART) == 0x54)
  48. {
  49. uart_rx.buf[uart_rx.len++] = uart_receive_data(UART);
  50. u8ReceiveDataStep = 2;
  51. }
  52. else
  53. {
  54. uart_rx.len = 0;
  55. u8ReceiveDataStep = 0;
  56. }
  57. break;
  58. /*
  59. case 2:
  60. if ((uart_receive_data(UART) & 0x80) == 0x80)
  61. {
  62. uart_rx.buf[uart_rx.len++] = uart_receive_data(UART);
  63. u8ReceiveDataStep = 3;
  64. }
  65. else
  66. {
  67. uart_rx.len = 0;
  68. u8ReceiveDataStep = 0;
  69. }
  70. break;
  71. */
  72. default:
  73. uart_rx.buf[uart_rx.len++] = uart_receive_data(UART);
  74. break;
  75. }
  76. }
  77. uart_clear_flag(UART, UART_IT_RX);
  78. }
  79. }
  80. void uart_transfer_init(u32 baud)
  81. {
  82. if (bTransmitEn == TRUE) //transmit
  83. {
  84. return;
  85. }
  86. uart_init_typedef uart_init_struct;
  87. gpio_init_typedef gpio_init_structure;
  88. clk_gate0_cmd(CLK_GATE0_UART, CLK_EN);
  89. //clk_udet_clk_set(XOSC24M_CLK); //udet 必须调用
  90. // RX
  91. gpio_init_structure.gpio_pin = UART_RX_PIN;
  92. gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
  93. gpio_init_structure.gpio_fen = GPIO_FEN_PER;
  94. gpio_init_structure.gpio_fdir = GPIO_FDIR_SELF;
  95. gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
  96. gpio_init_structure.gpio_pupd = GPIO_PUPD_PU10K;
  97. gpio_init(UART_RX_PORT, &gpio_init_structure);
  98. // TX
  99. gpio_init_structure.gpio_pin = UART_TX_PIN;
  100. gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
  101. gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
  102. gpio_init(UART_TX_PORT, &gpio_init_structure);
  103. gpio_func_mapping_config(UART_RX_PORT, UART_RX_PIN, GPIO_CROSSBAR_IN_UARTRX);
  104. gpio_func_mapping_config(UART_TX_PORT, UART_TX_PIN, GPIO_CROSSBAR_OUT_UARTTX);
  105. uart_init_struct.baud = baud;
  106. uart_init_struct.mode = UART_SEND_RECV_MODE;
  107. uart_init_struct.word_len = UART_WORD_LENGTH_8b;
  108. uart_init_struct.stop_bits = UART_STOP_BIT_1BIT;
  109. uart_init_struct.one_line_enable = UART_SEPARATE;
  110. /* Only UART Valid */
  111. uart_init_struct.baud_fix = UART_BAUD_FIX;
  112. /* Only UART Valid */
  113. uart_init_struct.clock_source = UART_INC_CLOCK;
  114. uart_init(UART, &uart_init_struct);
  115. uart_pic_config(UART, uart_isr, 0, UART_IT_RX, ENABLE);
  116. uart_cmd(UART, ENABLE);
  117. //PRINT("uart_transfer_init\n");
  118. }
  119. void uart_transfer_data()
  120. {
  121. //if (((tick_get() - uart_rx.tick) >= uart_rx.timeout) && uart_rx.len)
  122. if ((USB_EP1_COOR_SIZE + 10) == uart_rx.len)
  123. {
  124. //uart_rx.done = 1;
  125. while (uart_rx.backlen < 10) {
  126. uart_rx.bufback[uart_rx.backlen] = uart_rx.buf[USB_EP1_COOR_SIZE + uart_rx.backlen];
  127. uart_rx.backlen++;
  128. }
  129. uart_rx.len = 0;
  130. u8ReceiveDataStep = 0;
  131. u8 *p = uart_rx.bufback;
  132. while (uart_rx.backlen) {
  133. uart_send_data(UART, *p++);
  134. while (uart_get_flag(UART, UART_IT_TX) != SET);
  135. uart_rx.backlen --;
  136. }
  137. }
  138. }
  139. void uart_to_wireless_transfer_data()
  140. {
  141. if (10 == uart_rx.len)
  142. {
  143. while (uart_rx.backlen < 10) {
  144. uart_rx.bufback[uart_rx.backlen] = uart_rx.buf[uart_rx.backlen];
  145. uart_rx.backlen++;
  146. }
  147. uart_rx.len = 0;
  148. u8ReceiveDataStep = 0;
  149. uart_rx.backlen = 0;
  150. wireless_send_test(10, (u8 *)uart_rx.bufback);
  151. }
  152. }