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 {