luat_uart.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #ifndef LUAT_UART_H
  2. #define LUAT_UART_H
  3. #include "luat_base.h"
  4. #include "luat_uart_legacy.h"
  5. /**
  6. *@version V1.0
  7. *@attention
  8. *上报接收数据中断的逻辑:
  9. * 1.串口初始化时,新建一个缓冲区
  10. * 2.可以考虑多为用户申请几百字节的缓冲长度,用户处理时防止丢包
  11. * 3.每次串口收到数据时,先存入缓冲区,记录长度
  12. * 4.遇到以下情况时,再调用串口中断
  13. a)缓冲区满(帮用户多申请的的情况)/缓冲区只剩几百字节(按实际长度申请缓冲区的情况)
  14. b)收到fifo接收超时中断(此时串口数据应该是没有继续收了)
  15. * 5.触发收到数据中断时,返回的数据应是缓冲区的数据
  16. * 6.关闭串口时,释放缓冲区资源
  17. */
  18. /**
  19. * @ingroup luatos_device 外设接口
  20. * @{
  21. */
  22. /**
  23. * @defgroup luatos_device_uart UART接口
  24. * @{
  25. */
  26. /**
  27. * @brief 校验位
  28. */
  29. #define LUAT_PARITY_NONE 0 /**< 无校验 */
  30. #define LUAT_PARITY_ODD 1 /**< 奇校验 */
  31. #define LUAT_PARITY_EVEN 2 /**< 偶校验 */
  32. /**
  33. * @brief 高低位顺序
  34. */
  35. #define LUAT_BIT_ORDER_LSB 0 /**< 低位有效 */
  36. #define LUAT_BIT_ORDER_MSB 1 /**< 高位有效 */
  37. /**
  38. * @brief 停止位
  39. */
  40. #define LUAT_0_5_STOP_BITS 0xf0 /**< 0.5 */
  41. #define LUAT_1_5_STOP_BITS 0xf1 /**< 1.5 */
  42. #define LUAT_VUART_ID_0 0x20
  43. #define LUAT_VUART_ID_1 0x21
  44. #define LUAT_VUART_ID_2 0x22
  45. #define LUAT_UART_RX_ERROR_DROP_DATA (0xD6)
  46. #define LUAT_UART_DEBUG_ENABLE (0x3E)
  47. /**
  48. * @brief luat_uart
  49. */
  50. typedef struct luat_uart {
  51. int id; /**< 串口id */
  52. int baud_rate; /**< 波特率 */
  53. uint8_t data_bits; /**< 数据位 */
  54. uint8_t stop_bits; /**< 停止位 */
  55. uint8_t bit_order; /**< 高低位 */
  56. uint8_t parity; /**< 奇偶校验位 */
  57. size_t bufsz; /**< 接收数据缓冲区大小 */
  58. uint32_t pin485; /**< 转换485的pin, 如果没有则是0xffffffff*/
  59. uint32_t delay; /**< 485翻转延迟时间,单位us */
  60. uint8_t rx_level; /**< 接收方向的电平 */
  61. uint8_t debug_enable; /**< 是否开启debug功能 ==LUAT_UART_DEBUG_ENABLE开启,其他不开启 */
  62. uint8_t error_drop; /**< 遇到错误是否放弃数据 ==LUAT_UART_RX_ERROR_DROP_DATA 放弃,其他不放弃*/
  63. } luat_uart_t;
  64. /**
  65. * @brief uart初始化
  66. *
  67. * @param uart luat_uart结构体
  68. * @return int
  69. */
  70. int luat_uart_setup(luat_uart_t* uart);
  71. /**
  72. * @brief 串口写数据
  73. *
  74. * @param uart_id 串口id
  75. * @param data 数据
  76. * @param length 数据长度
  77. * @return int
  78. */
  79. int luat_uart_write(int uart_id, void* data, size_t length);
  80. /**
  81. * @brief 串口读数据
  82. *
  83. * @param uart_id 串口id
  84. * @param buffer 数据
  85. * @param length 数据长度
  86. * @return int
  87. */
  88. int luat_uart_read(int uart_id, void* buffer, size_t length);
  89. /**
  90. * @brief 清除uart的接收缓存数据
  91. * @return int
  92. */
  93. void luat_uart_clear_rx_cache(int uart_id);
  94. /**
  95. * @brief 关闭串口
  96. *
  97. * @param uart_id 串口id
  98. * @return int
  99. */
  100. int luat_uart_close(int uart_id);
  101. /**
  102. * @brief 检测串口是否存在
  103. *
  104. * @param uart_id 串口id
  105. * @return int
  106. */
  107. int luat_uart_exist(int uart_id);
  108. /**
  109. * @brief 串口控制参数
  110. */
  111. typedef enum LUAT_UART_CTRL_CMD
  112. {
  113. LUAT_UART_SET_RECV_CALLBACK,/**< 接收回调 */
  114. LUAT_UART_SET_SENT_CALLBACK,/**< 发送回调 */
  115. LUAT_UART_SET_RTS_STATE,/**< 设置RTS状态 */
  116. LUAT_UART_GET_CTS_STATE,/**< 获取CTS状态 */
  117. }LUAT_UART_CTRL_CMD_E;
  118. /**
  119. * @brief 接收回调函数
  120. *
  121. */
  122. typedef void (*luat_uart_recv_callback_t)(int uart_id, uint32_t data_len);
  123. /**
  124. * @brief 发送回调函数
  125. *
  126. */
  127. typedef void (*luat_uart_sent_callback_t)(int uart_id, void *param);
  128. /**
  129. * @brief 发送回调函数
  130. * @param state 1 cts拉高 0 cts拉低
  131. */
  132. typedef void (*luat_uart_cts_callback_t)(int uart_id, uint32_t state);
  133. /**
  134. * @brief 串口控制参数
  135. *
  136. */
  137. typedef struct luat_uart_ctrl_param
  138. {
  139. luat_uart_recv_callback_t recv_callback_fun;/**< 接收回调函数 */
  140. luat_uart_sent_callback_t sent_callback_fun;/**< 发送回调函数 */
  141. luat_uart_cts_callback_t cts_callback_fun;/**< CTS状态变更回调函数 */
  142. }luat_uart_ctrl_param_t;
  143. /**
  144. * @brief 串口控制
  145. *
  146. * @param uart_id 串口id
  147. * @param cmd 串口控制命令
  148. * @param param 串口控制参数
  149. * @return int
  150. */
  151. int luat_uart_ctrl(int uart_id, LUAT_UART_CTRL_CMD_E cmd, void* param);
  152. /**
  153. * @brief 开关串口硬件流控,Air780E暂不支持
  154. *
  155. * @param uart_id 串口id
  156. * @param cts_callback_fun CTS状态回调函数,如果设置为NULL,则关闭硬件流控功能
  157. * @return int < 0失败
  158. */
  159. int luat_uart_setup_flow_ctrl(int uart_id, luat_uart_cts_callback_t cts_callback_fun);
  160. /**
  161. * @brief 串口复用函数,目前支持UART0,UART2,仅适用于Air780E
  162. *
  163. * @param uart_id 串口id
  164. * @param use_alt_type 如果为1,UART0,复用到GPIO16,GPIO17;UART2复用到GPIO12 GPIO13
  165. * @return int 0 失败,其他成功
  166. */
  167. int luat_uart_pre_setup(int uart_id, uint8_t use_alt_type);
  168. #ifdef LUAT_USE_SOFT_UART
  169. //#ifndef __BSP_COMMON_H__
  170. //#include "c_common.h"
  171. //#endif
  172. typedef void (* CommonFun_t)(void);
  173. /**
  174. * @brief 软件串口所需硬件定时器配置
  175. *
  176. * @param hwtimer_id 硬件定时器id
  177. * @param callback 定时回调,如果为NULL,则为释放定时器资源
  178. * @return int 成功返回0,其他值则为失败
  179. */
  180. int luat_uart_soft_setup_hwtimer_callback(int hwtimer_id, CommonFun_t callback);
  181. void luat_uart_soft_gpio_fast_output(int pin, uint8_t value);
  182. uint8_t luat_uart_soft_gpio_fast_input(int pin);
  183. void luat_uart_soft_gpio_fast_irq_set(int pin, uint8_t onoff);
  184. /**
  185. * @brief 软件串口所需硬件定时周期
  186. *
  187. * @param baudrate 波特率
  188. * @return uint32_t 计算到的定时周期
  189. */
  190. uint32_t luat_uart_soft_cal_baudrate(uint32_t baudrate);
  191. /**
  192. * @brief 软件串口所需硬件定时器开关
  193. *
  194. * @param hwtimer_id 硬件定时器id
  195. * @param period 定时周期,通过luat_uart_soft_cal_baudrate计算
  196. * @return int 成功返回0,其他值则为失败
  197. */
  198. void luat_uart_soft_hwtimer_onoff(int hwtimer_id, uint32_t period);
  199. void luat_uart_soft_sleep_enable(uint8_t is_enable);
  200. #endif
  201. int luat_uart_wait_485_tx_done(int uartid);
  202. void luat_uart_patch(int *param);
  203. void luat_uart_set_app_recv(int id, luat_uart_recv_callback_t cb);
  204. void luat_uart_set_app_sent(int id, luat_uart_sent_callback_t cb);
  205. /** @}*/
  206. /** @}*/
  207. #endif