Arduino-TWI
Two-Wire Interface (TWI) library for Arduino
DS2482.ino
Go to the documentation of this file.
1 #include "GPIO.h"
2 #include "TWI.h"
3 #include "Driver/DS2482.h"
4 #include "assert.h"
5 
6 // Configure: Software or Hardware TWI
7 // #define USE_SOFTWARE_TWI
8 #if defined(USE_SOFTWARE_TWI)
9 #include "Software/TWI.h"
10 #if defined(SAM)
12 #else
14 #endif
15 #else
16 #include "Hardware/TWI.h"
18 #endif
19 
20 DS2482 owi(twi);
21 
22 const size_t ROM_MAX = 8;
23 const uint8_t CHARBITS = 8;
24 
25 // 1-Wire ROM and DS18B20 commands
26 enum {
27  SEARCH_ROM = 0xF0,
28  READ_ROM = 0x33,
29  MATCH_ROM = 0x55,
30  SKIP_ROM = 0xCC,
31  ALARM_SEARCH = 0xEC,
32  CONVERT_T = 0x44,
34 };
35 
36 // DS18B20 scratchpad
37 struct scratchpad_t {
38  int16_t temperature;
39  int8_t high_trigger;
40  int8_t low_trigger;
41  uint8_t configuration;
42  uint8_t reserved[3];
43  uint8_t crc;
44 };
45 
46 // 1-Wire CRC calculation
47 uint8_t one_wire_crc_update(uint8_t crc, uint8_t data)
48 {
49  crc = crc ^ data;
50  for (uint8_t i = 0; i < 8; i++) {
51  if (crc & 0x01)
52  crc = (crc >> 1) ^ 0x8C;
53  else
54  crc >>= 1;
55  }
56  return (crc);
57 }
58 
59 void setup()
60 {
61  Serial.begin(57600);
62  while (!Serial);
63 
64  // Reset and configure the TWI 1-Wire Master
65  ASSERT(owi.device_reset());
66  ASSERT(owi.write_configuration());
67 
68  // Read and print registers
69  uint8_t config;
71  TRACE(config);
72 
73  uint8_t data;
75  TRACE(data);
76 
77  uint8_t status;
78  ASSERT(owi.set_read_pointer(owi.STATUS_REGISTER, status));
79  TRACE(status);
80 
81 #if defined(DS2482_800)
82  uint8_t channel;
84  TRACE(channel);
85 #endif
86 
87  // Read and print rom from device on 1-Wire bus
88  uint8_t rom[ROM_MAX] = { 0 };
89  uint8_t crc = 0;
90  ASSERT(owi.one_wire_reset());
92  Serial.print(F("read_rom="));
93  for (size_t i = 0; i < sizeof(rom); i++) {
94  owi.one_wire_read_byte(rom[i]);
95  if (rom[i] < 0x10) Serial.print(0);
96  Serial.print(rom[i], HEX);
97  crc = one_wire_crc_update(crc, rom[i]);
98  }
99  Serial.println();
100  ASSERT(crc == 0);
101 
102  // Search device on 1-Wire bus and print rom
103  uint8_t bits = 0;
104  uint8_t ix = 0;
105  uint8_t value = 0;
106  uint8_t dir = 0;
107  int8_t res = 0;
108  bool id;
109  bool nid;
110  crc = 0;
111  ASSERT(owi.one_wire_reset());
113  Serial.print(F("search_rom="));
114  do {
115  res = owi.one_wire_triplet(dir);
116  if (res < 0) break;
117  id = (res & 1) != 0;
118  nid = (res & 2) != 0;
119  value = (value >> 1);
120  if (dir) value |= 0x80;
121  bits += 1;
122  if (bits == CHARBITS) {
123  rom[ix] = value;
124  if (rom[ix] < 0x10) Serial.print(0);
125  Serial.print(rom[ix], HEX);
126  crc = one_wire_crc_update(crc, rom[ix]);
127  ix += 1;
128  bits = 0;
129  value = 0;
130  }
131  } while (id != nid);
132  Serial.println();
133  ASSERT(crc == 0);
134 }
135 
136 void loop()
137 {
138  // Convert and read temperature
139  ASSERT(owi.one_wire_reset());
142  delay(750);
143 
144  ASSERT(owi.one_wire_reset());
147 
148  // Print scatchpad and calculate check sum
149  scratchpad_t scratchpad;
150  uint8_t* p = (uint8_t*) &scratchpad;
151  uint8_t crc = 0;
152  Serial.print(F("read_scratchpad="));
153  for (size_t i = 0; i < sizeof(scratchpad); i++) {
154  ASSERT(owi.one_wire_read_byte(p[i]));
155  if (i == sizeof(scratchpad) - 1) Serial.print(F(",crc="));
156  if (p[i] < 0x10) Serial.print('0');
157  Serial.print(p[i], HEX);
158  crc = one_wire_crc_update(crc, p[i]);
159  }
160  ASSERT(crc == 0);
161 
162  // Print temperature (convert from fixed to floating point number)
163  Serial.print(',');
164  float temperature = scratchpad.temperature * 0.0625;
165  TRACE(temperature);
166  delay(2000);
167 }
bool write_configuration(bool apu=true, bool spu=false, bool iws=false)
Definition: DS2482.h:242
bool one_wire_reset()
Definition: DS2482.h:45
uint8_t one_wire_crc_update(uint8_t crc, uint8_t data)
Definition: DS2482.ino:47
const size_t ROM_MAX
Definition: DS2482.ino:22
bool set_read_pointer(Register addr, uint8_t &value)
Definition: DS2482.h:289
uint8_t configuration
Definition: DS2482.ino:41
uint8_t crc
Definition: DS2482.ino:43
void setup()
Definition: DS2482.ino:59
Hardware::TWI twi
Definition: DS2482.ino:17
bool device_reset()
Definition: DS2482.h:212
Definition: DS2482.h:28
bool one_wire_write_byte(uint8_t value)
Definition: DS2482.h:155
void loop()
Definition: DS2482.ino:136
int8_t high_trigger
Definition: DS2482.ino:39
int16_t temperature
Definition: DS2482.ino:38
uint8_t reserved[3]
Definition: DS2482.ino:42
DS2482 owi(twi)
int8_t one_wire_triplet(uint8_t &dir)
Definition: DS2482.h:183
const uint8_t CHARBITS
Definition: DS2482.ino:23
int8_t low_trigger
Definition: DS2482.ino:40
virtual bool one_wire_read_byte(uint8_t &value)
Definition: DS2482.h:125