Revision 168:bfc84ee2839b analog_exp/onewire.c

b/analog_exp/onewire.c
1
#include <string.h>
2

  
3
#include "debug.h"
1 4
#include "onewire_hal.h"
2 5
#include "onewire.h"
3 6

  
......
12 15
    }
13 16
}
14 17

  
15
uint8_t onewire_rx_byte(uint8_t data) {
18
uint8_t onewire_rx_byte(void) {
16 19
    uint8_t data = 0;
17 20
    for(uint8_t i=0; i<8; i++) {
18 21
        data >>= 1;
......
22 25
}
23 26

  
24 27
void onewire_readrom(onewire_id id) {
28
    onewire_reset();
25 29
    onewire_tx_byte(ONEWIRE_CMD_READROM);
26 30
    for(uint8_t i=0; i<8; i++) {
27 31
        id[i] = onewire_rx_byte();
......
29 33
}
30 34

  
31 35
void onewire_matchrom(onewire_id id) {
36
    onewire_reset();
32 37
    onewire_tx_byte(ONEWIRE_CMD_MATCHROM);
33 38
    for(uint8_t i=0; i<8; i++) {
34 39
        onewire_tx_byte(id[i]);
35 40
    }
36 41
}
37 42

  
43
void onewire_skiprom(void) {
44
    onewire_reset();
45
    onewire_tx_byte(ONEWIRE_CMD_SKIPROM);
46
}
47

  
38 48
typedef struct {
39 49
    bool done;
40 50
    uint8_t next_id;
......
66 76
                state->bit_pattern[bit_index / 8] |=  (1<<(bit_index % 8));
67 77
            } else if(bit_index > state->prev_deviation) {
68 78
                state->bit_pattern[bit_index / 8] &= ~(1<<(bit_index % 8));
69
            } else if(bit_pattern[bit_index / 8] & (1<<(bit_index % 8)) == 0) {
79
                deviation = bit_index;
80
            } else if((state->bit_pattern[bit_index / 8] & (1<<(bit_index % 8))) == 0) {
70 81
                deviation = bit_index;
71 82
            }
72 83
        }
73
        if(bit_pattern[bit_index / 8] & (1<<(bit_index % 8))) {
84
        if(state->bit_pattern[bit_index / 8] & (1<<(bit_index % 8))) {
74 85
            onewire_tx1();
75 86
        } else {
76 87
            onewire_tx0();
77 88
        }
78 89
    }
79
    if(deviation = -1) state->done = true;
90
    if(deviation == -1) state->done = true;
80 91
    state->prev_deviation = deviation;
81 92
    return true;
82 93
}
......
85 96
    onewire_search_state_t state;
86 97
    state.done = false;
87 98
    state.next_id = 0;
88
    state.deviation = -1;
89
    memset(bit_pattern, 0, sizeof(onewire_id));
99
    state.prev_deviation = -1;
100
    memset(state.bit_pattern, 0, sizeof(onewire_id));
90 101
    
91 102
    while(*n > 0 && onewire_search_iter(&state)) {
92 103
        memcpy(id_list[state.next_id++], state.bit_pattern, sizeof(onewire_id));
93
        *n--;
104
        *n = *n - 1;
94 105
    }
95 106

  
96 107
    *n = state.next_id;
97 108
}
98 109

  
110
static uint8_t onewire_crc8_byte(uint8_t seed, uint8_t data) {
111
    const uint8_t poly = 0x18;
112
    for(uint8_t i=0; i<8; i++) {
113
        if((data ^ seed) & 1) {
114
            seed = ((seed ^ poly) >> 1) | 0x80;
115
        } else {
116
            seed >>= 1;
117
        }
118
        data >>= 1;
119
    }
120
    return seed;
121
}
122

  
123
uint8_t onewire_crc8(uint8_t *data, uint8_t length) {
124
    uint8_t crc = 0;
125
    for(; length > 0; length--) {
126
        crc = onewire_crc8_byte(crc, *data++);
127
    }
128
    return crc;
129
}
130

  
131
bool onewire_crc_rom(onewire_id id) {
132
    return onewire_crc8(id, 8) == 0;
133
}
134

  
135
void onewire_convert_t(void) {
136
    onewire_tx_byte(ONEWIRE_CMD_CONVERT_T);
137
}
138

  
139
void onewire_write_scratchpad(uint8_t th, uint8_t tl, uint8_t config) {
140
    onewire_tx_byte(ONEWIRE_CMD_WRITE_SCRATCHPAD);
141
    onewire_tx_byte(th);
142
    onewire_tx_byte(tl);
143
    onewire_tx_byte(config);
144
}
145

  
146
bool onewire_read_scratchpad(ds18b20_scratchpad_t *scratchpad) {
147
    onewire_tx_byte(ONEWIRE_CMD_READ_SCRATCHPAD);
148
    uint8_t *buf = (uint8_t*)scratchpad;
149
    for(uint8_t i=0; i<sizeof(ds18b20_scratchpad_t); i++) {
150
        *buf++ = onewire_rx_byte();
151
    }
152

  
153
    return onewire_crc8((uint8_t*)scratchpad, sizeof(ds18b20_scratchpad_t)) == 0;
154
}
155

  

Also available in: Unified diff