Library to communicate with Maxim OneWire protocol devices Modified timings and IRQ overrides
Fork of Onewire by
Onewire.cpp
- Committer:
- simonbarker
- Date:
- 2013-06-23
- Revision:
- 0:d961f715d82b
- Child:
- 1:8e9464e05ddf
File content as of revision 0:d961f715d82b:
#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; }