Library to communicate with Maxim OneWire protocol devices

Files at this revision

API Documentation at this revision

Comitter:
simonbarker
Date:
Sun Jun 23 15:17:39 2013 +0000
Commit message:
Finalised OneWire bus methods

Changed in this revision

Onewire.cpp Show annotated file Show diff for this revision Revisions of this file
Onewire.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r d961f715d82b Onewire.cpp
--- /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;
+}
+
diff -r 000000000000 -r d961f715d82b Onewire.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Onewire.h	Sun Jun 23 15:17:39 2013 +0000
@@ -0,0 +1,20 @@
+#ifndef Onewire_h
+#define Onewire_h
+
+#include "mbed.h"
+
+class Onewire{
+
+public:
+  Onewire(PinName oneBus);
+  void writeBit(int bit);
+    int readBit();
+    int init();
+    int readByte();
+    void writeByte(char data);
+    unsigned char CRC(unsigned char* addr, unsigned char len);
+
+private:
+  DigitalInOut oneBus_;
+};
+#endif
\ No newline at end of file