one_wire_master.cpp 2.3 KB

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