Library to communicate with Maxim OneWire protocol devices Modified timings and IRQ overrides

Dependents:   RdGasUseMonitor

Fork of Onewire by Simon Barker

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;
+}
+