one_wire_master.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #pragma once
  2. #include "one_wire_master.h"
  3. #include "one_wire_timings.h"
  4. OneWireMaster::OneWireMaster(const GpioPin* one_wire_gpio) {
  5. gpio = one_wire_gpio;
  6. }
  7. OneWireMaster::~OneWireMaster() {
  8. stop();
  9. }
  10. void OneWireMaster::start(void) {
  11. gpio_init(gpio, GpioModeOutputOpenDrain);
  12. }
  13. void OneWireMaster::stop(void) {
  14. gpio_init(gpio, GpioModeAnalog);
  15. }
  16. bool OneWireMaster::reset(void) {
  17. uint8_t r;
  18. uint8_t retries = 125;
  19. // wait until the gpio is high
  20. gpio_write(gpio, true);
  21. do {
  22. if(--retries == 0) return 0;
  23. delay_us(2);
  24. } while(!gpio_read(gpio));
  25. // pre delay
  26. delay_us(OneWireTiming::RESET_DELAY_PRE);
  27. // drive low
  28. gpio_write(gpio, false);
  29. delay_us(OneWireTiming::RESET_DRIVE);
  30. // release
  31. gpio_write(gpio, true);
  32. delay_us(OneWireTiming::RESET_RELEASE);
  33. // read and post delay
  34. r = !gpio_read(gpio);
  35. delay_us(OneWireTiming::RESET_DELAY_POST);
  36. return r;
  37. }
  38. bool OneWireMaster::read_bit(void) {
  39. bool result;
  40. // drive low
  41. gpio_write(gpio, false);
  42. delay_us(OneWireTiming::READ_DRIVE);
  43. // release
  44. gpio_write(gpio, true);
  45. delay_us(OneWireTiming::READ_RELEASE);
  46. // read and post delay
  47. result = gpio_read(gpio);
  48. delay_us(OneWireTiming::READ_DELAY_POST);
  49. return result;
  50. }
  51. void OneWireMaster::write_bit(bool value) {
  52. if(value) {
  53. // drive low
  54. gpio_write(gpio, false);
  55. delay_us(OneWireTiming::WRITE_1_DRIVE);
  56. // release
  57. gpio_write(gpio, true);
  58. delay_us(OneWireTiming::WRITE_1_RELEASE);
  59. } else {
  60. // drive low
  61. gpio_write(gpio, false);
  62. delay_us(OneWireTiming::WRITE_0_DRIVE);
  63. // release
  64. gpio_write(gpio, true);
  65. delay_us(OneWireTiming::WRITE_0_RELEASE);
  66. }
  67. }
  68. uint8_t OneWireMaster::read(void) {
  69. uint8_t result = 0;
  70. for(uint8_t bitMask = 0x01; bitMask; bitMask <<= 1) {
  71. if(read_bit()) {
  72. result |= bitMask;
  73. }
  74. }
  75. return result;
  76. }
  77. void OneWireMaster::read_bytes(uint8_t* buffer, uint16_t count) {
  78. for(uint16_t i = 0; i < count; i++) {
  79. buffer[i] = read();
  80. }
  81. }
  82. void OneWireMaster::write(uint8_t value) {
  83. uint8_t bitMask;
  84. for(bitMask = 0x01; bitMask; bitMask <<= 1) {
  85. write_bit((bitMask & value) ? 1 : 0);
  86. }
  87. }
  88. void OneWireMaster::skip(void) {
  89. write(0xCC);
  90. }