00001
00002
00003
00004
00083 #include "bmp085/bmp085_bst.h"
00084
00085
00086 bmp085_t *p_bmp085 = 0;
00098 int bmp085_init( bmp085_t *bmp085 )
00099 {
00100 char comres = 0;
00101 unsigned char data;
00102 long dummy;
00103
00104
00105 p_bmp085 = bmp085;
00106 p_bmp085->sensortype = E_SENSOR_NOT_DETECTED;
00107 p_bmp085->dev_addr = BMP085_I2C_ADDR;
00108 comres += p_bmp085->BMP085_BUS_READ_FUNC(p_bmp085->dev_addr, BMP085_CHIP_ID__REG, &data, 1);
00109
00110 p_bmp085->chip_id = BMP085_GET_BITSLICE(data, BMP085_CHIP_ID);
00111 p_bmp085->number_of_samples = 1;
00112 p_bmp085->oversampling_setting=0;
00113
00114 if( p_bmp085->chip_id == BMP085_CHIP_ID )
00115 {
00116 p_bmp085->sensortype = BOSCH_PRESSURE_BMP085;
00117
00118 comres += p_bmp085->BMP085_BUS_READ_FUNC(p_bmp085->dev_addr, BMP085_VERSION_REG, &data, 1);
00119
00120 p_bmp085->ml_version = BMP085_GET_BITSLICE(data, BMP085_ML_VERSION);
00121 p_bmp085->al_version = BMP085_GET_BITSLICE(data, BMP085_AL_VERSION);
00122 bmp085_get_cal_param( );
00123 }
00124 else
00125 {
00126 p_bmp085->sensortype = BOSCH_PRESSURE_SMD500;
00127 p_bmp085->smd500_t_resolution = SMD500_T_RESOLUTION_16BIT;
00128 p_bmp085->smd500_masterclock = SMD500_MASTERCLOCK_32768HZ;
00129 smd500_get_cal_param();
00130
00131
00132 dummy = (p_bmp085->cal_param.ac3 + SMD500_PARAM_M3);
00133 dummy *= SMD500_PARAM_ME;
00134 dummy >>= 11;
00135 dummy += SMD500_PARAM_MF;
00136 p_bmp085->cal_param.b1 = dummy;
00137
00138
00139 dummy = (p_bmp085->cal_param.ac2 + SMD500_PARAM_M2);
00140 dummy *= p_bmp085->cal_param.b1;
00141 dummy >>= 4;
00142 dummy /= (p_bmp085->cal_param.ac3 + SMD500_PARAM_M3);
00143 p_bmp085->cal_param.b2 = dummy;
00144
00145 p_bmp085->sensortype = BOSCH_PRESSURE_SMD500;
00146
00147 p_bmp085->cal_param.ac1 += SMD500_PARAM_M1;
00148 p_bmp085->cal_param.ac1 <<= 1;
00149
00150 p_bmp085->cal_param.ac2 += SMD500_PARAM_M2;
00151 p_bmp085->cal_param.ac2 <<= 2;
00152
00153 p_bmp085->cal_param.ac3 += SMD500_PARAM_M3;
00154 p_bmp085->cal_param.ac3 <<= 3;
00155
00156 p_bmp085->cal_param.ac4 += SMD500_PARAM_M4;
00157 p_bmp085->cal_param.ac4 <<= 1;
00158
00159 p_bmp085->cal_param.ac5 += SMD500_PARAM_M5;
00160 p_bmp085->cal_param.ac5 <<= 3;
00161
00162 p_bmp085->cal_param.ac6 += SMD500_PARAM_M6;
00163 p_bmp085->cal_param.ac6 <<= 3;
00164
00165 p_bmp085->cal_param.mb = SMD500_PARAM_MB;
00166 p_bmp085->cal_param.mc = SMD500_PARAM_MC;
00167 p_bmp085->cal_param.md = SMD500_PARAM_MD;
00168 }
00169
00170 return comres;
00171 }
00172
00177
00178 int bmp085_get_cal_param( void )
00179 {
00180 int comres;
00181 unsigned char data[22];
00182 comres = p_bmp085->BMP085_BUS_READ_FUNC( p_bmp085->dev_addr, BMP085_PROM_START__ADDR, data, BMP085_PROM_DATA__LEN );
00183
00184
00185 p_bmp085->cal_param.ac1 = (data[0] <<8) | data[1];
00186 p_bmp085->cal_param.ac2 = (data[2] <<8) | data[3];
00187 p_bmp085->cal_param.ac3 = (data[4] <<8) | data[5];
00188 p_bmp085->cal_param.ac4 = (data[6] <<8) | data[7];
00189 p_bmp085->cal_param.ac5 = (data[8] <<8) | data[9];
00190 p_bmp085->cal_param.ac6 = (data[10] <<8) | data[11];
00191
00192
00193 p_bmp085->cal_param.b1 = (data[12] <<8) | data[13];
00194 p_bmp085->cal_param.b2 = (data[14] <<8) | data[15];
00195
00196
00197 p_bmp085->cal_param.mb = (data[16] <<8) | data[17];
00198 p_bmp085->cal_param.mc = (data[18] <<8) | data[19];
00199 p_bmp085->cal_param.md = (data[20] <<8) | data[21];
00200
00201 return comres;
00202 }
00203
00208
00209 int smd500_get_cal_param( void )
00210 {
00211 unsigned char data[SMD500_PROM_DATA__LEN];
00212 int comres;
00213 comres = p_bmp085->BMP085_BUS_READ_FUNC( p_bmp085->dev_addr, SMD500_PROM_START__ADDR, data, SMD500_PROM_DATA__LEN );
00214
00215 p_bmp085->cal_param.ac1 = (unsigned short) ( (data[0] <<8) | data[1] ) & 0x3FFF;
00216 p_bmp085->cal_param.ac2 = ( (data[0] & 0xC0) >> 6 ) + ( (data[2] & ~0x01) << 1 );
00217 p_bmp085->cal_param.ac3 = ( (data[2] & 0x01) << 8 ) + data[3];
00218 p_bmp085->cal_param.ac4 = ( (data[4] & 0x1f) << 8 ) + data[5];
00219 p_bmp085->cal_param.ac5 = ( (data[4] & ~0x1f) >> 5 ) + ( (data[6] & 0xf0) >> 1 );
00220 p_bmp085->cal_param.ac6 = ( (data[6] & 0x0f) << 8 ) + data[7];
00221 return comres;
00222 }
00223
00224
00232
00233 short bmp085_get_temperature( unsigned long ut )
00234 {
00235 short temperature;
00236 long x1,x2,x3,x4,y2,y3,y4;
00237
00238 if( p_bmp085->sensortype == BOSCH_PRESSURE_BMP085 )
00239 {
00240 x1 = (((long) ut - (long) p_bmp085->cal_param.ac6) * (long) p_bmp085->cal_param.ac5) >> 15;
00241 x2 = ((long) p_bmp085->cal_param.mc << 11) / (x1 + p_bmp085->cal_param.md);
00242 p_bmp085->param_b5 = x1 + x2;
00243 }
00244 else
00245 {
00246 if( p_bmp085->smd500_t_resolution == SMD500_T_RESOLUTION_16BIT )
00247 {
00248 x1 = ((unsigned long) ((( ut * SMD500_PARAM_MJ) >> 16) - p_bmp085->cal_param.ac6));
00249 }
00250 else
00251 {
00252 x1 = ut * 8 - p_bmp085->cal_param.ac6;
00253 }
00254
00255 x2 = (x1 * x1) >> 13;
00256 y2 = (SMD500_PARAM_MB * x2) >> 13;
00257 x3 = (x2 * x1) >> 16;
00258 y3 = (SMD500_PARAM_MC * x3) >> 12;
00259 x4 = (x2 * x2) >> 16;
00260 y4 = (SMD500_PARAM_MD * x4) >> 14;
00261
00262 p_bmp085->param_b5 = (((p_bmp085->cal_param.ac5) * ( (2*x1) + y2 + y3 + y4))) >> 13;
00263 }
00264 temperature = ((p_bmp085->param_b5 + 8) >> 4);
00265
00266 return temperature;
00267 }
00268
00278
00279 long bmp085_get_pressure( unsigned long up )
00280 {
00281 long pressure,x1,x2,x3,b3,b6;
00282 unsigned long b4, b7;
00283
00284 b6 = p_bmp085->param_b5 - 4000;
00285
00286 x1 = (b6*b6) >> 12;
00287 x1 *= p_bmp085->cal_param.b2;
00288 x1 >>= 11;
00289
00290 x2 = (p_bmp085->cal_param.ac2*b6);
00291 x2 >>= 11;
00292
00293 x3 = x1 +x2;
00294
00295 b3 = (((((long)p_bmp085->cal_param.ac1 )*4 + x3) <<p_bmp085->oversampling_setting) + 2) >> 2;
00296
00297
00298 x1 = (p_bmp085->cal_param.ac3* b6) >> 13;
00299 x2 = (p_bmp085->cal_param.b1 * ((b6*b6) >> 12) ) >> 16;
00300 x3 = ((x1 + x2) + 2) >> 2;
00301 b4 = (p_bmp085->cal_param.ac4 * (unsigned long) (x3 + 32768)) >> 15;
00302
00303 b7 = ((unsigned long)(up - b3) * (50000>>p_bmp085->oversampling_setting));
00304 if( b7 < 0x80000000 )
00305 {
00306 pressure = (b7 << 1) / b4;
00307 }
00308 else
00309 {
00310 pressure = (b7 / b4) << 1;
00311 }
00312
00313 x1 = pressure >> 8;
00314 x1 *= x1;
00315 x1 = (x1 * SMD500_PARAM_MG) >> 16;
00316 x2 = (pressure * SMD500_PARAM_MH) >> 16;
00317 pressure += (x1 + x2 + SMD500_PARAM_MI) >> 4;
00318
00319 return pressure;
00320 }
00321
00322
00327
00328 unsigned short bmp085_get_ut( void )
00329 {
00330 unsigned short ut;
00331 unsigned char data[2];
00332 unsigned char ctrl_reg_data;
00333 int wait_time;
00334 int comres;
00335
00336 if( p_bmp085->chip_id == BMP085_CHIP_ID )
00337 {
00338 ctrl_reg_data = BMP085_T_MEASURE;
00339 wait_time = BMP085_TEMP_CONVERSION_TIME;
00340 }
00341 else
00342 {
00343 ctrl_reg_data = SMD500_T_MEASURE + p_bmp085->smd500_t_resolution + p_bmp085->smd500_masterclock;
00344 }
00345
00346
00347 if( p_bmp085->smd500_t_resolution == SMD500_T_RESOLUTION_13BIT )
00348 {
00349 wait_time = SMD500_TEMP_CONVERSION_TIME_13;
00350 }
00351 else
00352 {
00353 wait_time = SMD500_TEMP_CONVERSION_TIME_16;
00354 }
00355 comres = p_bmp085->BMP085_BUS_WRITE_FUNC(p_bmp085->dev_addr, BMP085_CTRL_MEAS_REG, &ctrl_reg_data, 1);
00356
00357
00358 p_bmp085->delay_msec (wait_time);
00359 comres += p_bmp085->BMP085_BUS_READ_FUNC(p_bmp085->dev_addr, BMP085_ADC_OUT_MSB_REG, data, 2);
00360 ut = (data[0] <<8) | data[1];
00361
00362 return ut;
00363 }
00364
00365
00371
00372 unsigned long bmp085_get_up( void )
00373 {
00374 int i;
00375 unsigned long up = 0;
00376 unsigned char data[3];
00377 unsigned char ctrl_reg_data;
00378 int comres = 0;
00379 if( p_bmp085->chip_id == BMP085_CHIP_ID )
00380 {
00381 ctrl_reg_data = BMP085_P_MEASURE + (p_bmp085->oversampling_setting << 6);
00382 comres = p_bmp085->BMP085_BUS_WRITE_FUNC( p_bmp085->dev_addr, BMP085_CTRL_MEAS_REG, &ctrl_reg_data, 1 );
00383
00384 p_bmp085->delay_msec ( 2 + (3 << (p_bmp085->oversampling_setting) ) );
00385 comres += p_bmp085->BMP085_BUS_READ_FUNC( p_bmp085->dev_addr, BMP085_ADC_OUT_MSB_REG, data, 3 );
00386
00387 up = (((unsigned long) data[0] << 16) | ((unsigned long) data[1] << 8) | (unsigned long) data[2]) >> (8-p_bmp085->oversampling_setting);
00388 p_bmp085->number_of_samples = 1;
00389 }
00390 else
00391 {
00392
00393 ctrl_reg_data = SMD500_P_MEASURE + p_bmp085->smd500_masterclock;
00394 p_bmp085->number_of_samples = (1 << (p_bmp085->oversampling_setting));
00395 for( i = 0; i < p_bmp085->number_of_samples; i++ )
00396 {
00397 comres += p_bmp085->BMP085_BUS_WRITE_FUNC( p_bmp085->dev_addr, BMP085_CTRL_MEAS_REG, &ctrl_reg_data, 1 );
00398 p_bmp085->delay_msec (34);
00399
00400 comres += p_bmp085->BMP085_BUS_READ_FUNC( p_bmp085->dev_addr, BMP085_ADC_OUT_MSB_REG, data, 2 );
00401 up += (((unsigned long)data[0] <<8) | (unsigned long)data[1]);
00402 }
00403 }
00404 return up;
00405 }
00406
00407