Library to communicate with Maxim OneWire protocol devices Modified timings and IRQ overrides
Fork of Onewire by
Onewire.cpp@0:d961f715d82b, 2013-06-23 (annotated)
- 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?
User | Revision | Line number | New 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 |