Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 22 | jlesech | 1 | #ifndef OneWire_h |
| 2 | #define OneWire_h |
||
| 3 | |||
| 4 | #include <inttypes.h> |
||
| 5 | |||
| 6 | #if ARDUINO >= 100 |
||
| 7 | #include "Arduino.h" // for delayMicroseconds, digitalPinToBitMask, etc |
||
| 8 | #else |
||
| 9 | #include "WProgram.h" // for delayMicroseconds |
||
| 10 | #include "pins_arduino.h" // for digitalPinToBitMask, etc |
||
| 11 | #endif |
||
| 12 | |||
| 13 | // You can exclude certain features from OneWire. In theory, this |
||
| 14 | // might save some space. In practice, the compiler automatically |
||
| 15 | // removes unused code (technically, the linker, using -fdata-sections |
||
| 16 | // and -ffunction-sections when compiling, and Wl,--gc-sections |
||
| 17 | // when linking), so most of these will not result in any code size |
||
| 18 | // reduction. Well, unless you try to use the missing features |
||
| 19 | // and redesign your program to not need them! ONEWIRE_CRC8_TABLE |
||
| 20 | // is the exception, because it selects a fast but large algorithm |
||
| 21 | // or a small but slow algorithm. |
||
| 22 | |||
| 23 | // you can exclude onewire_search by defining that to 0 |
||
| 24 | #ifndef ONEWIRE_SEARCH |
||
| 25 | #define ONEWIRE_SEARCH 1 |
||
| 26 | #endif |
||
| 27 | |||
| 28 | // You can exclude CRC checks altogether by defining this to 0 |
||
| 29 | #ifndef ONEWIRE_CRC |
||
| 30 | #define ONEWIRE_CRC 1 |
||
| 31 | #endif |
||
| 32 | |||
| 33 | // Select the table-lookup method of computing the 8-bit CRC |
||
| 34 | // by setting this to 1. The lookup table enlarges code size by |
||
| 35 | // about 250 bytes. It does NOT consume RAM (but did in very |
||
| 36 | // old versions of OneWire). If you disable this, a slower |
||
| 37 | // but very compact algorithm is used. |
||
| 38 | #ifndef ONEWIRE_CRC8_TABLE |
||
| 39 | #define ONEWIRE_CRC8_TABLE 1 |
||
| 40 | #endif |
||
| 41 | |||
| 42 | // You can allow 16-bit CRC checks by defining this to 1 |
||
| 43 | // (Note that ONEWIRE_CRC must also be 1.) |
||
| 44 | #ifndef ONEWIRE_CRC16 |
||
| 45 | #define ONEWIRE_CRC16 1 |
||
| 46 | #endif |
||
| 47 | |||
| 48 | #define FALSE 0 |
||
| 49 | #define TRUE 1 |
||
| 50 | |||
| 51 | // Platform specific I/O definitions |
||
| 52 | |||
| 53 | #if defined(__AVR__) |
||
| 54 | #define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin))) |
||
| 55 | #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) |
||
| 56 | #define IO_REG_TYPE uint8_t |
||
| 57 | #define IO_REG_ASM asm("r30") |
||
| 58 | #define DIRECT_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) |
||
| 59 | #define DIRECT_MODE_INPUT(base, mask) ((*(base+1)) &= ~(mask)) |
||
| 60 | #define DIRECT_MODE_OUTPUT(base, mask) ((*(base+1)) |= (mask)) |
||
| 61 | #define DIRECT_WRITE_LOW(base, mask) ((*(base+2)) &= ~(mask)) |
||
| 62 | #define DIRECT_WRITE_HIGH(base, mask) ((*(base+2)) |= (mask)) |
||
| 63 | |||
| 64 | #elif defined(__PIC32MX__) |
||
| 65 | #include <plib.h> // is this necessary? |
||
| 66 | #define PIN_TO_BASEREG(pin) (portModeRegister(digitalPinToPort(pin))) |
||
| 67 | #define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) |
||
| 68 | #define IO_REG_TYPE uint32_t |
||
| 69 | #define IO_REG_ASM |
||
| 70 | #define DIRECT_READ(base, mask) (((*(base+4)) & (mask)) ? 1 : 0) //PORTX + 0x10 |
||
| 71 | #define DIRECT_MODE_INPUT(base, mask) ((*(base+2)) = (mask)) //TRISXSET + 0x08 |
||
| 72 | #define DIRECT_MODE_OUTPUT(base, mask) ((*(base+1)) = (mask)) //TRISXCLR + 0x04 |
||
| 73 | #define DIRECT_WRITE_LOW(base, mask) ((*(base+8+1)) = (mask)) //LATXCLR + 0x24 |
||
| 74 | #define DIRECT_WRITE_HIGH(base, mask) ((*(base+8+2)) = (mask)) //LATXSET + 0x28 |
||
| 75 | |||
| 76 | #else |
||
| 77 | #error "Please define I/O register types here" |
||
| 78 | #endif |
||
| 79 | |||
| 80 | |||
| 81 | class OneWire |
||
| 82 | { |
||
| 83 | private: |
||
| 84 | IO_REG_TYPE bitmask; |
||
| 85 | volatile IO_REG_TYPE *baseReg; |
||
| 86 | |||
| 87 | #if ONEWIRE_SEARCH |
||
| 88 | // global search state |
||
| 89 | unsigned char ROM_NO[8]; |
||
| 90 | uint8_t LastDiscrepancy; |
||
| 91 | uint8_t LastFamilyDiscrepancy; |
||
| 92 | uint8_t LastDeviceFlag; |
||
| 93 | #endif |
||
| 94 | |||
| 95 | public: |
||
| 96 | OneWire( uint8_t pin); |
||
| 97 | |||
| 98 | // Perform a 1-Wire reset cycle. Returns 1 if a device responds |
||
| 99 | // with a presence pulse. Returns 0 if there is no device or the |
||
| 100 | // bus is shorted or otherwise held low for more than 250uS |
||
| 101 | uint8_t reset(void); |
||
| 102 | |||
| 103 | // Issue a 1-Wire rom select command, you do the reset first. |
||
| 104 | void select( uint8_t rom[8]); |
||
| 105 | |||
| 106 | // Issue a 1-Wire rom skip command, to address all on bus. |
||
| 107 | void skip(void); |
||
| 108 | |||
| 109 | // Write a byte. If 'power' is one then the wire is held high at |
||
| 110 | // the end for parasitically powered devices. You are responsible |
||
| 111 | // for eventually depowering it by calling depower() or doing |
||
| 112 | // another read or write. |
||
| 113 | void write(uint8_t v, uint8_t power = 0); |
||
| 114 | |||
| 115 | void write_bytes(const uint8_t *buf, uint16_t count, bool power = 0); |
||
| 116 | |||
| 117 | // Read a byte. |
||
| 118 | uint8_t read(void); |
||
| 119 | |||
| 120 | void read_bytes(uint8_t *buf, uint16_t count); |
||
| 121 | |||
| 122 | // Write a bit. The bus is always left powered at the end, see |
||
| 123 | // note in write() about that. |
||
| 124 | void write_bit(uint8_t v); |
||
| 125 | |||
| 126 | // Read a bit. |
||
| 127 | uint8_t read_bit(void); |
||
| 128 | |||
| 129 | // Stop forcing power onto the bus. You only need to do this if |
||
| 130 | // you used the 'power' flag to write() or used a write_bit() call |
||
| 131 | // and aren't about to do another read or write. You would rather |
||
| 132 | // not leave this powered if you don't have to, just in case |
||
| 133 | // someone shorts your bus. |
||
| 134 | void depower(void); |
||
| 135 | |||
| 136 | #if ONEWIRE_SEARCH |
||
| 137 | // Clear the search state so that if will start from the beginning again. |
||
| 138 | void reset_search(); |
||
| 139 | |||
| 140 | // Look for the next device. Returns 1 if a new address has been |
||
| 141 | // returned. A zero might mean that the bus is shorted, there are |
||
| 142 | // no devices, or you have already retrieved all of them. It |
||
| 143 | // might be a good idea to check the CRC to make sure you didn't |
||
| 144 | // get garbage. The order is deterministic. You will always get |
||
| 145 | // the same devices in the same order. |
||
| 146 | uint8_t search(uint8_t *newAddr); |
||
| 147 | #endif |
||
| 148 | |||
| 149 | #if ONEWIRE_CRC |
||
| 150 | // Compute a Dallas Semiconductor 8 bit CRC, these are used in the |
||
| 151 | // ROM and scratchpad registers. |
||
| 152 | static uint8_t crc8( uint8_t *addr, uint8_t len); |
||
| 153 | |||
| 154 | #if ONEWIRE_CRC16 |
||
| 155 | // Compute the 1-Wire CRC16 and compare it against the received CRC. |
||
| 156 | // Example usage (reading a DS2408): |
||
| 157 | // // Put everything in a buffer so we can compute the CRC easily. |
||
| 158 | // uint8_t buf[13]; |
||
| 159 | // buf[0] = 0xF0; // Read PIO Registers |
||
| 160 | // buf[1] = 0x88; // LSB address |
||
| 161 | // buf[2] = 0x00; // MSB address |
||
| 162 | // WriteBytes(net, buf, 3); // Write 3 cmd bytes |
||
| 163 | // ReadBytes(net, buf+3, 10); // Read 6 data bytes, 2 0xFF, 2 CRC16 |
||
| 164 | // if (!CheckCRC16(buf, 11, &buf[11])) { |
||
| 165 | // // Handle error. |
||
| 166 | // } |
||
| 167 | // |
||
| 168 | // @param input - Array of bytes to checksum. |
||
| 169 | // @param len - How many bytes to use. |
||
| 170 | // @param inverted_crc - The two CRC16 bytes in the received data. |
||
| 171 | // This should just point into the received data, |
||
| 172 | // *not* at a 16-bit integer. |
||
| 173 | // @return True, iff the CRC matches. |
||
| 174 | static bool check_crc16(uint8_t* input, uint16_t len, uint8_t* inverted_crc); |
||
| 175 | |||
| 176 | // Compute a Dallas Semiconductor 16 bit CRC. This is required to check |
||
| 177 | // the integrity of data received from many 1-Wire devices. Note that the |
||
| 178 | // CRC computed here is *not* what you'll get from the 1-Wire network, |
||
| 179 | // for two reasons: |
||
| 180 | // 1) The CRC is transmitted bitwise inverted. |
||
| 181 | // 2) Depending on the endian-ness of your processor, the binary |
||
| 182 | // representation of the two-byte return value may have a different |
||
| 183 | // byte order than the two bytes you get from 1-Wire. |
||
| 184 | // @param input - Array of bytes to checksum. |
||
| 185 | // @param len - How many bytes to use. |
||
| 186 | // @return The CRC16, as defined by Dallas Semiconductor. |
||
| 187 | static uint16_t crc16(uint8_t* input, uint16_t len); |
||
| 188 | #endif |
||
| 189 | #endif |
||
| 190 | }; |
||
| 191 | |||
| 192 | #endif |