Commit b3f997a0600a0d7ce6cd2a390c37cc85d97ae578
1 parent
e08f5763
--no commit message
Showing
7 changed files
with
145 additions
and
115 deletions
Project/applications/smartcities/i2c.c
... | ... | @@ -27,6 +27,9 @@ void I2C_init(void) |
27 | 27 | I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // set address length to 7 bit addresses |
28 | 28 | I2C_Init(I2C1, &I2C_InitStruct); // init I2C1 |
29 | 29 | |
30 | + //Enable clock stretching | |
31 | + I2C_StretchClockCmd(I2C1, ENABLE); | |
32 | + | |
30 | 33 | // enable I2C1 |
31 | 34 | I2C_Cmd(I2C1, ENABLE); //sets PE bit in CR1, at end` |
32 | 35 | } |
... | ... | @@ -38,18 +41,53 @@ void I2C_start(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction) |
38 | 41 | { |
39 | 42 | // wait until I2C1 is not busy any more |
40 | 43 | } |
44 | + printf("I2C ready\r\n"); | |
45 | + I2C_GenerateSTART(I2Cx, ENABLE); | |
46 | + printf("Start sent\r\n"); | |
47 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) | |
48 | + { | |
49 | + // wait for I2C1 EV5 --> Slave has acknowledged start condition | |
50 | + } | |
51 | + printf("Start ACK\r\n"); | |
52 | + I2C_Send7bitAddress(I2Cx, address, direction); | |
53 | + printf("Master -> Slave Address and R/W sent\r\n"); | |
54 | + if(direction == I2C_Direction_Transmitter) | |
55 | + { | |
56 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) | |
57 | + { | |
58 | + // wait for I2Cx EV6, check if Slave has acknowledged Master transmitter mode | |
59 | + } | |
60 | + printf("Slave -> Master ACK\r\n"); | |
61 | + } | |
62 | + else if(direction == I2C_Direction_Receiver) | |
63 | + { | |
64 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) | |
65 | + { | |
66 | + // wait for I2Cx EV6, check if Slave has acknowledged Master receiver mode | |
67 | + } | |
68 | + printf("Slave -> Master ACK\r\n"); | |
69 | + } | |
70 | +} | |
71 | + | |
72 | +void I2C_restart(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction) | |
73 | +{ | |
74 | + printf("Sending repeated I2C Start...\r\n"); | |
41 | 75 | I2C_GenerateSTART(I2Cx, ENABLE); |
76 | + printf("Start sent\r\n"); | |
42 | 77 | while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) |
43 | 78 | { |
44 | 79 | // wait for I2C1 EV5 --> Slave has acknowledged start condition |
45 | 80 | } |
81 | + printf("Start ACK\r\n"); | |
46 | 82 | I2C_Send7bitAddress(I2Cx, address, direction); |
83 | + printf("Master -> Slave Address and R/W sent\r\n"); | |
47 | 84 | if(direction == I2C_Direction_Transmitter) |
48 | 85 | { |
49 | 86 | while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) |
50 | 87 | { |
51 | 88 | // wait for I2Cx EV6, check if Slave has acknowledged Master transmitter mode |
52 | 89 | } |
90 | + printf("Slave -> Master ACK\r\n"); | |
53 | 91 | } |
54 | 92 | else if(direction == I2C_Direction_Receiver) |
55 | 93 | { |
... | ... | @@ -57,6 +95,7 @@ void I2C_start(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction) |
57 | 95 | { |
58 | 96 | // wait for I2Cx EV6, check if Slave has acknowledged Master receiver mode |
59 | 97 | } |
98 | + printf("Slave -> Master ACK\r\n"); | |
60 | 99 | } |
61 | 100 | } |
62 | 101 | |
... | ... | @@ -68,6 +107,7 @@ void I2C_write(I2C_TypeDef* I2Cx, uint8_t data) |
68 | 107 | { |
69 | 108 | // wait for I2C1 EV8_2 --> last byte is transmitted |
70 | 109 | } |
110 | + printf("Data sent\r\n"); | |
71 | 111 | } |
72 | 112 | |
73 | 113 | uint8_t I2C_read_ack(I2C_TypeDef* I2Cx) |
... | ... | @@ -105,6 +145,7 @@ void I2C_stop(I2C_TypeDef* I2Cx) |
105 | 145 | { |
106 | 146 | // wait for I2C1 EV8_2 --> byte has been transmitted |
107 | 147 | }*/ |
148 | + printf("Stop sent\r\n"); | |
108 | 149 | } |
109 | 150 | |
110 | 151 | uint8_t I2C_check(I2C_TypeDef* I2Cx, uint8_t address) |
... | ... | @@ -126,34 +167,34 @@ uint8_t I2C_check(I2C_TypeDef* I2Cx, uint8_t address) |
126 | 167 | return 1; |
127 | 168 | } |
128 | 169 | printf("I2C address detected: %x\r\n", address); |
129 | - I2C_write(I2C1,0x00); | |
130 | - I2C_stop(I2C1); | |
170 | + I2C_write(I2Cx,0x00); | |
171 | + I2C_stop(I2Cx); | |
131 | 172 | return 0; |
132 | 173 | } |
133 | 174 | |
134 | -void I2C_reset() | |
175 | +void I2C_reset(I2C_TypeDef* I2Cx) | |
135 | 176 | { |
136 | 177 | printf("Resetting I2C...\r\n"); |
137 | - I2C_SoftwareResetCmd(I2C1, ENABLE); | |
138 | - I2C_DeInit(I2C1); | |
178 | + I2C_SoftwareResetCmd(I2Cx, ENABLE); | |
179 | + I2C_DeInit(I2Cx); | |
139 | 180 | I2C_init(); |
140 | 181 | |
141 | 182 | } |
142 | 183 | |
143 | -void I2C_scan(uint8_t *addresses) | |
184 | +void I2C_scan(I2C_TypeDef* I2Cx,uint8_t *addresses) | |
144 | 185 | { |
145 | 186 | uint8_t i, j = 0; |
146 | 187 | I2C_init(); |
147 | 188 | for(i = 0; i < TOTAL_SENSORS; i++) |
148 | 189 | { |
149 | - if(!I2C_check(I2C1,sensors[i]->ID << 1)) | |
190 | + if(!I2C_check(I2Cx,sensors[i]->ID << 1)) | |
150 | 191 | { |
151 | 192 | addresses[j++] = sensors[i]->ID; |
152 | 193 | register_sensor(*sensors[i]); |
153 | 194 | } |
154 | 195 | else |
155 | 196 | { |
156 | - I2C_reset(); | |
197 | + I2C_reset(I2Cx); | |
157 | 198 | } |
158 | 199 | } |
159 | 200 | register_sensor(battery); | ... | ... |
Project/applications/smartcities/include/i2c.h
... | ... | @@ -15,9 +15,10 @@ void I2C_stop(I2C_TypeDef* I2Cx); |
15 | 15 | void I2C_write(I2C_TypeDef* I2Cx, uint8_t data); |
16 | 16 | uint8_t I2C_read_ack(I2C_TypeDef* I2Cx); |
17 | 17 | uint8_t I2C_read_nack(I2C_TypeDef* I2Cx); |
18 | -void I2C_scan(uint8_t *addresses); | |
18 | +void I2C_scan(I2C_TypeDef* I2Cx,uint8_t *addresses); | |
19 | 19 | uint8_t I2C_check(I2C_TypeDef* I2Cx, uint8_t address); |
20 | -void I2C_reset(void); | |
20 | +void I2C_reset(I2C_TypeDef* I2Cx); | |
21 | +void I2C_restart(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction); | |
21 | 22 | |
22 | 23 | |
23 | 24 | #endif | ... | ... |
Project/applications/smartcities/include/json.h
... | ... | @@ -20,7 +20,7 @@ |
20 | 20 | |
21 | 21 | uint8_t register_sensor(sensor sens); |
22 | 22 | char* prepare_json_observation_statement(char** data, uint32_t nObservations); |
23 | -char* prepare_json_register_statement(module mod, sensor sens); | |
23 | +char* prepare_json_register_statement(module mod, sensor sens, char *additional_info); | |
24 | 24 | char* prepare_observation(char* observation, uint32_t length); |
25 | 25 | uint8_t send_json(char* statement, uint32_t length, char* provider_ID, char* sensor_ID); |
26 | 26 | uint32_t find_next_index(char* string, uint32_t length, char delimiter); | ... | ... |
Project/applications/smartcities/include/sensors.h
... | ... | @@ -24,7 +24,6 @@ typedef struct { |
24 | 24 | char* description; |
25 | 25 | char* type; |
26 | 26 | char* unit; |
27 | - char* additional_info; | |
28 | 27 | } sensor; |
29 | 28 | |
30 | 29 | void wakeup_sensors(uint8_t logic_address); |
... | ... | @@ -50,8 +49,6 @@ char* light_value(uint32_t light); |
50 | 49 | //ULTRASONIC SENSOR |
51 | 50 | uint16_t get_distance_data(void); |
52 | 51 | void init_ultrasound(void); |
53 | -uint8_t get_distance_low(void); | |
54 | -uint8_t get_distance_high(void); | |
55 | 52 | char* distance_value(uint16_t distance); |
56 | 53 | |
57 | 54 | ... | ... |
Project/applications/smartcities/json.c
... | ... | @@ -7,14 +7,15 @@ uint8_t register_sensor(sensor sens) |
7 | 7 | char *statement; |
8 | 8 | if(sens.ID == PRESSURE_ADDR) |
9 | 9 | { |
10 | - sens.additional_info = callibration_pressure_data_csv(get_pressure_callibration_data()); | |
11 | - statement = prepare_json_register_statement(mod,sens); | |
12 | - chHeapFree(sens.additional_info); | |
13 | - sens.additional_info = NULL; | |
10 | + printf("Putting additional info for pressure sensor...\r\n"); | |
11 | + char *callibration_data = callibration_pressure_data_csv(get_pressure_callibration_data()); | |
12 | + printf("callibration_data is: %s\r\n",callibration_data); | |
13 | + statement = prepare_json_register_statement(mod,sens,callibration_data); | |
14 | + chHeapFree(callibration_data); | |
14 | 15 | } |
15 | 16 | else |
16 | 17 | { |
17 | - statement = prepare_json_register_statement(mod,sens); | |
18 | + statement = prepare_json_register_statement(mod,sens,NULL); | |
18 | 19 | } |
19 | 20 | printf("%s\r\n",statement); |
20 | 21 | char sensor_ID[3]; |
... | ... | @@ -44,7 +45,7 @@ char* prepare_json_observation_statement(char** data, uint32_t nObservations) |
44 | 45 | return json_statement; |
45 | 46 | } |
46 | 47 | |
47 | -char* prepare_json_register_statement(module mod, sensor sens) | |
48 | +char* prepare_json_register_statement(module mod, sensor sens, char *additional_info) | |
48 | 49 | { |
49 | 50 | printf("Registering sensor: %s in: %s\r\n",sens.description,mod.geoloc); |
50 | 51 | unsigned int length; |
... | ... | @@ -79,11 +80,15 @@ char* prepare_json_register_statement(module mod, sensor sens) |
79 | 80 | str_aux = join_strings(str_aux2,mod.geoloc,length,strlen(mod.geoloc),JOIN_NO_FREE); |
80 | 81 | chHeapFree(str_aux2); |
81 | 82 | length += strlen(mod.geoloc); |
82 | - if(sens.additional_info != NULL) | |
83 | + if(additional_info != NULL) | |
83 | 84 | { |
84 | - str_aux2 = join_strings(str_aux,sens.additional_info,length,strlen(sens.additional_info),JOIN_NO_FREE); | |
85 | + printf("In prepare_json_register_statement: Detected additional_info\r\n"); | |
86 | + str_aux2 = join_strings(str_aux,"\",\"additionalInfo\":\"",length,20,JOIN_NO_FREE); | |
87 | + chHeapFree(str_aux); | |
88 | + length += 20; | |
89 | + str_aux = join_strings(str_aux2,additional_info,length,strlen(additional_info),JOIN_NO_FREE); | |
85 | 90 | chHeapFree(str_aux2); |
86 | - length += strlen(sens.additional_info); | |
91 | + length += strlen(additional_info); | |
87 | 92 | } |
88 | 93 | json_statement = join_strings(str_aux,"\"}]}\0",length,5,JOIN_NO_FREE); |
89 | 94 | chHeapFree(str_aux); | ... | ... |
Project/applications/smartcities/main2.c
... | ... | @@ -140,10 +140,10 @@ void put_buffers(char** buffers[],uint32_t ind[],uint32_t sizes[],char** cooked, |
140 | 140 | printf("For %d and %d\n\r", ind[i],sizes[i]); |
141 | 141 | printf("Putting data: %s\n\r",cooked[i]); |
142 | 142 | buffers[i] = put_message(cooked[i], buffers[i] ,&ind[i],&sizes[i]); |
143 | - printf("Message put: %s\r\n",buffers[0][ind[0]-1]); | |
143 | + printf("Message put: %s\r\n",buffers[i][ind[i]-1]); | |
144 | 144 | chHeapFree(cooked[i]); |
145 | 145 | printf("Memory freed\n\r"); |
146 | - printf("Message put (assertion): %s\r\n",buffers[0][ind[0]-1]); | |
146 | + printf("Message put (assertion): %s with length %d\r\n",buffers[i][ind[i]-1] ,strlen(buffers[i][ind[i]-1])); | |
147 | 147 | } |
148 | 148 | |
149 | 149 | } |
... | ... | @@ -238,14 +238,10 @@ int main(void) |
238 | 238 | printf("Scanning sensors...\r\n"); |
239 | 239 | //Escanea los sensores -> retorna un vector con las direcciones en cada posiciรณn del vector, si la posiciรณn del vector retorna un cero -> no existe el sensor |
240 | 240 | //Escanea y registra |
241 | - I2C_scan(sensors); | |
241 | + I2C_scan(I2C1,sensors); | |
242 | 242 | sensors_length=strlen((char*)sensors); |
243 | 243 | printf("%d sensor detected...\r\n",sensors_length); |
244 | 244 | |
245 | - I2C_init(); | |
246 | - printf("%s\r\n",light_value(get_light_data())); | |
247 | - printf("%s\r\n",light_value(get_light_data())); | |
248 | - | |
249 | 245 | unsigned long time; |
250 | 246 | update_time(&time); |
251 | 247 | //desconectarwifi |
... | ... | @@ -262,15 +258,26 @@ int main(void) |
262 | 258 | int i = 1; |
263 | 259 | |
264 | 260 | while(1){ |
261 | + if(ind[0]) | |
262 | + { | |
263 | + printf("Data stored in buffer: %s with index %d and size %d\r\n",buffers[0][ind[0]-1], ind[0],sizes[0]); | |
264 | + } | |
265 | 265 | time += getElapsedTime(delay); |
266 | 266 | printf("time (absolute):\t%ul\r\ntime mod LONG_PERIOD:\t%ul\r\ntime mod SHORT_PERIOD:\t%ul\r\n",time,time%LONG_PERIOD,time%SHORT_PERIOD); |
267 | 267 | |
268 | 268 | delay = getSystemTime(); |
269 | 269 | /* Collect data from sensors */ |
270 | + if(ind[0]) | |
271 | + { | |
272 | + printf("Data stored in buffer: %s with index %d and size %d\r\n",buffers[0][ind[0]-1], ind[0],sizes[0]); | |
273 | + } | |
270 | 274 | printf("Collecting data...\r\n"); |
271 | 275 | collectData(valueSensors, sensors); |
272 | 276 | printf("Data collected...\r\n"); |
273 | - | |
277 | + if(ind[0]) | |
278 | + { | |
279 | + printf("Data stored in buffer: %s with index %d and size %d\r\n",buffers[0][ind[0]-1], ind[0],sizes[0]); | |
280 | + } | |
274 | 281 | time += getElapsedTime(delay); |
275 | 282 | printf("time (absolute):\t%ul\r\ntime mod LONG_PERIOD:\t%ul\r\ntime mod SHORT_PERIOD:\t%ul\r\n",time,time%LONG_PERIOD,time%SHORT_PERIOD); |
276 | 283 | timestamp = time; |
... | ... | @@ -363,7 +370,6 @@ int main(void) |
363 | 370 | /* |
364 | 371 | * TO-DO |
365 | 372 | * |
366 | - * - I2C issues | |
367 | 373 | * - Test all sensors |
368 | 374 | * - Test ADC |
369 | 375 | * - Test register, data send and battery send | ... | ... |
Project/applications/smartcities/sensors.c
1 | 1 | #include "sensors.h" |
2 | 2 | |
3 | -sensor light_sensor = {LIGHT_ADDR, "Light sensor", "illumination", "lux", NULL}; | |
4 | -sensor ultrasound_sensor = {DISTANCE_ADDR, "Ultrasound sensor", "distance", "cm", NULL}; | |
5 | -sensor pressure_sensor = {PRESSURE_ADDR, "Pressure sensor", "pressure", "hPa", NULL}; | |
6 | -sensor humidity_temp_sensor = {HUMIDITY_TEMP_ADDR, "Temperature and humidity sensor", "temperature,humidity", "ยบC,RH",NULL}; | |
7 | -sensor sound_sensor = {SOUND_ADDR, "Sound sensor", "sound", "mV", NULL}; | |
8 | -sensor battery = {BATTERY_ADDR, "Battery Level", "power", "mV", NULL}; | |
3 | +sensor light_sensor = {LIGHT_ADDR, "Light sensor", "illumination", "lux"}; | |
4 | +sensor ultrasound_sensor = {DISTANCE_ADDR, "Ultrasound sensor", "distance", "cm"}; | |
5 | +sensor pressure_sensor = {PRESSURE_ADDR, "Pressure sensor", "pressure", "hPa"}; | |
6 | +sensor humidity_temp_sensor = {HUMIDITY_TEMP_ADDR, "Temperature and humidity sensor", "temperature,humidity", "ยบC,RH"}; | |
7 | +sensor sound_sensor = {SOUND_ADDR, "Sound sensor", "sound", "mV"}; | |
8 | +sensor battery = {BATTERY_ADDR, "Battery Level", "power", "mV"}; | |
9 | 9 | |
10 | 10 | sensor* sensors[TOTAL_SENSORS+1] = {&light_sensor,&ultrasound_sensor,&pressure_sensor,&humidity_temp_sensor,&sound_sensor,&battery}; |
11 | 11 | |
... | ... | @@ -92,13 +92,12 @@ uint16_t get_light_ch0(void) |
92 | 92 | |
93 | 93 | I2C_start(I2C1,LIGHT_ADDR << 1, I2C_Direction_Transmitter); |
94 | 94 | I2C_write(I2C1, 0x0C); |
95 | - I2C_stop(I2C1); | |
96 | 95 | printf("LIGHT: Sent fetch command for CH1\r\n"); |
97 | 96 | |
98 | - I2C_start(I2C1, LIGHT_ADDR << 1, I2C_Direction_Receiver); | |
97 | + I2C_restart(I2C1, LIGHT_ADDR << 1, I2C_Direction_Receiver); | |
99 | 98 | data = I2C_read_ack(I2C1); |
100 | 99 | printf("LIGHT: Got low byte for CH1\r\n"); |
101 | - data = data | (I2C_read_ack(I2C1) << 8); | |
100 | + data = data | (I2C_read_nack(I2C1) << 8); | |
102 | 101 | printf("LIGHT: Got high byte for CH1\r\n"); |
103 | 102 | I2C_stop(I2C1); |
104 | 103 | |
... | ... | @@ -110,13 +109,12 @@ uint16_t get_light_ch1(void) |
110 | 109 | |
111 | 110 | I2C_start(I2C1,LIGHT_ADDR << 1, I2C_Direction_Transmitter); |
112 | 111 | I2C_write(I2C1, 0x0E); |
113 | - I2C_stop(I2C1); | |
114 | 112 | printf("LIGHT: Sent fetch command for CH1\r\n"); |
115 | 113 | |
116 | - I2C_start(I2C1, LIGHT_ADDR << 1, I2C_Direction_Receiver); | |
114 | + I2C_restart(I2C1, LIGHT_ADDR << 1, I2C_Direction_Receiver); | |
117 | 115 | data = I2C_read_ack(I2C1); |
118 | 116 | printf("LIGHT: Got low byte for CH1\r\n"); |
119 | - data = data | (I2C_read_ack(I2C1) << 8); | |
117 | + data = data | (I2C_read_nack(I2C1) << 8); | |
120 | 118 | printf("LIGHT: Got high byte for CH1\r\n"); |
121 | 119 | I2C_stop(I2C1); |
122 | 120 | |
... | ... | @@ -127,48 +125,29 @@ uint16_t get_distance_data(void) |
127 | 125 | { |
128 | 126 | init_ultrasound(); |
129 | 127 | printf("DISTANCE: Initialized\r\n"); |
130 | - uint16_t data = get_distance_high(); | |
131 | - printf("Got distance high byte\r\n"); | |
132 | - data = data << 8; | |
133 | - data = data | get_distance_low(); | |
134 | - printf("Got distance low byte\r\n"); | |
135 | - return data; | |
136 | -} | |
137 | -void init_ultrasound(void) | |
138 | -{ | |
139 | - I2C_start(I2C1,DISTANCE_ADDR << 1, I2C_Direction_Transmitter); | |
140 | - I2C_write(I2C1, 0x00); | |
141 | - I2C_stop(I2C1); | |
142 | 128 | |
129 | + uint16_t data; | |
143 | 130 | I2C_start(I2C1,DISTANCE_ADDR << 1, I2C_Direction_Transmitter); |
144 | - I2C_write(I2C1, 0x50); | |
145 | - I2C_stop(I2C1); | |
131 | + I2C_write(I2C1, 0x02); | |
146 | 132 | |
147 | - chThdSleepMilliseconds(70); | |
148 | -} | |
149 | -uint8_t get_distance_low(void) | |
150 | -{ | |
151 | - uint8_t data; | |
152 | - I2C_start(I2C1,DISTANCE_ADDR << 1, I2C_Direction_Transmitter); | |
153 | - I2C_write(I2C1, 0x03); | |
154 | - I2C_stop(I2C1); | |
155 | - | |
156 | - I2C_start(I2C1, DISTANCE_ADDR << 1, I2C_Direction_Receiver); | |
133 | + I2C_restart(I2C1, DISTANCE_ADDR << 1, I2C_Direction_Receiver); | |
157 | 134 | data = I2C_read_ack(I2C1); |
135 | + printf("DISTANCE: Got high byte\r\n"); | |
136 | + data = data << 8; | |
137 | + data = data | I2C_read_nack(I2C1); | |
138 | + printf("DISTANCE: Got low byte\r\n"); | |
158 | 139 | I2C_stop(I2C1); |
159 | 140 | return data; |
160 | 141 | } |
161 | -uint8_t get_distance_high(void) | |
142 | + | |
143 | +void init_ultrasound(void) | |
162 | 144 | { |
163 | - uint8_t data; | |
164 | 145 | I2C_start(I2C1,DISTANCE_ADDR << 1, I2C_Direction_Transmitter); |
165 | - I2C_write(I2C1, 0x02); | |
146 | + I2C_write(I2C1, 0x00); | |
147 | + I2C_write(I2C1, 0x50); | |
166 | 148 | I2C_stop(I2C1); |
167 | - | |
168 | - I2C_start(I2C1, DISTANCE_ADDR << 1, I2C_Direction_Receiver); | |
169 | - data = I2C_read_ack(I2C1); | |
170 | - I2C_stop(I2C1); | |
171 | - return data; | |
149 | + | |
150 | + chThdSleepMilliseconds(70); | |
172 | 151 | } |
173 | 152 | |
174 | 153 | uint16_t get_pressure_data(void) |
... | ... | @@ -178,9 +157,8 @@ uint16_t get_pressure_data(void) |
178 | 157 | printf("PRESSURE: Initialized\r\n"); |
179 | 158 | I2C_start(I2C1,DISTANCE_ADDR << 1, I2C_Direction_Transmitter); |
180 | 159 | I2C_write(I2C1, 0xF6); |
181 | - I2C_stop(I2C1); | |
182 | - | |
183 | - I2C_start(I2C1, DISTANCE_ADDR << 1, I2C_Direction_Receiver); | |
160 | + | |
161 | + I2C_restart(I2C1, DISTANCE_ADDR << 1, I2C_Direction_Receiver); | |
184 | 162 | data = I2C_read_ack(I2C1); |
185 | 163 | printf("PRESSURE: Got high byte\r\n"); |
186 | 164 | data = data << 8; |
... | ... | @@ -196,9 +174,8 @@ uint16_t get_pressure_temperature_data(void) |
196 | 174 | printf("PRESSURE: Initialized temperature\r\n"); |
197 | 175 | I2C_start(I2C1,DISTANCE_ADDR << 1, I2C_Direction_Transmitter); |
198 | 176 | I2C_write(I2C1, 0xF6); |
199 | - I2C_stop(I2C1); | |
200 | 177 | |
201 | - I2C_start(I2C1, DISTANCE_ADDR << 1, I2C_Direction_Receiver); | |
178 | + I2C_restart(I2C1, DISTANCE_ADDR << 1, I2C_Direction_Receiver); | |
202 | 179 | data = I2C_read_ack(I2C1); |
203 | 180 | printf("PRESSURE: Got temperature high byte\r\n"); |
204 | 181 | data = data << 8; |
... | ... | @@ -214,87 +191,88 @@ bmp085_callibration get_pressure_callibration_data(void) |
214 | 191 | |
215 | 192 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
216 | 193 | I2C_write(I2C1, 0xAA); |
217 | - I2C_stop(I2C1); | |
218 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
219 | - calib_data.AC1 = I2C_read_ack(I2C1); | |
194 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
195 | + calib_data.AC1 = (I2C_read_ack(I2C1) << 8); | |
196 | + calib_data.AC1 |= I2C_read_nack(I2C1); | |
220 | 197 | I2C_stop(I2C1); |
221 | 198 | |
222 | 199 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
223 | 200 | I2C_write(I2C1, 0xAC); |
224 | - I2C_stop(I2C1); | |
225 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
226 | - calib_data.AC2 = I2C_read_ack(I2C1); | |
201 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
202 | + calib_data.AC2 = (I2C_read_ack(I2C1) << 8); | |
203 | + calib_data.AC2 |= I2C_read_nack(I2C1); | |
227 | 204 | I2C_stop(I2C1); |
228 | 205 | |
229 | 206 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
230 | 207 | I2C_write(I2C1, 0xAE); |
231 | - I2C_stop(I2C1); | |
232 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
233 | - calib_data.AC3 = I2C_read_ack(I2C1); | |
208 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
209 | + calib_data.AC3 = (I2C_read_ack(I2C1) << 8); | |
210 | + calib_data.AC3 |= I2C_read_nack(I2C1); | |
234 | 211 | I2C_stop(I2C1); |
235 | 212 | |
236 | 213 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
237 | 214 | I2C_write(I2C1, 0xB0); |
238 | - I2C_stop(I2C1); | |
239 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
240 | - calib_data.AC4 = I2C_read_ack(I2C1); | |
215 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
216 | + calib_data.AC4 = (I2C_read_ack(I2C1) << 8); | |
217 | + calib_data.AC4 |= I2C_read_nack(I2C1); | |
241 | 218 | I2C_stop(I2C1); |
242 | 219 | |
243 | 220 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
244 | 221 | I2C_write(I2C1, 0xB2); |
245 | - I2C_stop(I2C1); | |
246 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
247 | - calib_data.AC5 = I2C_read_ack(I2C1); | |
222 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
223 | + calib_data.AC5 = (I2C_read_ack(I2C1) << 8); | |
224 | + calib_data.AC5 |= I2C_read_nack(I2C1); | |
248 | 225 | I2C_stop(I2C1); |
249 | 226 | |
250 | 227 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
251 | 228 | I2C_write(I2C1, 0xB4); |
252 | - I2C_stop(I2C1); | |
253 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
254 | - calib_data.AC6 = I2C_read_ack(I2C1); | |
229 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
230 | + calib_data.AC6 = (I2C_read_ack(I2C1) << 8); | |
231 | + calib_data.AC6 |= I2C_read_nack(I2C1); | |
255 | 232 | I2C_stop(I2C1); |
256 | 233 | |
257 | 234 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
258 | 235 | I2C_write(I2C1, 0xB6); |
259 | - I2C_stop(I2C1); | |
260 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
261 | - calib_data.B1 = I2C_read_ack(I2C1); | |
236 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
237 | + calib_data.B1 = (I2C_read_ack(I2C1) << 8); | |
238 | + calib_data.B1 |= I2C_read_nack(I2C1); | |
262 | 239 | I2C_stop(I2C1); |
263 | 240 | |
264 | 241 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
265 | 242 | I2C_write(I2C1, 0xB8); |
266 | - I2C_stop(I2C1); | |
267 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
268 | - calib_data.B2 = I2C_read_ack(I2C1); | |
243 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
244 | + calib_data.B2 = (I2C_read_ack(I2C1) << 8); | |
245 | + calib_data.B2 |= I2C_read_nack(I2C1); | |
269 | 246 | I2C_stop(I2C1); |
270 | 247 | |
271 | 248 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
272 | 249 | I2C_write(I2C1, 0xBA); |
273 | - I2C_stop(I2C1); | |
274 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
275 | - calib_data.MB = I2C_read_ack(I2C1); | |
250 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
251 | + calib_data.MB = (I2C_read_ack(I2C1) << 8); | |
252 | + calib_data.MB |= I2C_read_nack(I2C1); | |
276 | 253 | I2C_stop(I2C1); |
277 | 254 | |
278 | 255 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
279 | 256 | I2C_write(I2C1, 0xBC); |
280 | - I2C_stop(I2C1); | |
281 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
282 | - calib_data.MC = I2C_read_ack(I2C1); | |
257 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
258 | + calib_data.MC = (I2C_read_ack(I2C1) << 8); | |
259 | + calib_data.MC |= I2C_read_nack(I2C1); | |
283 | 260 | I2C_stop(I2C1); |
284 | 261 | |
285 | 262 | I2C_start(I2C1,PRESSURE_ADDR << 1, I2C_Direction_Transmitter); |
286 | 263 | I2C_write(I2C1, 0xBE); |
287 | - I2C_stop(I2C1); | |
288 | - I2C_start(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
289 | - calib_data.MD = I2C_read_ack(I2C1); | |
264 | + I2C_restart(I2C1, PRESSURE_ADDR << 1, I2C_Direction_Receiver); | |
265 | + calib_data.MD = (I2C_read_ack(I2C1) << 8); | |
266 | + calib_data.MD |= I2C_read_nack(I2C1); | |
290 | 267 | I2C_stop(I2C1); |
268 | + | |
291 | 269 | printf("PRESSURE: Got callibration data\r\n"); |
292 | 270 | return calib_data; |
293 | 271 | } |
294 | 272 | char* callibration_pressure_data_csv(bmp085_callibration parameters) |
295 | 273 | { |
296 | 274 | char *str = chHeapAlloc(NULL,sizeof(char)*(11*11-1)); |
297 | - memset(str,0x00,sizeof(char)*(11*11-1)); | |
275 | + memset(str,0x00,sizeof(char)*(11*11)); | |
298 | 276 | sprintf(str + strlen(str),"%d,",parameters.AC1); |
299 | 277 | sprintf(str + strlen(str),"%d,",parameters.AC2); |
300 | 278 | sprintf(str + strlen(str),"%d,",parameters.AC3); |
... | ... | @@ -331,8 +309,10 @@ void init_pressure_temperature(void) |
331 | 309 | |
332 | 310 | void init_humidity_temp(void) |
333 | 311 | { |
312 | + printf("HUMIDITY: Initializing sensor\r\n"); | |
334 | 313 | I2C_start(I2C1,HUMIDITY_TEMP_ADDR << 1, I2C_Direction_Transmitter); |
335 | 314 | I2C_stop(I2C1); |
315 | + //Reset I2C? | |
336 | 316 | } |
337 | 317 | uint16_t get_humidity_data(void) |
338 | 318 | { | ... | ... |