#include "DS_BMP180.h" void DS_BMP180_Init(DS_BMP180 *DS_BMP180, I2C_HandleTypeDef *hi2c, uint8_t address) { uint8_t calibration[22]; DS_BMP180->address = address; DS_BMP180->hi2c = hi2c; for (uint8_t i = 0; i < 21; i++) { calibration[i] = 0; }; HAL_I2C_Mem_Read(DS_BMP180->hi2c, DS_BMP180->address, 0xAA, 1, (uint8_t*)(&calibration), 22, 1000); // uint8_t a = 0; // uint8_t temp = 0; // for (uint8_t i = 0; i < 21; i++) // { // if (a==0) // { // temp = calibration[i]; // a++; // } // else // { // calibration[i-1] = calibration[i]; // calibration[i] = temp; // a=0; // } // }; // int16_t *pAC1 = &calibration[0]; // void *vp; // vp = pAC1; // uint16_t AC1; // AC1 = (uint16_t)*((uint16_t *)vp); //void AC1 = *pAC1; //uint16_t AC1 = *(uint16_t*)(&calibration[0]); DS_BMP180->Calibration.AC1 = (calibration[0]<<8) + calibration[1]; DS_BMP180->Calibration.AC2 = (calibration[2]<<8) + calibration[3]; DS_BMP180->Calibration.AC3 = (calibration[4]<<8) + calibration[5]; DS_BMP180->Calibration.AC4 = (calibration[6]<<8) + calibration[7]; DS_BMP180->Calibration.AC5 = (calibration[8]<<8) + calibration[9]; DS_BMP180->Calibration.AC6 = (calibration[10]<<8) + calibration[11]; DS_BMP180->Calibration.B1 = (calibration[12]<<8) + calibration[13]; DS_BMP180->Calibration.B2 = (calibration[14]<<8) + calibration[15]; DS_BMP180->Calibration.MB = (calibration[16]<<8) + calibration[17]; DS_BMP180->Calibration.MC = (calibration[18]<<8) + calibration[19]; DS_BMP180->Calibration.MD = (calibration[20]<<8) + calibration[21]; } void DS_BMP180_StartConversionPressure(DS_BMP180 *DS_BMP180, uint8_t OversamplingRatio) { uint8_t pData[1]; pData[0] = 0x34 + (OversamplingRatio << 6); DS_BMP180->Calibration.OSS = OversamplingRatio; HAL_I2C_Mem_Write(DS_BMP180->hi2c, DS_BMP180->address, 0xF4, 1, (uint8_t*)&pData, 1, 1000); } void DS_BMP180_StartConversionTemperature(DS_BMP180 *DS_BMP180) { uint8_t pData[1]; pData[0] = 0x2E; HAL_I2C_Mem_Write(DS_BMP180->hi2c, DS_BMP180->address, 0xF4, 1, (uint8_t*)&pData, 1, 1000); } long DS_BMP180_GetTemperature(DS_BMP180 *DS_BMP180) { uint16_t pow15 = 32768; uint16_t pow11 = 2048; uint8_t pow4 = 16; uint8_t pData[2]; HAL_I2C_Mem_Read(DS_BMP180->hi2c, DS_BMP180->address, 0xF6, 1, (uint8_t*)(&pData), 2, 1000); long UT = (pData[0]<<8) + pData[1]; long X1 = (UT - DS_BMP180->Calibration.AC6) * DS_BMP180->Calibration.AC5 / pow15; long X2 = DS_BMP180->Calibration.MC * pow11 / (X1+DS_BMP180->Calibration.MD); DS_BMP180->Calibration.B5 = X1 + X2; long T = (DS_BMP180->Calibration.B5+8) / pow4; return T; } long DS_BMP180_GetPressure(DS_BMP180 *DS_BMP180) { uint32_t pow16 = 65536; uint16_t pow15 = 32768; uint16_t pow13 = 8192; uint16_t pow12 = 4096; uint16_t pow11 = 2048; uint16_t pow8 = 256; uint8_t pow4 = 16; uint8_t pData[3]; HAL_I2C_Mem_Read(DS_BMP180->hi2c, DS_BMP180->address, 0xF6, 1, (uint8_t*)(&pData), 8, 1000); long UP = ((pData[0]<<16) + (pData[1]<<8) + pData[0]) >> (8-DS_BMP180->Calibration.OSS); long B6 = DS_BMP180->Calibration.B5 - 4000; long X1 = (DS_BMP180->Calibration.B2 * (B6 * B6 / pow12))/pow11; long X2 = DS_BMP180->Calibration.AC2 * B6 / pow11; long X3 = X1 + X2; long B3 = (((DS_BMP180->Calibration.AC1*4+X3)<Calibration.OSS)+2)/4; X1 = DS_BMP180->Calibration.AC3 * B6 /pow13; X2 = (DS_BMP180->Calibration.B1*(B6*B6/pow12))/pow16; X3 = ((X1 + X2)+2)/4; unsigned long B4 = DS_BMP180->Calibration.AC4 * (unsigned long)(X3+pow15)/pow15; unsigned long B7 = ((unsigned long)UP - B3)*(50000>>DS_BMP180->Calibration.OSS); long p; if (B7 < 0x80000000) {p = (B7 * 2)/B4;} else {p = (B7 / B4) * 2;} X1 = (p/pow8)*(p/pow8); X1 = (X1 * 3038)/pow16; X2 = (-7357*p)/pow16; p = p + (X1 + X2 + 3791) / pow4; return p; }