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

Dependents:   RdGasUseMonitor

Fork of Onewire by Simon Barker

Committer:
simonbarker
Date:
Sun Jun 23 15:17:39 2013 +0000
Revision:
0:d961f715d82b
Child:
1:8e9464e05ddf
Finalised OneWire bus methods

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simonbarker 0:d961f715d82b 1 #include "Onewire.h"
simonbarker 0:d961f715d82b 2
simonbarker 0:d961f715d82b 3 Onewire::Onewire(PinName oneBus):oneBus_(oneBus){
simonbarker 0:d961f715d82b 4
simonbarker 0:d961f715d82b 5 }
simonbarker 0:d961f715d82b 6 void Onewire::writeBit(int bit) {
simonbarker 0:d961f715d82b 7 bit = bit & 0x01;
simonbarker 0:d961f715d82b 8 if (bit) {
simonbarker 0:d961f715d82b 9 // Write '1' bit
simonbarker 0:d961f715d82b 10 oneBus_.output();
simonbarker 0:d961f715d82b 11 oneBus_ = 0;
simonbarker 0:d961f715d82b 12 wait_us(5);
simonbarker 0:d961f715d82b 13 oneBus_.input();
simonbarker 0:d961f715d82b 14 wait_us(60);
simonbarker 0:d961f715d82b 15 } else {
simonbarker 0:d961f715d82b 16 // Write '0' bit
simonbarker 0:d961f715d82b 17 oneBus_.output();
simonbarker 0:d961f715d82b 18 oneBus_ = 0;
simonbarker 0:d961f715d82b 19 wait_us(70);
simonbarker 0:d961f715d82b 20 oneBus_.input();
simonbarker 0:d961f715d82b 21 wait_us(2);
simonbarker 0:d961f715d82b 22 }
simonbarker 0:d961f715d82b 23 }
simonbarker 0:d961f715d82b 24
simonbarker 0:d961f715d82b 25 int Onewire::readBit() {
simonbarker 0:d961f715d82b 26 char result;
simonbarker 0:d961f715d82b 27
simonbarker 0:d961f715d82b 28 oneBus_.output();
simonbarker 0:d961f715d82b 29 oneBus_ = 0;
simonbarker 0:d961f715d82b 30 wait_us(1);
simonbarker 0:d961f715d82b 31 oneBus_.input();
simonbarker 0:d961f715d82b 32 wait_us(5);
simonbarker 0:d961f715d82b 33 result = oneBus_.read();
simonbarker 0:d961f715d82b 34 wait_us(55);
simonbarker 0:d961f715d82b 35 return result;
simonbarker 0:d961f715d82b 36
simonbarker 0:d961f715d82b 37 }
simonbarker 0:d961f715d82b 38
simonbarker 0:d961f715d82b 39 int Onewire::init() {
simonbarker 0:d961f715d82b 40 oneBus_.output();
simonbarker 0:d961f715d82b 41 oneBus_ = 0;
simonbarker 0:d961f715d82b 42 wait_us(480);
simonbarker 0:d961f715d82b 43 oneBus_.input();
simonbarker 0:d961f715d82b 44 wait_us(60);
simonbarker 0:d961f715d82b 45 if (oneBus_.read() == 0) {
simonbarker 0:d961f715d82b 46 wait(0.0001);
simonbarker 0:d961f715d82b 47 return 1;
simonbarker 0:d961f715d82b 48 }
simonbarker 0:d961f715d82b 49 return 0;
simonbarker 0:d961f715d82b 50 }
simonbarker 0:d961f715d82b 51 int Onewire::readByte() {
simonbarker 0:d961f715d82b 52 int result = 0;
simonbarker 0:d961f715d82b 53
simonbarker 0:d961f715d82b 54 for (int loop = 0; loop < 8; loop++) {
simonbarker 0:d961f715d82b 55 // shift the result to get it ready for the next bit
simonbarker 0:d961f715d82b 56 result >>= 1;
simonbarker 0:d961f715d82b 57
simonbarker 0:d961f715d82b 58 // if result is one, then set MS bit
simonbarker 0:d961f715d82b 59 if (readBit())
simonbarker 0:d961f715d82b 60 result |= 0x80;
simonbarker 0:d961f715d82b 61 }
simonbarker 0:d961f715d82b 62 return result;
simonbarker 0:d961f715d82b 63 }
simonbarker 0:d961f715d82b 64 void Onewire::writeByte(char data) {
simonbarker 0:d961f715d82b 65 // Loop to write each bit in the byte, LS-bit first
simonbarker 0:d961f715d82b 66 for (int loop = 0; loop < 8; loop++) {
simonbarker 0:d961f715d82b 67 writeBit(data & 0x01);
simonbarker 0:d961f715d82b 68
simonbarker 0:d961f715d82b 69 // shift the data byte for the next bit
simonbarker 0:d961f715d82b 70 data >>= 1;
simonbarker 0:d961f715d82b 71 }
simonbarker 0:d961f715d82b 72 }
simonbarker 0:d961f715d82b 73 unsigned char Onewire::CRC(unsigned char* addr, unsigned char len) {
simonbarker 0:d961f715d82b 74 unsigned char i, j;
simonbarker 0:d961f715d82b 75 unsigned char crc = 0;
simonbarker 0:d961f715d82b 76
simonbarker 0:d961f715d82b 77 for (i = 0; i < len; i++) {
simonbarker 0:d961f715d82b 78 unsigned char inbyte = addr[i];
simonbarker 0:d961f715d82b 79 for (j = 0; j < 8; j++) {
simonbarker 0:d961f715d82b 80 unsigned char mix = (crc ^ inbyte) & 0x01;
simonbarker 0:d961f715d82b 81 crc >>= 1;
simonbarker 0:d961f715d82b 82 if (mix) crc ^= 0x8C;
simonbarker 0:d961f715d82b 83 inbyte >>= 1;
simonbarker 0:d961f715d82b 84 }
simonbarker 0:d961f715d82b 85 }
simonbarker 0:d961f715d82b 86
simonbarker 0:d961f715d82b 87 return crc;
simonbarker 0:d961f715d82b 88 }
simonbarker 0:d961f715d82b 89