Mercurial > public > ostc4
comparison Small_CPU/Src/pressure.c @ 474:4be72d55b09a Improve_Button_Sleep
Added error detection for reading of ADC values in sleep mode:
ADC value were used for pressure calculation without making sure that the I2C operations used for reading the values were called successfully. As result a invalid pressure could be calculated causing the OSTC to wakeup or (worstcase) to enter dive mode. To avoid this the return values are now evaluated and pressure calculation is only done if I2C signaled no error during transmission
author | ideenmodellierer |
---|---|
date | Tue, 12 May 2020 22:42:52 +0200 |
parents | 6f30f2011667 |
children | 4b9427ae0a65 |
comparison
equal
deleted
inserted
replaced
473:edfc1a464b42 | 474:4be72d55b09a |
---|---|
389 | 389 |
390 if(global.I2C_SystemStatus == HAL_OK) | 390 if(global.I2C_SystemStatus == HAL_OK) |
391 { | 391 { |
392 pressureSensorInitSuccess = 1; | 392 pressureSensorInitSuccess = 1; |
393 retValue = pressure_update(); | 393 retValue = pressure_update(); |
394 | |
395 } | 394 } |
396 return retValue; | 395 return retValue; |
397 } | 396 } |
398 | 397 |
399 | 398 |
400 static uint32_t get_adc(void) | 399 static uint32_t get_adc(void) |
401 { | 400 { |
402 uint8_t buffer[1]; | 401 uint8_t buffer[1]; |
403 uint8_t resivebuf[4]; | 402 uint8_t resivebuf[4]; |
404 uint32_t answer = 0; | 403 uint32_t answer = 0xFFFFFFFF; |
405 | 404 |
406 buffer[0] = 0x00; // Get ADC | 405 buffer[0] = 0x00; // Get ADC |
407 I2C_Master_Transmit( PRESSURE_ADDRESS, buffer, 1); | 406 if(I2C_Master_Transmit( PRESSURE_ADDRESS, buffer, 1) == HAL_OK) |
408 I2C_Master_Receive( PRESSURE_ADDRESS, resivebuf, 4); | 407 { |
409 resivebuf[3] = 0; | 408 if(I2C_Master_Receive( PRESSURE_ADDRESS, resivebuf, 4) == HAL_OK) |
410 answer = 256*256 *(uint32_t)resivebuf[0] + 256 * (uint32_t)resivebuf[1] + (uint32_t)resivebuf[2]; | 409 { |
411 | 410 resivebuf[3] = 0; |
411 answer = 256*256 *(uint32_t)resivebuf[0] + 256 * (uint32_t)resivebuf[1] + (uint32_t)resivebuf[2]; | |
412 } | |
413 } | |
412 return answer; | 414 return answer; |
413 } | 415 } |
414 | 416 |
415 | 417 |
416 static uint16_t get_ci_by_coef_num(uint8_t coef_num) | 418 static uint16_t get_ci_by_coef_num(uint8_t coef_num) |
458 } | 460 } |
459 | 461 |
460 static uint32_t pressure_sensor_get_one_value(uint8_t cmd, HAL_StatusTypeDef *statusReturn) | 462 static uint32_t pressure_sensor_get_one_value(uint8_t cmd, HAL_StatusTypeDef *statusReturn) |
461 { | 463 { |
462 uint8_t command = CMD_ADC_CONV + cmd; | 464 uint8_t command = CMD_ADC_CONV + cmd; |
465 uint32_t adcValue = 0; | |
463 HAL_StatusTypeDef statusReturnTemp = HAL_TIMEOUT; | 466 HAL_StatusTypeDef statusReturnTemp = HAL_TIMEOUT; |
464 | 467 |
465 statusReturnTemp = I2C_Master_Transmit( PRESSURE_ADDRESS, &command, 1); | 468 statusReturnTemp = I2C_Master_Transmit( PRESSURE_ADDRESS, &command, 1); |
466 | 469 |
467 if(statusReturn) | 470 if(statusReturn) |
468 { | 471 { |
469 *statusReturn = statusReturnTemp; | 472 *statusReturn = statusReturnTemp; |
470 } | 473 } |
471 | 474 else |
472 switch (cmd & 0x0f) // wait necessary conversion time | 475 { |
473 { | 476 switch (cmd & 0x0f) // wait necessary conversion time |
474 case CMD_ADC_256 : HAL_Delay(1); break; | 477 { |
475 case CMD_ADC_512 : HAL_Delay(3); break; | 478 case CMD_ADC_256 : HAL_Delay(1); break; |
476 case CMD_ADC_1024: HAL_Delay(4); break; | 479 case CMD_ADC_512 : HAL_Delay(3); break; |
477 case CMD_ADC_2048: HAL_Delay(6); break; | 480 case CMD_ADC_1024: HAL_Delay(4); break; |
478 case CMD_ADC_4096: HAL_Delay(10); break; | 481 case CMD_ADC_2048: HAL_Delay(6); break; |
479 } | 482 case CMD_ADC_4096: HAL_Delay(10); break; |
480 return get_adc(); | 483 default: |
484 break; | |
485 } | |
486 adcValue = get_adc(); | |
487 if(adcValue == 0xFFFFFFFF) | |
488 { | |
489 *statusReturn = HAL_ERROR; | |
490 } | |
491 } | |
492 return adcValue; | |
481 } | 493 } |
482 | 494 |
483 | 495 |
484 static HAL_StatusTypeDef pressure_sensor_get_data(void) | 496 static HAL_StatusTypeDef pressure_sensor_get_data(void) |
485 { | 497 { |