Library to communicate with Maxim OneWire protocol devices Modified timings and IRQ overrides
Fork of Onewire by
Diff: Onewire.cpp
- Revision:
- 0:d961f715d82b
- Child:
- 1:8e9464e05ddf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Onewire.cpp Sun Jun 23 15:17:39 2013 +0000 @@ -0,0 +1,89 @@ +#include "Onewire.h" + +Onewire::Onewire(PinName oneBus):oneBus_(oneBus){ + +} +void Onewire::writeBit(int bit) { + bit = bit & 0x01; + if (bit) { + // Write '1' bit + oneBus_.output(); + oneBus_ = 0; + wait_us(5); + oneBus_.input(); + wait_us(60); + } else { + // Write '0' bit + oneBus_.output(); + oneBus_ = 0; + wait_us(70); + oneBus_.input(); + wait_us(2); + } +} + +int Onewire::readBit() { + char result; + + oneBus_.output(); + oneBus_ = 0; + wait_us(1); + oneBus_.input(); + wait_us(5); + result = oneBus_.read(); + wait_us(55); + return result; + +} + +int Onewire::init() { + oneBus_.output(); + oneBus_ = 0; + wait_us(480); + oneBus_.input(); + wait_us(60); + if (oneBus_.read() == 0) { + wait(0.0001); + return 1; + } + return 0; +} +int Onewire::readByte() { + int result = 0; + + for (int loop = 0; loop < 8; loop++) { + // shift the result to get it ready for the next bit + result >>= 1; + + // if result is one, then set MS bit + if (readBit()) + result |= 0x80; + } + return result; +} +void Onewire::writeByte(char data) { + // Loop to write each bit in the byte, LS-bit first + for (int loop = 0; loop < 8; loop++) { + writeBit(data & 0x01); + + // shift the data byte for the next bit + data >>= 1; + } +} +unsigned char Onewire::CRC(unsigned char* addr, unsigned char len) { + unsigned char i, j; + unsigned char crc = 0; + + for (i = 0; i < len; i++) { + unsigned char inbyte = addr[i]; + for (j = 0; j < 8; j++) { + unsigned char mix = (crc ^ inbyte) & 0x01; + crc >>= 1; + if (mix) crc ^= 0x8C; + inbyte >>= 1; + } + } + + return crc; +} +