Commit b3f997a0600a0d7ce6cd2a390c37cc85d97ae578

Authored by Imanol-Mikel Barba Sabariego
1 parent e08f5763

--no commit message

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 {
... ...