Library to communicate with Maxim OneWire protocol devices Modified timings and IRQ overrides
Fork of Onewire by
Onewire.cpp@2:b7ee49dbd7ef, 2015-02-21 (annotated)
- Committer:
- Bobty
- Date:
- Sat Feb 21 17:26:40 2015 +0000
- Revision:
- 2:b7ee49dbd7ef
- Parent:
- 1:8e9464e05ddf
- Child:
- 3:712bf8967b68
Tidied up a little
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 | |
Bobty | 2:b7ee49dbd7ef | 3 | Onewire::Onewire(PinName oneBus):oneBus_(oneBus) |
Bobty | 2:b7ee49dbd7ef | 4 | { |
simonbarker | 0:d961f715d82b | 5 | } |
Bobty | 2:b7ee49dbd7ef | 6 | |
Bobty | 2:b7ee49dbd7ef | 7 | void Onewire::writeBit(int bit) |
Bobty | 2:b7ee49dbd7ef | 8 | { |
simonbarker | 0:d961f715d82b | 9 | bit = bit & 0x01; |
Bobty | 2:b7ee49dbd7ef | 10 | if (bit) |
Bobty | 2:b7ee49dbd7ef | 11 | { |
simonbarker | 0:d961f715d82b | 12 | // Write '1' bit |
simonbarker | 0:d961f715d82b | 13 | oneBus_.output(); |
simonbarker | 0:d961f715d82b | 14 | oneBus_ = 0; |
simonbarker | 0:d961f715d82b | 15 | wait_us(5); |
simonbarker | 0:d961f715d82b | 16 | oneBus_.input(); |
simonbarker | 0:d961f715d82b | 17 | wait_us(60); |
Bobty | 2:b7ee49dbd7ef | 18 | } |
Bobty | 2:b7ee49dbd7ef | 19 | else |
Bobty | 2:b7ee49dbd7ef | 20 | { |
simonbarker | 0:d961f715d82b | 21 | // Write '0' bit |
simonbarker | 0:d961f715d82b | 22 | oneBus_.output(); |
simonbarker | 0:d961f715d82b | 23 | oneBus_ = 0; |
simonbarker | 0:d961f715d82b | 24 | wait_us(70); |
simonbarker | 0:d961f715d82b | 25 | oneBus_.input(); |
simonbarker | 0:d961f715d82b | 26 | wait_us(2); |
simonbarker | 0:d961f715d82b | 27 | } |
simonbarker | 0:d961f715d82b | 28 | } |
simonbarker | 0:d961f715d82b | 29 | |
Bobty | 2:b7ee49dbd7ef | 30 | int Onewire::readBit() |
Bobty | 2:b7ee49dbd7ef | 31 | { |
simonbarker | 0:d961f715d82b | 32 | char result; |
simonbarker | 0:d961f715d82b | 33 | |
simonbarker | 0:d961f715d82b | 34 | oneBus_.output(); |
simonbarker | 0:d961f715d82b | 35 | oneBus_ = 0; |
simonbarker | 0:d961f715d82b | 36 | wait_us(1); |
simonbarker | 0:d961f715d82b | 37 | oneBus_.input(); |
simonbarker | 0:d961f715d82b | 38 | wait_us(5); |
simonbarker | 0:d961f715d82b | 39 | result = oneBus_.read(); |
simonbarker | 0:d961f715d82b | 40 | wait_us(55); |
simonbarker | 0:d961f715d82b | 41 | return result; |
simonbarker | 0:d961f715d82b | 42 | } |
simonbarker | 0:d961f715d82b | 43 | |
Bobty | 2:b7ee49dbd7ef | 44 | int Onewire::init() |
Bobty | 2:b7ee49dbd7ef | 45 | { |
simonbarker | 0:d961f715d82b | 46 | oneBus_.output(); |
simonbarker | 0:d961f715d82b | 47 | oneBus_ = 0; |
simonbarker | 0:d961f715d82b | 48 | wait_us(480); |
simonbarker | 0:d961f715d82b | 49 | oneBus_.input(); |
simonbarker | 0:d961f715d82b | 50 | wait_us(60); |
Bobty | 2:b7ee49dbd7ef | 51 | if (oneBus_.read() == 0) |
Bobty | 2:b7ee49dbd7ef | 52 | { |
simonbarker | 0:d961f715d82b | 53 | wait(0.0001); |
simonbarker | 0:d961f715d82b | 54 | return 1; |
simonbarker | 0:d961f715d82b | 55 | } |
simonbarker | 0:d961f715d82b | 56 | return 0; |
simonbarker | 0:d961f715d82b | 57 | } |
Bobty | 2:b7ee49dbd7ef | 58 | |
Bobty | 2:b7ee49dbd7ef | 59 | int Onewire::readByte() |
Bobty | 2:b7ee49dbd7ef | 60 | { |
simonbarker | 0:d961f715d82b | 61 | int result = 0; |
simonbarker | 0:d961f715d82b | 62 | |
simonbarker | 0:d961f715d82b | 63 | for (int loop = 0; loop < 8; loop++) { |
simonbarker | 0:d961f715d82b | 64 | // shift the result to get it ready for the next bit |
simonbarker | 0:d961f715d82b | 65 | result >>= 1; |
simonbarker | 0:d961f715d82b | 66 | |
simonbarker | 0:d961f715d82b | 67 | // if result is one, then set MS bit |
simonbarker | 0:d961f715d82b | 68 | if (readBit()) |
simonbarker | 0:d961f715d82b | 69 | result |= 0x80; |
simonbarker | 0:d961f715d82b | 70 | } |
simonbarker | 0:d961f715d82b | 71 | return result; |
simonbarker | 0:d961f715d82b | 72 | } |
Bobty | 2:b7ee49dbd7ef | 73 | |
Bobty | 2:b7ee49dbd7ef | 74 | void Onewire::writeByte(char data) |
Bobty | 2:b7ee49dbd7ef | 75 | { |
simonbarker | 0:d961f715d82b | 76 | // Loop to write each bit in the byte, LS-bit first |
simonbarker | 0:d961f715d82b | 77 | for (int loop = 0; loop < 8; loop++) { |
simonbarker | 0:d961f715d82b | 78 | writeBit(data & 0x01); |
simonbarker | 0:d961f715d82b | 79 | |
simonbarker | 0:d961f715d82b | 80 | // shift the data byte for the next bit |
simonbarker | 0:d961f715d82b | 81 | data >>= 1; |
simonbarker | 0:d961f715d82b | 82 | } |
simonbarker | 0:d961f715d82b | 83 | } |
Bobty | 2:b7ee49dbd7ef | 84 | |
Bobty | 2:b7ee49dbd7ef | 85 | unsigned char Onewire::CRC(unsigned char* addr, unsigned char len) |
Bobty | 2:b7ee49dbd7ef | 86 | { |
simonbarker | 0:d961f715d82b | 87 | unsigned char i, j; |
simonbarker | 0:d961f715d82b | 88 | unsigned char crc = 0; |
simonbarker | 0:d961f715d82b | 89 | |
simonbarker | 0:d961f715d82b | 90 | for (i = 0; i < len; i++) { |
simonbarker | 0:d961f715d82b | 91 | unsigned char inbyte = addr[i]; |
simonbarker | 0:d961f715d82b | 92 | for (j = 0; j < 8; j++) { |
simonbarker | 0:d961f715d82b | 93 | unsigned char mix = (crc ^ inbyte) & 0x01; |
simonbarker | 0:d961f715d82b | 94 | crc >>= 1; |
simonbarker | 0:d961f715d82b | 95 | if (mix) crc ^= 0x8C; |
simonbarker | 0:d961f715d82b | 96 | inbyte >>= 1; |
simonbarker | 0:d961f715d82b | 97 | } |
simonbarker | 0:d961f715d82b | 98 | } |
simonbarker | 0:d961f715d82b | 99 | return crc; |
simonbarker | 0:d961f715d82b | 100 | } |
simonbarker | 0:d961f715d82b | 101 | |
Bobty | 1:8e9464e05ddf | 102 | // |
Bobty | 1:8e9464e05ddf | 103 | // You need to use this function to start a search again from the beginning. |
Bobty | 1:8e9464e05ddf | 104 | // You do not need to do it for the first search, though you could. |
Bobty | 1:8e9464e05ddf | 105 | // |
Bobty | 1:8e9464e05ddf | 106 | void Onewire::reset_search() |
Bobty | 1:8e9464e05ddf | 107 | { |
Bobty | 2:b7ee49dbd7ef | 108 | // reset the search state |
Bobty | 2:b7ee49dbd7ef | 109 | _search_LastDiscrepancy = 0; |
Bobty | 2:b7ee49dbd7ef | 110 | _search_LastDeviceFlag = false; |
Bobty | 2:b7ee49dbd7ef | 111 | _search_LastFamilyDiscrepancy = 0; |
Bobty | 2:b7ee49dbd7ef | 112 | for(int i = 7; i >= 0; i--) |
Bobty | 2:b7ee49dbd7ef | 113 | _search_ROM_NO[i] = 0; |
Bobty | 1:8e9464e05ddf | 114 | } |
Bobty | 1:8e9464e05ddf | 115 | |
Bobty | 2:b7ee49dbd7ef | 116 | // Search Copied from Arduino code |
Bobty | 1:8e9464e05ddf | 117 | // |
Bobty | 1:8e9464e05ddf | 118 | // Perform a search. If this function returns a '1' then it has |
Bobty | 1:8e9464e05ddf | 119 | // enumerated the next device and you may retrieve the ROM from the |
Bobty | 1:8e9464e05ddf | 120 | // Onewire::address variable. If there are no devices, no further |
Bobty | 1:8e9464e05ddf | 121 | // devices, or something horrible happens in the middle of the |
Bobty | 1:8e9464e05ddf | 122 | // enumeration then a 0 is returned. If a new device is found then |
Bobty | 1:8e9464e05ddf | 123 | // its address is copied to newAddr. Use Onewire::reset_search() to |
Bobty | 1:8e9464e05ddf | 124 | // start over. |
Bobty | 1:8e9464e05ddf | 125 | // |
Bobty | 1:8e9464e05ddf | 126 | // --- Replaced by the one from the Dallas Semiconductor web site --- |
Bobty | 1:8e9464e05ddf | 127 | //-------------------------------------------------------------------------- |
Bobty | 1:8e9464e05ddf | 128 | // Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing |
Bobty | 1:8e9464e05ddf | 129 | // search state. |
Bobty | 1:8e9464e05ddf | 130 | // Return TRUE : device found, ROM number in ROM_NO buffer |
Bobty | 1:8e9464e05ddf | 131 | // FALSE : device not found, end of search |
Bobty | 1:8e9464e05ddf | 132 | // |
Bobty | 1:8e9464e05ddf | 133 | uint8_t Onewire::search(uint8_t *newAddr) |
Bobty | 1:8e9464e05ddf | 134 | { |
Bobty | 2:b7ee49dbd7ef | 135 | uint8_t id_bit_number = 1; |
Bobty | 2:b7ee49dbd7ef | 136 | uint8_t last_zero = 0, rom_byte_number = 0, search_result = 0; |
Bobty | 2:b7ee49dbd7ef | 137 | uint8_t id_bit = 0, cmp_id_bit = 0; |
Bobty | 1:8e9464e05ddf | 138 | |
Bobty | 1:8e9464e05ddf | 139 | // initialize for search |
Bobty | 2:b7ee49dbd7ef | 140 | unsigned char rom_byte_mask = 1, search_direction = 0; |
Bobty | 1:8e9464e05ddf | 141 | |
Bobty | 1:8e9464e05ddf | 142 | // if the last call was not the last one |
Bobty | 1:8e9464e05ddf | 143 | if (!_search_LastDeviceFlag) |
Bobty | 1:8e9464e05ddf | 144 | { |
Bobty | 1:8e9464e05ddf | 145 | // 1-Wire reset |
Bobty | 1:8e9464e05ddf | 146 | if (!init()) |
Bobty | 1:8e9464e05ddf | 147 | { |
Bobty | 1:8e9464e05ddf | 148 | // reset the search |
Bobty | 1:8e9464e05ddf | 149 | _search_LastDiscrepancy = 0; |
Bobty | 1:8e9464e05ddf | 150 | _search_LastDeviceFlag = false; |
Bobty | 1:8e9464e05ddf | 151 | _search_LastFamilyDiscrepancy = 0; |
Bobty | 1:8e9464e05ddf | 152 | return false; |
Bobty | 1:8e9464e05ddf | 153 | } |
Bobty | 1:8e9464e05ddf | 154 | |
Bobty | 1:8e9464e05ddf | 155 | // issue the search command |
Bobty | 1:8e9464e05ddf | 156 | writeByte(0xF0); |
Bobty | 1:8e9464e05ddf | 157 | |
Bobty | 1:8e9464e05ddf | 158 | // loop to do the search |
Bobty | 1:8e9464e05ddf | 159 | do |
Bobty | 1:8e9464e05ddf | 160 | { |
Bobty | 1:8e9464e05ddf | 161 | // read a bit and its complement |
Bobty | 1:8e9464e05ddf | 162 | id_bit = readBit(); |
Bobty | 1:8e9464e05ddf | 163 | cmp_id_bit = readBit(); |
Bobty | 1:8e9464e05ddf | 164 | |
Bobty | 1:8e9464e05ddf | 165 | // check for no devices on 1-wire |
Bobty | 1:8e9464e05ddf | 166 | if ((id_bit == 1) && (cmp_id_bit == 1)) |
Bobty | 1:8e9464e05ddf | 167 | break; |
Bobty | 1:8e9464e05ddf | 168 | else |
Bobty | 1:8e9464e05ddf | 169 | { |
Bobty | 1:8e9464e05ddf | 170 | // all devices coupled have 0 or 1 |
Bobty | 1:8e9464e05ddf | 171 | if (id_bit != cmp_id_bit) |
Bobty | 1:8e9464e05ddf | 172 | search_direction = id_bit; // bit write value for search |
Bobty | 1:8e9464e05ddf | 173 | else |
Bobty | 1:8e9464e05ddf | 174 | { |
Bobty | 1:8e9464e05ddf | 175 | // if this discrepancy if before the Last Discrepancy |
Bobty | 1:8e9464e05ddf | 176 | // on a previous next then pick the same as last time |
Bobty | 1:8e9464e05ddf | 177 | if (id_bit_number < _search_LastDiscrepancy) |
Bobty | 1:8e9464e05ddf | 178 | search_direction = ((_search_ROM_NO[rom_byte_number] & rom_byte_mask) > 0); |
Bobty | 1:8e9464e05ddf | 179 | else |
Bobty | 1:8e9464e05ddf | 180 | // if equal to last pick 1, if not then pick 0 |
Bobty | 1:8e9464e05ddf | 181 | search_direction = (id_bit_number == _search_LastDiscrepancy); |
Bobty | 1:8e9464e05ddf | 182 | |
Bobty | 1:8e9464e05ddf | 183 | // if 0 was picked then record its position in LastZero |
Bobty | 1:8e9464e05ddf | 184 | if (search_direction == 0) |
Bobty | 1:8e9464e05ddf | 185 | { |
Bobty | 1:8e9464e05ddf | 186 | last_zero = id_bit_number; |
Bobty | 1:8e9464e05ddf | 187 | |
Bobty | 1:8e9464e05ddf | 188 | // check for Last discrepancy in family |
Bobty | 1:8e9464e05ddf | 189 | if (last_zero < 9) |
Bobty | 1:8e9464e05ddf | 190 | _search_LastFamilyDiscrepancy = last_zero; |
Bobty | 1:8e9464e05ddf | 191 | } |
Bobty | 1:8e9464e05ddf | 192 | } |
Bobty | 1:8e9464e05ddf | 193 | |
Bobty | 1:8e9464e05ddf | 194 | // set or clear the bit in the ROM byte rom_byte_number |
Bobty | 1:8e9464e05ddf | 195 | // with mask rom_byte_mask |
Bobty | 1:8e9464e05ddf | 196 | if (search_direction == 1) |
Bobty | 1:8e9464e05ddf | 197 | _search_ROM_NO[rom_byte_number] |= rom_byte_mask; |
Bobty | 1:8e9464e05ddf | 198 | else |
Bobty | 1:8e9464e05ddf | 199 | _search_ROM_NO[rom_byte_number] &= ~rom_byte_mask; |
Bobty | 1:8e9464e05ddf | 200 | |
Bobty | 1:8e9464e05ddf | 201 | // serial number search direction write bit |
Bobty | 1:8e9464e05ddf | 202 | writeBit(search_direction); |
Bobty | 1:8e9464e05ddf | 203 | |
Bobty | 1:8e9464e05ddf | 204 | // increment the byte counter id_bit_number |
Bobty | 1:8e9464e05ddf | 205 | // and shift the mask rom_byte_mask |
Bobty | 1:8e9464e05ddf | 206 | id_bit_number++; |
Bobty | 1:8e9464e05ddf | 207 | rom_byte_mask <<= 1; |
Bobty | 1:8e9464e05ddf | 208 | |
Bobty | 1:8e9464e05ddf | 209 | // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask |
Bobty | 1:8e9464e05ddf | 210 | if (rom_byte_mask == 0) |
Bobty | 1:8e9464e05ddf | 211 | { |
Bobty | 1:8e9464e05ddf | 212 | rom_byte_number++; |
Bobty | 1:8e9464e05ddf | 213 | rom_byte_mask = 1; |
Bobty | 1:8e9464e05ddf | 214 | } |
Bobty | 1:8e9464e05ddf | 215 | } |
Bobty | 1:8e9464e05ddf | 216 | } |
Bobty | 1:8e9464e05ddf | 217 | while(rom_byte_number < 8); // loop until through all ROM bytes 0-7 |
Bobty | 1:8e9464e05ddf | 218 | |
Bobty | 1:8e9464e05ddf | 219 | // if the search was successful then |
Bobty | 1:8e9464e05ddf | 220 | if (!(id_bit_number < 65)) |
Bobty | 1:8e9464e05ddf | 221 | { |
Bobty | 1:8e9464e05ddf | 222 | // search successful so set LastDiscrepancy,LastDeviceFlag,search_result |
Bobty | 1:8e9464e05ddf | 223 | _search_LastDiscrepancy = last_zero; |
Bobty | 1:8e9464e05ddf | 224 | |
Bobty | 1:8e9464e05ddf | 225 | // check for last device |
Bobty | 1:8e9464e05ddf | 226 | if (_search_LastDiscrepancy == 0) |
Bobty | 1:8e9464e05ddf | 227 | _search_LastDeviceFlag = true; |
Bobty | 1:8e9464e05ddf | 228 | |
Bobty | 1:8e9464e05ddf | 229 | search_result = true; |
Bobty | 1:8e9464e05ddf | 230 | } |
Bobty | 1:8e9464e05ddf | 231 | } |
Bobty | 1:8e9464e05ddf | 232 | |
Bobty | 1:8e9464e05ddf | 233 | // if no device found then reset counters so next 'search' will be like a first |
Bobty | 1:8e9464e05ddf | 234 | if (!search_result || !_search_ROM_NO[0]) |
Bobty | 1:8e9464e05ddf | 235 | { |
Bobty | 1:8e9464e05ddf | 236 | _search_LastDiscrepancy = 0; |
Bobty | 1:8e9464e05ddf | 237 | _search_LastDeviceFlag = false; |
Bobty | 1:8e9464e05ddf | 238 | _search_LastFamilyDiscrepancy = 0; |
Bobty | 1:8e9464e05ddf | 239 | search_result = false; |
Bobty | 1:8e9464e05ddf | 240 | } |
Bobty | 1:8e9464e05ddf | 241 | for (int i = 0; i < 8; i++) |
Bobty | 1:8e9464e05ddf | 242 | newAddr[i] = _search_ROM_NO[i]; |
Bobty | 1:8e9464e05ddf | 243 | return search_result; |
Bobty | 1:8e9464e05ddf | 244 | } |
Bobty | 1:8e9464e05ddf | 245 |