luat_onewire.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #ifndef LUAT_ONEWIRE_H
  2. #define LUAT_ONEWIRE_H
  3. typedef struct
  4. {
  5. uint32_t reset_keep_low_time;//reset低电平时间
  6. uint32_t reset_wait_ack_time;//reset恢复高电平到reset结束时间
  7. uint32_t reset_read_ack_before_time;//reset恢复高电平到可以读ACK的时间
  8. uint32_t reset_read_ack_time;//reset读ACK的时间
  9. uint32_t wr_slot_time;//整个slot时间。不包括起始信号
  10. uint32_t wr_start_time;//起始信号时间
  11. uint32_t wr_write_start_time;//slot开始到可以写的时间
  12. uint32_t wr_read_start_time;//slot开始到可以读的时间
  13. uint32_t wr_recovery_time;//slot读写完后恢复时间
  14. }onewire_timing_us_t;
  15. typedef struct
  16. {
  17. uint32_t clock_div;//分频系数,默认0情况下自适应到1us1个tick
  18. uint32_t reset_keep_low_tick;
  19. uint32_t reset_wait_ack_tick;
  20. uint32_t reset_read_ack_before_tick;
  21. uint32_t reset_read_ack_tick;
  22. uint32_t wr_slot_tick;
  23. uint32_t wr_start_tick;
  24. uint32_t wr_write_start_tick;
  25. uint32_t wr_read_start_tick;
  26. uint32_t wr_recovery_tick;
  27. }onewire_timing_tick_t;
  28. typedef struct
  29. {
  30. union
  31. {
  32. onewire_timing_us_t timing_us;
  33. onewire_timing_tick_t timing_tick;
  34. };
  35. uint8_t type; //0 timing_us, 1 timing_tick
  36. }onewire_timing_t;
  37. /**
  38. * @brief 单总线初始化
  39. * @param id 总线ID,如果只有1条,随便写
  40. */
  41. void luat_onewire_init(int id);
  42. /**
  43. * @brief 单总线关闭
  44. * @param id 总线ID,如果只有1条,随便写
  45. */
  46. void luat_onewire_deinit(int id);
  47. /**
  48. * @brief 单总线调试开关
  49. * @param id 总线ID,如果只有1条,随便写
  50. * @param on_off 1打开,0关闭
  51. */
  52. void luat_onewire_debug(int id, uint8_t on_off);
  53. /**
  54. * @brief 单总线时序设置
  55. * @param id 总线ID,如果只有1条,随便写
  56. * @param timing 时序设置
  57. */
  58. void luat_onewire_setup_timing(int id, onewire_timing_t *timing);
  59. /**
  60. * @brief 单总线复位
  61. * @param id 总线ID,如果只有1条,随便写
  62. * @param check_ack 是否检测ACK信号,1检测,0不检测
  63. * @return 0成功,其他没有读到ACK信号
  64. */
  65. int luat_onewire_reset(int id, uint8_t check_ack);
  66. /**
  67. * @brief 单总线写1个bit
  68. * @param id 总线ID,如果只有1条,随便写
  69. * @param level 电平
  70. */
  71. void luat_onewire_write_bit(int id, uint8_t level);
  72. /**
  73. * @brief 单总线读1个bit
  74. * @param id 总线ID,如果只有1条,随便写
  75. * @return 1 高 0 低
  76. */
  77. uint8_t luat_onewire_read_bit(int id);
  78. /**
  79. * @brief 单总线写N字节
  80. * @param id 总线ID,如果只有1条,随便写
  81. * @param data 需要写入数据
  82. * @param len 需要写入长度
  83. * @param is_msb 是否MSB优先发送,默认是0,一般都是LSB先发送
  84. * @param need_reset 是否需要先reset,1是,0否
  85. * @param check_ack 是否在reset过程中检测ACK信号,1检测,0不检测,如果需要reset并且检测ACK,一旦没用检测到ACK直接停止
  86. * @return 0成功,其他没有读到ACK信号
  87. */
  88. int luat_onewire_write_byte(int id, const uint8_t *data, uint32_t len, uint8_t is_msb, uint8_t need_reset, uint8_t check_ack);
  89. /**
  90. * @brief 单总线读N字节
  91. * @param id 总线ID,如果只有1条,随便写
  92. * @param data 需要读出的数据
  93. * @param len 需要读出的长度
  94. * @param is_msb 是否MSB优先,默认是0,一般都是LSB先
  95. * @param need_reset 是否需要先reset,1是,0否
  96. * @param check_ack 是否在reset过程中检测ACK信号,1检测,0不检测,如果需要reset并且检测ACK,一旦没用检测到ACK直接停止
  97. * @return 0成功,其他没有读到ACK信号
  98. */
  99. int luat_onewire_read_byte(int id, uint8_t *data, uint32_t len, uint8_t is_msb, uint8_t need_reset, uint8_t check_ack);
  100. /**
  101. * @brief 单总线先发一个命令,再读N字节
  102. * @param id 总线ID,如果只有1条,随便写
  103. * @param cmd 命令
  104. * @param data 需要读出的数据
  105. * @param len 需要读出的长度
  106. * @param is_msb 是否MSB优先,默认是0,一般都是LSB先
  107. * @param need_reset 是否需要先reset,1是,0否
  108. * @param check_ack 是否在reset过程中检测ACK信号,1检测,0不检测,如果需要reset并且检测ACK,一旦没用检测到ACK直接停止
  109. * @return 0成功,其他没有读到ACK信号
  110. */
  111. int luat_onewire_read_byte_with_cmd(int id, const uint8_t cmd, uint8_t *data, uint32_t len, uint8_t is_msb, uint8_t need_reset, uint8_t check_ack);
  112. #endif