fml_single_line_simplex.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #ifndef __FML_SINGLE_LINE_SIMPLEX_H__
  2. #define __FML_SINGLE_LINE_SIMPLEX_H__
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. /*Includes ------------------------------------------------------*/
  7. #include <stdint.h>
  8. #include <stdio.h>
  9. #include <stdbool.h>
  10. #include <string.h>
  11. #include "nrf_drv_gpiote.h"
  12. #include "app_error.h"
  13. #include "SEGGER_RTT.h"
  14. #include "usr_config.h"
  15. /*Private macro ------------------------------------------------*/
  16. #define FML_SINGLE_LINE_SIMPLEX_PIN PIN_CHARGING //IO引脚
  17. #define FML_SINGLE_LINE_SIMPLEX_SEND_ONE_BIT_TIEMS 20000 //发送一位的等待时间 单位:us //一个字节4.3-4.8ms
  18. #define FML_SINGLE_LINE_SIMPLEX_BASICS_T FML_SINGLE_LINE_SIMPLEX_SEND_ONE_BIT_TIEMS //基础时间 单位:us
  19. #define FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T (1*FML_SINGLE_LINE_SIMPLEX_BASICS_T) //校准码时间 单位:us
  20. #define FML_SINGLE_LINE_SIMPLEX_BOOT_CODE_T (4*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T) //引导码时间 单位:us
  21. #define FML_SINGLE_LINE_SIMPLEX_LOW_LEVEL_T (1*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T) //低电平时间 单位:us
  22. #define FML_SINGLE_LINE_SIMPLEX_HIGHT_LEVEL_T (2*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T) //高电平时间 单位:us
  23. #define FML_SINGLE_LINE_SIMPLEX_END_CODE_T (3*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T) //结束码时间 单位:us
  24. #define FML_SINGLE_LINE_SIMPLEX_PWM_SEQ_VALUES_LEN ((FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + FML_SINGLE_LINE_SIMPLEX_BOOT_CODE_T + \
  25. 2*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + \
  26. 8*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + 8*FML_SINGLE_LINE_SIMPLEX_HIGHT_LEVEL_T + \
  27. FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + FML_SINGLE_LINE_SIMPLEX_HIGHT_LEVEL_T + \
  28. FML_SINGLE_LINE_SIMPLEX_END_CODE_T*2) / FML_SINGLE_LINE_SIMPLEX_SEND_ONE_BIT_TIEMS \
  29. ) //PWM发送一个字节的序列大小,END_CODE*2是为了余量。
  30. /**最大字节255的传输时间为:37单位
  31. ((FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + FML_SINGLE_LINE_SIMPLEX_BOOT_CODE_T + \
  32. 2*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + \
  33. 8*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + 8*FML_SINGLE_LINE_SIMPLEX_HIGHT_LEVEL_T + \
  34. FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + FML_SINGLE_LINE_SIMPLEX_HIGHT_LEVEL_T + \
  35. FML_SINGLE_LINE_SIMPLEX_END_CODE_T) / FML_SINGLE_LINE_SIMPLEX_SEND_ONE_BIT_TIEMS \
  36. )
  37. */
  38. /**最小字节0的传输时间为:28个单位
  39. ((FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + FML_SINGLE_LINE_SIMPLEX_BOOT_CODE_T + \
  40. 2*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + \
  41. 8*FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + 8*FML_SINGLE_LINE_SIMPLEX_LOW_LEVEL_T + \
  42. FML_SINGLE_LINE_SIMPLEX_CALIBRATION_CODE_T + FML_SINGLE_LINE_SIMPLEX_LOW_LEVEL_T + \
  43. FML_SINGLE_LINE_SIMPLEX_END_CODE_T) / FML_SINGLE_LINE_SIMPLEX_SEND_ONE_BIT_TIEMS \
  44. )
  45. */
  46. /*STRUCTION -----------------------------------------------------*/
  47. typedef enum
  48. {
  49. FML_SINGLE_LINE_SIMPLEX_ROLE_HOST = 1, //角色 —— 主机
  50. FML_SINGLE_LINE_SIMPLEX_ROLE_SLAVE = 0 //角色 —— 从机
  51. } FML_SINGLE_LINE_SIMPLEX_ROLE_e;
  52. typedef void (*fml_single_line_half_duplex_receive_cb)(void);
  53. /*API -------------------------------------------------------*/
  54. /**
  55. @brief 初始化单线单工驱动
  56. @param role - [in] 角色
  57. @return 错误代码 - [out] -1失败,0成功
  58. */
  59. int fml_single_line_simplex_Init(FML_SINGLE_LINE_SIMPLEX_ROLE_e role);
  60. /**
  61. @brief 取消初始化单线单工驱动
  62. @param 无
  63. @return 错误代码 - [out] -1失败,0成功
  64. */
  65. int fml_single_line_simplex_UnInit(void);
  66. /**
  67. @brief 单线单工阻塞IO传输 —— 发送
  68. @param p_send - [in] 需要发送数据的指向地址
  69. @param len - [in] 数据长度
  70. @return 错误代码 - [out] -1失败,0成功
  71. */
  72. int fml_single_line_simplex_transfer(uint8_t *p_send, int len);
  73. /**
  74. @brief 单线单工PWM传输 —— 发送
  75. @param byte - [in] 发送的字节
  76. @return 错误代码 - [out] -1失败,0成功
  77. */
  78. int fml_single_line_simplex_pwm_transfer_onebyte(uint8_t byte);
  79. /**
  80. @brief 单线单工PWM传输是否完成 —— 发送
  81. @param 无
  82. @return 错误代码 - [out] -1失败,0成功
  83. */
  84. int fml_single_line_simplex_pwm_transfer_is_done(void);
  85. /**
  86. @brief 单线单工传输 —— 接收
  87. @param p_receive - [in] 需要接收数据的指向地址
  88. @param len - [in] 数据长度
  89. @return 返回的长度
  90. */
  91. int fml_single_line_simplex_receive(uint8_t *p_receive, uint32_t len);
  92. /**
  93. @brief 单线单工传输 —— 接收回调
  94. @param cb - [in] 回调地址
  95. @return 错误代码 - [out] -1失败,0成功
  96. */
  97. int fml_single_line_simplex_receive_time_callback(fml_single_line_half_duplex_receive_cb cb);
  98. #ifdef __cplusplus
  99. }
  100. #endif
  101. #endif