test code 123

Dependencies:   mbed

Fork of LinkNode-Test by Qi Yao

Committer:
youkee
Date:
Fri Oct 28 13:04:10 2016 +0000
Revision:
1:b0d4fbbdb244
Parent:
0:1ad0e04b1bc5
ghhbfdd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
youkee 0:1ad0e04b1bc5 1 /*******************************************************************************
youkee 0:1ad0e04b1bc5 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
youkee 0:1ad0e04b1bc5 3 *
youkee 0:1ad0e04b1bc5 4 * Permission is hereby granted, free of charge, to any person obtaining a
youkee 0:1ad0e04b1bc5 5 * copy of this software and associated documentation files (the "Software"),
youkee 0:1ad0e04b1bc5 6 * to deal in the Software without restriction, including without limitation
youkee 0:1ad0e04b1bc5 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
youkee 0:1ad0e04b1bc5 8 * and/or sell copies of the Software, and to permit persons to whom the
youkee 0:1ad0e04b1bc5 9 * Software is furnished to do so, subject to the following conditions:
youkee 0:1ad0e04b1bc5 10 *
youkee 0:1ad0e04b1bc5 11 * The above copyright notice and this permission notice shall be included
youkee 0:1ad0e04b1bc5 12 * in all copies or substantial portions of the Software.
youkee 0:1ad0e04b1bc5 13 *
youkee 0:1ad0e04b1bc5 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
youkee 0:1ad0e04b1bc5 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
youkee 0:1ad0e04b1bc5 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
youkee 0:1ad0e04b1bc5 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
youkee 0:1ad0e04b1bc5 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
youkee 0:1ad0e04b1bc5 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
youkee 0:1ad0e04b1bc5 20 * OTHER DEALINGS IN THE SOFTWARE.
youkee 0:1ad0e04b1bc5 21 *
youkee 0:1ad0e04b1bc5 22 * Except as contained in this notice, the name of Maxim Integrated
youkee 0:1ad0e04b1bc5 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
youkee 0:1ad0e04b1bc5 24 * Products, Inc. Branding Policy.
youkee 0:1ad0e04b1bc5 25 *
youkee 0:1ad0e04b1bc5 26 * The mere transfer of this software does not imply any licenses
youkee 0:1ad0e04b1bc5 27 * of trade secrets, proprietary technology, copyrights, patents,
youkee 0:1ad0e04b1bc5 28 * trademarks, maskwork rights, or any other form of intellectual
youkee 0:1ad0e04b1bc5 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
youkee 0:1ad0e04b1bc5 30 * ownership rights.
youkee 0:1ad0e04b1bc5 31 *******************************************************************************
youkee 0:1ad0e04b1bc5 32 */
youkee 0:1ad0e04b1bc5 33
youkee 0:1ad0e04b1bc5 34 #include "BMP180.h"
youkee 0:1ad0e04b1bc5 35
youkee 0:1ad0e04b1bc5 36 /***** Definitions *****/
youkee 0:1ad0e04b1bc5 37 #define I2C_ADDR (0xEE) // 1110111x
youkee 0:1ad0e04b1bc5 38
youkee 0:1ad0e04b1bc5 39 #define REG_ADDR_RESET (0xE0)
youkee 0:1ad0e04b1bc5 40 #define REG_ADDR_ID (0xD0)
youkee 0:1ad0e04b1bc5 41 #define REG_ADDR_CTRL (0xF4)
youkee 0:1ad0e04b1bc5 42 #define REG_ADDR_DATA (0xF6)
youkee 0:1ad0e04b1bc5 43 #define REG_ADDR_AC1 (0xAA)
youkee 0:1ad0e04b1bc5 44
youkee 0:1ad0e04b1bc5 45 #define CTRL_REG_TEMP (0x2E)
youkee 0:1ad0e04b1bc5 46 #define CTRL_REG_PRESS_0 (0x34)
youkee 0:1ad0e04b1bc5 47 #define CTRL_REG_PRESS_1 (0x74)
youkee 0:1ad0e04b1bc5 48 #define CTRL_REG_PRESS_2 (0xB4)
youkee 0:1ad0e04b1bc5 49 #define CTRL_REG_PRESS_3 (0xF4)
youkee 0:1ad0e04b1bc5 50
youkee 0:1ad0e04b1bc5 51 //******************************************************************************
youkee 0:1ad0e04b1bc5 52 BMP180::BMP180(PinName sda, PinName scl)
youkee 0:1ad0e04b1bc5 53 {
youkee 0:1ad0e04b1bc5 54 i2c_ = new I2C(sda, scl);
youkee 0:1ad0e04b1bc5 55 i2c_owner = true;
youkee 0:1ad0e04b1bc5 56
youkee 0:1ad0e04b1bc5 57 i2c_->frequency(400000);
youkee 0:1ad0e04b1bc5 58 }
youkee 0:1ad0e04b1bc5 59
youkee 0:1ad0e04b1bc5 60 //******************************************************************************
youkee 0:1ad0e04b1bc5 61 BMP180::BMP180(I2C *i2c) :
youkee 0:1ad0e04b1bc5 62 i2c_(i2c)
youkee 0:1ad0e04b1bc5 63 {
youkee 0:1ad0e04b1bc5 64 i2c_owner = false;
youkee 0:1ad0e04b1bc5 65 }
youkee 0:1ad0e04b1bc5 66
youkee 0:1ad0e04b1bc5 67 //******************************************************************************
youkee 0:1ad0e04b1bc5 68 BMP180::~BMP180()
youkee 0:1ad0e04b1bc5 69 {
youkee 0:1ad0e04b1bc5 70 if(i2c_owner) {
youkee 0:1ad0e04b1bc5 71 delete i2c_;
youkee 0:1ad0e04b1bc5 72 }
youkee 0:1ad0e04b1bc5 73 }
youkee 0:1ad0e04b1bc5 74
youkee 0:1ad0e04b1bc5 75 //******************************************************************************
youkee 0:1ad0e04b1bc5 76 int BMP180::init(void)
youkee 0:1ad0e04b1bc5 77 {
youkee 0:1ad0e04b1bc5 78 char addr;
youkee 0:1ad0e04b1bc5 79 char data[22];
youkee 0:1ad0e04b1bc5 80 int i;
youkee 0:1ad0e04b1bc5 81
youkee 0:1ad0e04b1bc5 82 if (checkId() != 0) {
youkee 0:1ad0e04b1bc5 83 return -1;
youkee 0:1ad0e04b1bc5 84 }
youkee 0:1ad0e04b1bc5 85
youkee 0:1ad0e04b1bc5 86 addr = REG_ADDR_AC1;
youkee 0:1ad0e04b1bc5 87 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
youkee 0:1ad0e04b1bc5 88 return -1;
youkee 0:1ad0e04b1bc5 89 }
youkee 0:1ad0e04b1bc5 90
youkee 0:1ad0e04b1bc5 91 if (i2c_->read(I2C_ADDR, data, 22) != 0) {
youkee 0:1ad0e04b1bc5 92 return -1;
youkee 0:1ad0e04b1bc5 93 }
youkee 0:1ad0e04b1bc5 94
youkee 0:1ad0e04b1bc5 95 for (i = 0; i < 11; i++) {
youkee 0:1ad0e04b1bc5 96 calib.value[i] = (data[2*i] << 8) | data[(2*i)+1];
youkee 0:1ad0e04b1bc5 97 }
youkee 0:1ad0e04b1bc5 98
youkee 0:1ad0e04b1bc5 99 return 0;
youkee 0:1ad0e04b1bc5 100 }
youkee 0:1ad0e04b1bc5 101
youkee 0:1ad0e04b1bc5 102 //******************************************************************************
youkee 0:1ad0e04b1bc5 103 int BMP180::reset(void)
youkee 0:1ad0e04b1bc5 104 {
youkee 0:1ad0e04b1bc5 105 char data;
youkee 0:1ad0e04b1bc5 106
youkee 0:1ad0e04b1bc5 107 data = REG_ADDR_RESET;
youkee 0:1ad0e04b1bc5 108 if (i2c_->write(I2C_ADDR, &data, 1) != 0) {
youkee 0:1ad0e04b1bc5 109 return -1;
youkee 0:1ad0e04b1bc5 110 }
youkee 0:1ad0e04b1bc5 111
youkee 0:1ad0e04b1bc5 112 data = 0xB6;
youkee 0:1ad0e04b1bc5 113 if (i2c_->write(I2C_ADDR, &data, 1) != 0) {
youkee 0:1ad0e04b1bc5 114 return -1;
youkee 0:1ad0e04b1bc5 115 }
youkee 0:1ad0e04b1bc5 116
youkee 0:1ad0e04b1bc5 117 return 0;
youkee 0:1ad0e04b1bc5 118 }
youkee 0:1ad0e04b1bc5 119
youkee 0:1ad0e04b1bc5 120 //******************************************************************************
youkee 0:1ad0e04b1bc5 121 int BMP180::checkId(void)
youkee 0:1ad0e04b1bc5 122 {
youkee 0:1ad0e04b1bc5 123 char addr;
youkee 0:1ad0e04b1bc5 124 char data;
youkee 0:1ad0e04b1bc5 125
youkee 0:1ad0e04b1bc5 126 addr = REG_ADDR_ID;
youkee 0:1ad0e04b1bc5 127 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
youkee 0:1ad0e04b1bc5 128 return -1;
youkee 0:1ad0e04b1bc5 129 }
youkee 0:1ad0e04b1bc5 130
youkee 0:1ad0e04b1bc5 131 if (i2c_->read(I2C_ADDR, &data, 1) != 0) {
youkee 0:1ad0e04b1bc5 132 return -1;
youkee 0:1ad0e04b1bc5 133 }
youkee 0:1ad0e04b1bc5 134
youkee 0:1ad0e04b1bc5 135 if (data != 0x55) {
youkee 0:1ad0e04b1bc5 136 return -1;
youkee 0:1ad0e04b1bc5 137 }
youkee 0:1ad0e04b1bc5 138
youkee 0:1ad0e04b1bc5 139 return 0;
youkee 0:1ad0e04b1bc5 140 }
youkee 0:1ad0e04b1bc5 141
youkee 0:1ad0e04b1bc5 142 //******************************************************************************
youkee 0:1ad0e04b1bc5 143 int BMP180::startPressure(BMP180::oversampling_t oss)
youkee 0:1ad0e04b1bc5 144 {
youkee 0:1ad0e04b1bc5 145 char data[2];
youkee 0:1ad0e04b1bc5 146
youkee 0:1ad0e04b1bc5 147 data[0] = REG_ADDR_CTRL;
youkee 0:1ad0e04b1bc5 148 data[1] = CTRL_REG_PRESS_0 | ((oss & 0x3) << 6);
youkee 0:1ad0e04b1bc5 149 oss_ = oss;
youkee 0:1ad0e04b1bc5 150
youkee 0:1ad0e04b1bc5 151 if (i2c_->write(I2C_ADDR, data, 2) != 0) {
youkee 0:1ad0e04b1bc5 152 return -1;
youkee 0:1ad0e04b1bc5 153 }
youkee 0:1ad0e04b1bc5 154
youkee 0:1ad0e04b1bc5 155 return 0;
youkee 0:1ad0e04b1bc5 156 }
youkee 0:1ad0e04b1bc5 157
youkee 0:1ad0e04b1bc5 158 //******************************************************************************
youkee 0:1ad0e04b1bc5 159 int BMP180::getPressure(int *pressure)
youkee 0:1ad0e04b1bc5 160 {
youkee 0:1ad0e04b1bc5 161 char addr, byte[3];
youkee 0:1ad0e04b1bc5 162 uint32_t up;
youkee 0:1ad0e04b1bc5 163 int32_t b6, x1, x2, x3, b3, p;
youkee 0:1ad0e04b1bc5 164 uint32_t b4, b7;
youkee 0:1ad0e04b1bc5 165
youkee 0:1ad0e04b1bc5 166 addr = REG_ADDR_DATA;
youkee 0:1ad0e04b1bc5 167 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
youkee 0:1ad0e04b1bc5 168 return -1;
youkee 0:1ad0e04b1bc5 169 }
youkee 0:1ad0e04b1bc5 170
youkee 0:1ad0e04b1bc5 171 if (i2c_->read(I2C_ADDR, byte, 3) != 0) {
youkee 0:1ad0e04b1bc5 172 return -1;
youkee 0:1ad0e04b1bc5 173 }
youkee 0:1ad0e04b1bc5 174
youkee 0:1ad0e04b1bc5 175 up = ((byte[0] << 16) | (byte[1] << 8) | byte[2]) >> (8 - oss_);
youkee 0:1ad0e04b1bc5 176
youkee 0:1ad0e04b1bc5 177 b6 = b5 - 4000;
youkee 0:1ad0e04b1bc5 178 x1 = (b6 * b6) >> 12;
youkee 0:1ad0e04b1bc5 179 x1 *= calib.b2;
youkee 0:1ad0e04b1bc5 180 x1 >>= 11;
youkee 0:1ad0e04b1bc5 181 x2 = calib.ac2 * b6;
youkee 0:1ad0e04b1bc5 182 x2 >>= 11;
youkee 0:1ad0e04b1bc5 183 x3 = x1 + x2;
youkee 0:1ad0e04b1bc5 184 b3 = (((((int32_t)calib.ac1) * 4 + x3) << oss_) + 2);
youkee 0:1ad0e04b1bc5 185 b3 >>= 2;
youkee 0:1ad0e04b1bc5 186
youkee 0:1ad0e04b1bc5 187 x1 = (calib.ac3 * b6) >> 13;
youkee 0:1ad0e04b1bc5 188 x2 = (calib.b1 * ((b6 * b6) >> 12)) >> 16;
youkee 0:1ad0e04b1bc5 189 x3 = (x1 + x2 + 2) >> 2;
youkee 0:1ad0e04b1bc5 190 b4 = (calib.ac4 * (uint32_t)(x3 + 32768)) >> 15;
youkee 0:1ad0e04b1bc5 191 b7 = ((uint32_t)up - b3) * (50000 >> oss_);
youkee 0:1ad0e04b1bc5 192 p = ((b7 < 0x80000000) ? ((b7 << 1) / b4) : ((b7 / b4) * 2));
youkee 0:1ad0e04b1bc5 193 x1 = p >> 8;
youkee 0:1ad0e04b1bc5 194 x1 *= x1;
youkee 0:1ad0e04b1bc5 195 x1 = (x1 * 3038) >> 16;
youkee 0:1ad0e04b1bc5 196 x2 = (-7357 * p) >> 16;
youkee 0:1ad0e04b1bc5 197 p += (x1 + x2 + 3791) >> 4;
youkee 0:1ad0e04b1bc5 198
youkee 0:1ad0e04b1bc5 199 *pressure = p;
youkee 0:1ad0e04b1bc5 200
youkee 0:1ad0e04b1bc5 201 return 0;
youkee 0:1ad0e04b1bc5 202 }
youkee 0:1ad0e04b1bc5 203
youkee 0:1ad0e04b1bc5 204 //******************************************************************************
youkee 0:1ad0e04b1bc5 205 int BMP180::startTemperature(void)
youkee 0:1ad0e04b1bc5 206 {
youkee 0:1ad0e04b1bc5 207 char data[2] = { REG_ADDR_CTRL, CTRL_REG_TEMP };
youkee 0:1ad0e04b1bc5 208
youkee 0:1ad0e04b1bc5 209 if (i2c_->write(I2C_ADDR, data, 2) != 0) {
youkee 0:1ad0e04b1bc5 210 return -1;
youkee 0:1ad0e04b1bc5 211 }
youkee 0:1ad0e04b1bc5 212
youkee 0:1ad0e04b1bc5 213 return 0;
youkee 0:1ad0e04b1bc5 214 }
youkee 0:1ad0e04b1bc5 215
youkee 0:1ad0e04b1bc5 216 //******************************************************************************
youkee 0:1ad0e04b1bc5 217 int BMP180::getTemperature(float *tempC)
youkee 0:1ad0e04b1bc5 218 {
youkee 0:1ad0e04b1bc5 219 char addr, byte[2];
youkee 0:1ad0e04b1bc5 220 uint16_t ut;
youkee 0:1ad0e04b1bc5 221 int32_t x1, x2;
youkee 0:1ad0e04b1bc5 222
youkee 0:1ad0e04b1bc5 223 addr = REG_ADDR_DATA;
youkee 0:1ad0e04b1bc5 224 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
youkee 0:1ad0e04b1bc5 225 return -1;
youkee 0:1ad0e04b1bc5 226 }
youkee 0:1ad0e04b1bc5 227
youkee 0:1ad0e04b1bc5 228 if (i2c_->read(I2C_ADDR, byte, 2) != 0) {
youkee 0:1ad0e04b1bc5 229 return -1;
youkee 0:1ad0e04b1bc5 230 }
youkee 0:1ad0e04b1bc5 231
youkee 0:1ad0e04b1bc5 232 ut = (byte[0] << 8) | byte[1];
youkee 0:1ad0e04b1bc5 233
youkee 0:1ad0e04b1bc5 234 x1 = ((ut - calib.ac6) * calib.ac5) >> 15;
youkee 0:1ad0e04b1bc5 235 x2 = (calib.mc << 11) / (x1 + calib.md);
youkee 0:1ad0e04b1bc5 236 b5 = x1 + x2;
youkee 0:1ad0e04b1bc5 237
youkee 0:1ad0e04b1bc5 238 *tempC = (float)(b5 + 8) / 160;
youkee 0:1ad0e04b1bc5 239
youkee 0:1ad0e04b1bc5 240 return 0;
youkee 0:1ad0e04b1bc5 241 }
youkee 0:1ad0e04b1bc5 242
youkee 0:1ad0e04b1bc5 243 //******************************************************************************
youkee 0:1ad0e04b1bc5 244 int BMP180::getTemperature(int16_t *tempCx10)
youkee 0:1ad0e04b1bc5 245 {
youkee 0:1ad0e04b1bc5 246 char addr, byte[2];
youkee 0:1ad0e04b1bc5 247 uint16_t ut;
youkee 0:1ad0e04b1bc5 248 int32_t x1, x2;
youkee 0:1ad0e04b1bc5 249
youkee 0:1ad0e04b1bc5 250 addr = REG_ADDR_DATA;
youkee 0:1ad0e04b1bc5 251 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
youkee 0:1ad0e04b1bc5 252 return -1;
youkee 0:1ad0e04b1bc5 253 }
youkee 0:1ad0e04b1bc5 254
youkee 0:1ad0e04b1bc5 255 if (i2c_->read(I2C_ADDR, byte, 2) != 0) {
youkee 0:1ad0e04b1bc5 256 return -1;
youkee 0:1ad0e04b1bc5 257 }
youkee 0:1ad0e04b1bc5 258
youkee 0:1ad0e04b1bc5 259 ut = (byte[0] << 8) | byte[1];
youkee 0:1ad0e04b1bc5 260
youkee 0:1ad0e04b1bc5 261 x1 = ((ut - calib.ac6) * calib.ac5) >> 15;
youkee 0:1ad0e04b1bc5 262 x2 = (calib.mc << 11) / (x1 + calib.md);
youkee 0:1ad0e04b1bc5 263 b5 = x1 + x2;
youkee 0:1ad0e04b1bc5 264
youkee 0:1ad0e04b1bc5 265 *tempCx10 = (b5 + 8) >> 4;
youkee 0:1ad0e04b1bc5 266
youkee 0:1ad0e04b1bc5 267 return 0;
youkee 0:1ad0e04b1bc5 268 }