James Devine / LPS25H

Dependents:   Cosmic_Pi_STM32_i2c

Committer:
pingu_98
Date:
Sun Jan 06 15:29:59 2019 +0000
Revision:
2:d3d42acce8e5
Parent:
1:54e65e221cae
Modified I2C usage to be compatible with noncopy requirements of MBedOS 5.x

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:8fc511bd51af 1 /*
kenjiArai 0:8fc511bd51af 2 * mbed library program
kenjiArai 0:8fc511bd51af 3 * LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
kenjiArai 0:8fc511bd51af 4 * made by STMicroelectronics
kenjiArai 0:8fc511bd51af 5 * http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230?s_searchtype=partnumber
kenjiArai 0:8fc511bd51af 6 *
kenjiArai 0:8fc511bd51af 7 * Copyright (c) 2015 Kenji Arai / JH1PJL
kenjiArai 0:8fc511bd51af 8 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:8fc511bd51af 9 * http://mbed.org/users/kenjiArai/
kenjiArai 0:8fc511bd51af 10 * Created: Feburary 21st, 2015
kenjiArai 0:8fc511bd51af 11 * Revised: Feburary 22nd, 2015
kenjiArai 0:8fc511bd51af 12 *
kenjiArai 0:8fc511bd51af 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:8fc511bd51af 14 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:8fc511bd51af 15 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:8fc511bd51af 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:8fc511bd51af 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:8fc511bd51af 18 */
kenjiArai 0:8fc511bd51af 19
kenjiArai 0:8fc511bd51af 20 #include "LPS25H.h"
kenjiArai 0:8fc511bd51af 21
pingu_98 2:d3d42acce8e5 22 /*LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr) : i2c_(p_sda, p_scl)
kenjiArai 0:8fc511bd51af 23 {
kenjiArai 0:8fc511bd51af 24 LPS25H_addr = addr;
kenjiArai 0:8fc511bd51af 25 LPS25H_mode = FIFO_HW_FILTER;
kenjiArai 0:8fc511bd51af 26 init();
kenjiArai 0:8fc511bd51af 27 }
kenjiArai 0:8fc511bd51af 28
pingu_98 2:d3d42acce8e5 29 LPS25H::LPS25H (PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode) : i2c_(p_sda, p_scl)
kenjiArai 0:8fc511bd51af 30 {
kenjiArai 0:8fc511bd51af 31 LPS25H_addr = addr;
kenjiArai 0:8fc511bd51af 32 LPS25H_mode = mode;
kenjiArai 0:8fc511bd51af 33 init();
kenjiArai 0:8fc511bd51af 34 }
pingu_98 2:d3d42acce8e5 35 */
kenjiArai 0:8fc511bd51af 36
pingu_98 2:d3d42acce8e5 37 /*
pingu_98 2:d3d42acce8e5 38 Si7020::Si7020(I2C *i2c) :
pingu_98 2:d3d42acce8e5 39 i2c_(i2c)
kenjiArai 0:8fc511bd51af 40 {
pingu_98 2:d3d42acce8e5 41 i2c_owner = false;
pingu_98 2:d3d42acce8e5 42 }
pingu_98 2:d3d42acce8e5 43 */
pingu_98 2:d3d42acce8e5 44
pingu_98 2:d3d42acce8e5 45 LPS25H::LPS25H (I2C *i2c, uint8_t addr) : i2c_(i2c)
pingu_98 2:d3d42acce8e5 46 {
pingu_98 2:d3d42acce8e5 47 //i2c_owner = false;
kenjiArai 0:8fc511bd51af 48 LPS25H_addr = addr;
kenjiArai 0:8fc511bd51af 49 LPS25H_mode = FIFO_HW_FILTER;
kenjiArai 0:8fc511bd51af 50 init();
kenjiArai 0:8fc511bd51af 51 }
kenjiArai 0:8fc511bd51af 52
pingu_98 2:d3d42acce8e5 53 /*
pingu_98 2:d3d42acce8e5 54 LPS25H::LPS25H (I2C& pi2c_, uint8_t addr, uint8_t mode) : i2c_(pi2c_)
kenjiArai 0:8fc511bd51af 55 {
kenjiArai 0:8fc511bd51af 56 LPS25H_addr = addr;
kenjiArai 0:8fc511bd51af 57 LPS25H_mode = mode;
kenjiArai 0:8fc511bd51af 58 init();
kenjiArai 0:8fc511bd51af 59 }
pingu_98 2:d3d42acce8e5 60 */
kenjiArai 0:8fc511bd51af 61 /////////////// Initialize ////////////////////////////////
kenjiArai 0:8fc511bd51af 62 void LPS25H::init(void)
kenjiArai 0:8fc511bd51af 63 {
pingu_98 2:d3d42acce8e5 64 //i2c_.frequency(100000);
kenjiArai 0:8fc511bd51af 65 // Check acc is available of not
kenjiArai 0:8fc511bd51af 66 dt[0] = LPS25H_WHO_AM_I;
pingu_98 2:d3d42acce8e5 67 i2c_->write(LPS25H_addr, dt, 1, true);
pingu_98 2:d3d42acce8e5 68 i2c_->read(LPS25H_addr, dt, 1, false);
kenjiArai 0:8fc511bd51af 69 if (dt[0] == I_AM_LPS25H) {
kenjiArai 0:8fc511bd51af 70 LPS25H_id = I_AM_LPS25H;
kenjiArai 0:8fc511bd51af 71 LPS25H_ready = 1;
kenjiArai 0:8fc511bd51af 72 } else {
kenjiArai 0:8fc511bd51af 73 LPS25H_id = 0;
kenjiArai 0:8fc511bd51af 74 LPS25H_ready = 0;
kenjiArai 0:8fc511bd51af 75 return; // acc chip is NOT on I2C line then terminate
kenjiArai 0:8fc511bd51af 76 }
kenjiArai 0:8fc511bd51af 77 if (LPS25H_mode == FIFO_HW_FILTER){
kenjiArai 0:8fc511bd51af 78 // Hardware digital filter
kenjiArai 0:8fc511bd51af 79 // AN4450 April 2014 Rev1 P20/26, Filter enabling and suggested configuration
kenjiArai 0:8fc511bd51af 80 dt[0] = LPS25H_RES_CONF;
kenjiArai 0:8fc511bd51af 81 dt[1] = 0x05;
pingu_98 2:d3d42acce8e5 82 i2c_->write(LPS25H_addr, dt, 2, false);
kenjiArai 0:8fc511bd51af 83 dt[0] = LPS25H_FIFO_CTRL;
kenjiArai 0:8fc511bd51af 84 dt[1] = 0xdf;
pingu_98 2:d3d42acce8e5 85 i2c_->write(LPS25H_addr, dt, 2, false);
kenjiArai 0:8fc511bd51af 86 dt[0] = LPS25H_CTRL_REG2;
kenjiArai 0:8fc511bd51af 87 dt[1] = 0x40;
pingu_98 2:d3d42acce8e5 88 i2c_->write(LPS25H_addr, dt, 2, false);
kenjiArai 0:8fc511bd51af 89 dt[0] = LPS25H_CTRL_REG1;
kenjiArai 0:8fc511bd51af 90 dt[1] = 0x90;
pingu_98 2:d3d42acce8e5 91 i2c_->write(LPS25H_addr, dt, 2, false);
kenjiArai 0:8fc511bd51af 92 } else {
kenjiArai 0:8fc511bd51af 93 dt[0] = LPS25H_CTRL_REG2;
kenjiArai 0:8fc511bd51af 94 dt[1] = 0x0;
pingu_98 2:d3d42acce8e5 95 i2c_->write(LPS25H_addr, dt, 2, false);
kenjiArai 0:8fc511bd51af 96 dt[0] = LPS25H_CTRL_REG1;
kenjiArai 0:8fc511bd51af 97 dt[1] = CR_STD_SET;
pingu_98 2:d3d42acce8e5 98 i2c_->write(LPS25H_addr, dt, 2, false);
kenjiArai 0:8fc511bd51af 99 }
kenjiArai 0:8fc511bd51af 100 }
kenjiArai 0:8fc511bd51af 101
kenjiArai 0:8fc511bd51af 102 /////////////// Start conv. and gwt all data //////////////
kenjiArai 0:8fc511bd51af 103 void LPS25H::get(void)
kenjiArai 0:8fc511bd51af 104 {
kenjiArai 0:8fc511bd51af 105 if (LPS25H_ready == 0) {
kenjiArai 0:8fc511bd51af 106 press = 0;
kenjiArai 0:8fc511bd51af 107 temp = 0;
kenjiArai 0:8fc511bd51af 108 return;
kenjiArai 0:8fc511bd51af 109 }
kenjiArai 0:8fc511bd51af 110 dt[0] = LPS25H_PRESS_POUT_XL | 0x80;
pingu_98 2:d3d42acce8e5 111 i2c_->write(LPS25H_addr, dt, 1, true);
pingu_98 2:d3d42acce8e5 112 i2c_->read(LPS25H_addr, dt, 3, false);
kenjiArai 0:8fc511bd51af 113 press = dt[2] << 16 | dt[1] << 8 | dt[0];
kenjiArai 0:8fc511bd51af 114 dt[0] = LPS25H_TEMP_OUT_L | 0x80;
pingu_98 2:d3d42acce8e5 115 i2c_->write(LPS25H_addr, dt, 1, true);
pingu_98 2:d3d42acce8e5 116 i2c_->read(LPS25H_addr, dt, 2, false);
kenjiArai 0:8fc511bd51af 117 temp = dt[1] << 8 | dt[0];
kenjiArai 0:8fc511bd51af 118 }
kenjiArai 0:8fc511bd51af 119
kenjiArai 0:8fc511bd51af 120 /////////////// Read data from sensor /////////////////////
kenjiArai 0:8fc511bd51af 121 float LPS25H::pressure()
kenjiArai 0:8fc511bd51af 122 {
kenjiArai 0:8fc511bd51af 123 return (float)press / 4096;
kenjiArai 0:8fc511bd51af 124 }
kenjiArai 0:8fc511bd51af 125
kenjiArai 0:8fc511bd51af 126 /////////////// Read data from sensor /////////////////////
kenjiArai 0:8fc511bd51af 127 float LPS25H::temperature()
kenjiArai 0:8fc511bd51af 128 {
martinsimpson 1:54e65e221cae 129 return (float)temp / 480 + 42.5f; //added 'f' to stop warning regarding single precision implicit conversion to double MS 29/03/2017
kenjiArai 0:8fc511bd51af 130 }
kenjiArai 0:8fc511bd51af 131
kenjiArai 0:8fc511bd51af 132 /////////////// ID ////////////////////////////////////////
kenjiArai 0:8fc511bd51af 133 uint8_t LPS25H::read_id()
kenjiArai 0:8fc511bd51af 134 {
kenjiArai 0:8fc511bd51af 135 dt[0] = LPS25H_WHO_AM_I;
pingu_98 2:d3d42acce8e5 136 i2c_->write(LPS25H_addr, dt, 1, true);
pingu_98 2:d3d42acce8e5 137 i2c_->read(LPS25H_addr, dt, 1, false);
kenjiArai 0:8fc511bd51af 138 return (uint8_t)dt[0];
kenjiArai 0:8fc511bd51af 139 }
kenjiArai 0:8fc511bd51af 140
kenjiArai 0:8fc511bd51af 141 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:8fc511bd51af 142 void LPS25H::frequency(int hz)
kenjiArai 0:8fc511bd51af 143 {
pingu_98 2:d3d42acce8e5 144 i2c_->frequency(hz);
kenjiArai 0:8fc511bd51af 145 }
kenjiArai 0:8fc511bd51af 146
kenjiArai 0:8fc511bd51af 147 /////////////// General purpose R/W ///////////////////////
kenjiArai 0:8fc511bd51af 148 uint8_t LPS25H::read_reg(uint8_t addr)
kenjiArai 0:8fc511bd51af 149 {
kenjiArai 0:8fc511bd51af 150 if (LPS25H_ready == 1) {
kenjiArai 0:8fc511bd51af 151 dt[0] = addr;
pingu_98 2:d3d42acce8e5 152 i2c_->write(LPS25H_addr, dt, 1, true);
pingu_98 2:d3d42acce8e5 153 i2c_->read(LPS25H_addr, dt, 1, false);
kenjiArai 0:8fc511bd51af 154 } else {
kenjiArai 0:8fc511bd51af 155 dt[0] = 0xff;
kenjiArai 0:8fc511bd51af 156 }
kenjiArai 0:8fc511bd51af 157 return (uint8_t)dt[0];
kenjiArai 0:8fc511bd51af 158 }
kenjiArai 0:8fc511bd51af 159
kenjiArai 0:8fc511bd51af 160 void LPS25H::write_reg(uint8_t addr, uint8_t data)
kenjiArai 0:8fc511bd51af 161 {
kenjiArai 0:8fc511bd51af 162 if (LPS25H_ready == 1) {
kenjiArai 0:8fc511bd51af 163 dt[0] = addr;
kenjiArai 0:8fc511bd51af 164 dt[1] = data;
pingu_98 2:d3d42acce8e5 165 i2c_->write(LPS25H_addr, dt, 2, false);
kenjiArai 0:8fc511bd51af 166 }
kenjiArai 0:8fc511bd51af 167 }