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 |