00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00020 #include "sceptre.h"
00021 #include "ds18b20.h"
00022
00023
00024 #define DS18B20_PIN 19
00025 #define DS18B20_OUTPUT IODIR1 |= (1<<DS18B20_PIN)
00026 #define DS18B20_INPUT IODIR1 &= ~(1<<DS18B20_PIN)
00027 #define DS18B20_SET IOSET1 = (1<<DS18B20_PIN)
00028 #define DS18B20_CLR IOCLR1 = (1<<DS18B20_PIN)
00029 #define DS18B20_READ_BIT (IOPIN1&(1<<DS18B20_PIN))==0? 0 : 1
00030
00031
00032 #define DS18B20_ROM_SEARCH (0xf0)
00033 #define DS18B20_ROM_READ (0x33)
00034 #define DS18B20_ROM_MATCH (0x55)
00035 #define DS18B20_ROM_SKIP (0xcc)
00036 #define DS18B20_ROM_SEARCH_ALARM (0xec)
00037 #define DS18B20_FUNCTION_CONVERT (0x44)
00038 #define DS18B20_FUNCTION_WRITE_SCRATCHPAD (0x4e)
00039 #define DS18B20_FUNCTION_READ_SCRATCHPAD (0xbe)
00040 #define DS18B20_FUNCTION_COPY_SCRATCHPAD (0x48)
00041 #define DS18B20_FUNCTION_RECALL (0xb8)
00042 #define DS18B20_FUNCTION_READ_POWER_SUPPLY (0xb4)
00043
00044 #define ONEWIRE_DEVICE_PRESENT 1
00045 #define ONEWIRE_NO_DEVICE 0
00046
00047
00048 const uint8_t onewire_crc_table[] =
00049 {
00050 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
00051 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
00052 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
00053 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
00054 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
00055 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
00056 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
00057 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
00058 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
00059 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
00060 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
00061 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
00062 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
00063 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
00064 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
00065 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
00066 };
00067
00068
00069 static uint8_t onewire_crc8 = 0;
00070
00071 uint8_t onewire_do_crc8(uint8_t value);
00072 void onewire_wait_us(uint32_t us);
00073 uint8_t onewire_read_bit(void);
00074 void onewire_write_bit(uint8_t bit);
00075 uint8_t onewire_reset(void);
00076 uint8_t onewire_read_byte(void);
00077 void onewire_write_byte(uint8_t byte);
00078 bool_t onewire_read_serial(uint8_t *p_serial);
00079
00080
00089 uint8_t onewire_do_crc8(uint8_t value)
00090 {
00091 onewire_crc8 = onewire_crc_table[onewire_crc8 ^ value];
00092 return onewire_crc8;
00093 }
00094
00095
00112 void onewire_wait_us(uint32_t us)
00113 {
00114 volatile uint32_t count = 4*us;
00115 while (count>0) count -= 1;
00116 }
00117
00118
00124 uint8_t onewire_read_bit(void)
00125 {
00126
00127 DS18B20_OUTPUT;
00128 DS18B20_CLR;
00129
00130 onewire_wait_us(6);
00131 DS18B20_INPUT;
00132
00133 onewire_wait_us(9);
00134 uint8_t bit = DS18B20_READ_BIT;
00135 onewire_wait_us(55);
00136 return bit;
00137 }
00138
00139
00145 void onewire_write_bit(uint8_t bit)
00146 {
00147 uint32_t delay1;
00148 uint32_t delay2;
00149
00150 if (bit==0)
00151 {
00152 delay1 = 60;
00153 delay2 = 10;
00154 }
00155 else
00156 {
00157 delay1 = 6;
00158 delay2 = 64;
00159 }
00160
00161
00162 DS18B20_OUTPUT;
00163 DS18B20_CLR;
00164
00165
00166 onewire_wait_us(delay1);
00167 DS18B20_INPUT;
00168 onewire_wait_us(delay2);
00169 }
00170
00171
00177 uint8_t onewire_reset(void)
00178 {
00179 onewire_wait_us(0);
00180
00181 DS18B20_OUTPUT;
00182 DS18B20_CLR;
00183 onewire_wait_us(480);
00184 DS18B20_INPUT;
00185 onewire_wait_us(70);
00186 uint8_t bit = DS18B20_READ_BIT;
00187 onewire_wait_us(410);
00188 return bit==0? ONEWIRE_DEVICE_PRESENT : ONEWIRE_NO_DEVICE;
00189 }
00190
00191
00197 uint8_t onewire_read_byte(void)
00198 {
00199 uint8_t result = 0;
00200 uint8_t mask = 0x01;
00201 while (mask!=0)
00202 {
00203 if (onewire_read_bit()==1) result |= mask;
00204 mask <<= 1;
00205 }
00206 return result;
00207 }
00208
00209
00215 void onewire_write_byte(uint8_t byte)
00216 {
00217 uint8_t mask = 0x01;
00218 while (mask!=0)
00219 {
00220 onewire_write_bit(byte&mask);
00221 mask <<= 1;
00222 }
00223 }
00224
00225
00232 bool_t onewire_read_serial(uint8_t *p_serial)
00233 {
00234 bool_t result = false;
00235 if (onewire_reset()==ONEWIRE_DEVICE_PRESENT)
00236 {
00237 onewire_crc8 = 0;
00238 onewire_write_byte(DS18B20_ROM_READ);
00239 for (int i=0; i<8; i++)
00240 {
00241 p_serial[i] = onewire_read_byte();
00242 if (i<7) onewire_do_crc8(p_serial[i]);
00243 }
00244 result = p_serial[7]==onewire_crc8? true : false;
00245 }
00246 return result;
00247 }
00248
00249
00255 bool_t ds18b20_init(void)
00256 {
00257 return onewire_reset()==ONEWIRE_DEVICE_PRESENT? true : false;
00258 }
00259
00260
00269 bool_t ds18b20_write_scratchpad(uint8_t th, uint8_t tl, uint8_t config)
00270 {
00271 if (onewire_reset()==ONEWIRE_DEVICE_PRESENT)
00272 {
00273 onewire_write_byte(DS18B20_ROM_SKIP);
00274 onewire_write_byte(DS18B20_FUNCTION_WRITE_SCRATCHPAD);
00275 onewire_write_byte(th);
00276 onewire_write_byte(tl);
00277 onewire_write_byte(config);
00278 return true;
00279 }
00280 return false;
00281 }
00282
00283
00289 float ds18b20_read_temperature(void)
00290 {
00291 float result = -100;
00292 if (onewire_reset()==ONEWIRE_DEVICE_PRESENT)
00293 {
00294 onewire_write_byte(DS18B20_ROM_SKIP);
00295 onewire_write_byte(DS18B20_FUNCTION_CONVERT);
00296 while (DS18B20_READ_BIT==0);
00297 onewire_reset();
00298 onewire_write_byte(DS18B20_ROM_SKIP);
00299 onewire_write_byte(DS18B20_FUNCTION_READ_SCRATCHPAD);
00300 uint16_t iresult = onewire_read_byte();
00301 iresult += ((uint16_t)onewire_read_byte()<<8);
00302 result = iresult/16.0;
00303
00304 }
00305 return result;
00306 }
00307
00308
00318 int ds18b20_read(void *p_dst, uint32_t dst_size)
00319 {
00320 float result = ds18b20_read_temperature();
00321 if (result>-100)
00322 {
00323 *(float *)p_dst = result;
00324 return sizeof(float);
00325 }
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 return -1;
00343 }
00344
00345
00355 int ds18b20_write(const uint8_t *p_src, uint32_t src_size)
00356 {
00357 if (src_size>=3)
00358 {
00359 if (ds18b20_write_scratchpad(p_src[0],p_src[1],p_src[2])==true) return 3*sizeof(uint8_t);
00360 }
00361 return -1;
00362 }
00363
00364
00371 bool_t ds18b20_read_serial(uint8_t *p_serial)
00372 {
00373 return onewire_read_serial(p_serial);
00374 }
00375
00376