STMicroelectronics LPS331AP, LPS25H SPI Library. This library is base on https://developer.mbed.org/users/nyamfg/code/LPS331_I2C/
Dependents: LPS331_SPI_Test main_SPC
Fork of LPS331_I2C by
LPS331_SPI.cpp@3:5a56dd5131bb, 2016-07-28 (annotated)
- Committer:
- ohtsuka
- Date:
- Thu Jul 28 09:28:02 2016 +0000
- Revision:
- 3:5a56dd5131bb
- Parent:
- 2:c2aa9cfc45c2
- Child:
- 4:af2153bce185
replace string "I2C" to "SPI", and add credit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nyamfg | 0:3fd57444bc65 | 1 | /* |
ohtsuka | 3:5a56dd5131bb | 2 | * I2C/SPI digital pressure sensor "LPS331AP" library for SPI mode. |
nyamfg | 0:3fd57444bc65 | 3 | * |
ohtsuka | 3:5a56dd5131bb | 4 | * Copyright(c) -2016 Toru OHTSUKA, |
nyamfg | 0:3fd57444bc65 | 5 | * Copyright(c) -2013 unos@NYAMFG, |
nyamfg | 0:3fd57444bc65 | 6 | * Released under the MIT License: http://mbed.org/license/mit |
nyamfg | 0:3fd57444bc65 | 7 | * |
ohtsuka | 3:5a56dd5131bb | 8 | * revision: see LPS331_SPI.h. |
nyamfg | 0:3fd57444bc65 | 9 | */ |
nyamfg | 0:3fd57444bc65 | 10 | |
ohtsuka | 3:5a56dd5131bb | 11 | #include "LPS331_SPI.h" |
nyamfg | 0:3fd57444bc65 | 12 | |
ohtsuka | 3:5a56dd5131bb | 13 | LPS331_SPI::LPS331_SPI(PinName sda, PinName scl, bool sa0) : _i2c(sda, scl) |
nyamfg | 0:3fd57444bc65 | 14 | { |
ohtsuka | 3:5a56dd5131bb | 15 | if(sa0 == LPS331_SPI_SA0_HIGH) { |
ohtsuka | 3:5a56dd5131bb | 16 | _address = LPS331_SPI_ADDRESS_SA0_HIGH; |
nyamfg | 0:3fd57444bc65 | 17 | } else { |
ohtsuka | 3:5a56dd5131bb | 18 | _address = LPS331_SPI_ADDRESS_SA0_LOW; |
nyamfg | 0:3fd57444bc65 | 19 | } |
nyamfg | 0:3fd57444bc65 | 20 | _i2c.frequency(400 * 1000); |
nyamfg | 0:3fd57444bc65 | 21 | _ctrlreg1 = 0x20; |
nyamfg | 0:3fd57444bc65 | 22 | } |
nyamfg | 0:3fd57444bc65 | 23 | |
ohtsuka | 3:5a56dd5131bb | 24 | LPS331_SPI::~LPS331_SPI() |
nyamfg | 0:3fd57444bc65 | 25 | { |
nyamfg | 0:3fd57444bc65 | 26 | } |
nyamfg | 0:3fd57444bc65 | 27 | |
ohtsuka | 3:5a56dd5131bb | 28 | char LPS331_SPI::whoami() |
nyamfg | 0:3fd57444bc65 | 29 | { |
nyamfg | 0:3fd57444bc65 | 30 | return _read(0x0f); |
nyamfg | 0:3fd57444bc65 | 31 | } |
nyamfg | 0:3fd57444bc65 | 32 | |
ohtsuka | 3:5a56dd5131bb | 33 | bool LPS331_SPI::isAvailable() |
nyamfg | 0:3fd57444bc65 | 34 | { |
nyamfg | 0:3fd57444bc65 | 35 | if(whoami() == 0xbb) { return true; } |
nyamfg | 0:3fd57444bc65 | 36 | |
nyamfg | 0:3fd57444bc65 | 37 | return false; |
nyamfg | 0:3fd57444bc65 | 38 | } |
nyamfg | 0:3fd57444bc65 | 39 | |
ohtsuka | 3:5a56dd5131bb | 40 | void LPS331_SPI::setResolution(char pressure_avg, char temp_avg) |
nyamfg | 0:3fd57444bc65 | 41 | { |
nyamfg | 0:3fd57444bc65 | 42 | _write(0x10, ((temp_avg & 0x07) << 4) | (pressure_avg & 0x0f)); |
nyamfg | 0:3fd57444bc65 | 43 | } |
nyamfg | 0:3fd57444bc65 | 44 | |
ohtsuka | 3:5a56dd5131bb | 45 | void LPS331_SPI::setActive(bool is_active) |
nyamfg | 0:3fd57444bc65 | 46 | { |
nyamfg | 0:3fd57444bc65 | 47 | if(is_active) { |
nyamfg | 0:3fd57444bc65 | 48 | _ctrlreg1 |= 0x80; |
nyamfg | 0:3fd57444bc65 | 49 | } else { |
nyamfg | 0:3fd57444bc65 | 50 | _ctrlreg1 &= ~0x80; |
nyamfg | 0:3fd57444bc65 | 51 | } |
nyamfg | 0:3fd57444bc65 | 52 | |
nyamfg | 0:3fd57444bc65 | 53 | _write(0x20, _ctrlreg1); |
nyamfg | 0:3fd57444bc65 | 54 | } |
nyamfg | 0:3fd57444bc65 | 55 | |
ohtsuka | 3:5a56dd5131bb | 56 | void LPS331_SPI::setDataRate(char datarate) |
nyamfg | 0:3fd57444bc65 | 57 | { |
nyamfg | 0:3fd57444bc65 | 58 | datarate &= 0x07; |
nyamfg | 0:3fd57444bc65 | 59 | |
nyamfg | 0:3fd57444bc65 | 60 | _ctrlreg1 &= ~(0x07 << 4); |
nyamfg | 0:3fd57444bc65 | 61 | _ctrlreg1 |= datarate << 4; |
nyamfg | 0:3fd57444bc65 | 62 | |
nyamfg | 0:3fd57444bc65 | 63 | _write(0x20, _ctrlreg1); |
nyamfg | 0:3fd57444bc65 | 64 | } |
nyamfg | 0:3fd57444bc65 | 65 | |
nyamfg | 0:3fd57444bc65 | 66 | |
ohtsuka | 3:5a56dd5131bb | 67 | float LPS331_SPI::getPressure() |
nyamfg | 0:3fd57444bc65 | 68 | { |
nyamfg | 1:b7d3d6e82049 | 69 | char data[3]; |
nyamfg | 0:3fd57444bc65 | 70 | float pressure = 0; |
nyamfg | 1:b7d3d6e82049 | 71 | |
nyamfg | 1:b7d3d6e82049 | 72 | _read_multibyte(0x28, data, 3); |
nyamfg | 1:b7d3d6e82049 | 73 | |
nyamfg | 1:b7d3d6e82049 | 74 | pressure = data[0]; |
nyamfg | 1:b7d3d6e82049 | 75 | pressure += data[1] << 8; |
nyamfg | 1:b7d3d6e82049 | 76 | pressure += data[2] << 16; |
nyamfg | 0:3fd57444bc65 | 77 | pressure /= 4096.0; |
nyamfg | 0:3fd57444bc65 | 78 | |
nyamfg | 0:3fd57444bc65 | 79 | return pressure; |
nyamfg | 0:3fd57444bc65 | 80 | } |
nyamfg | 0:3fd57444bc65 | 81 | |
ohtsuka | 3:5a56dd5131bb | 82 | float LPS331_SPI::getTemperature() |
nyamfg | 0:3fd57444bc65 | 83 | { |
nyamfg | 1:b7d3d6e82049 | 84 | char data[2]; |
nyamfg | 0:3fd57444bc65 | 85 | short temp = 0; |
nyamfg | 1:b7d3d6e82049 | 86 | |
nyamfg | 1:b7d3d6e82049 | 87 | _read_multibyte(0x2b, data, 2); |
nyamfg | 1:b7d3d6e82049 | 88 | |
nyamfg | 1:b7d3d6e82049 | 89 | temp = data[0]; |
nyamfg | 1:b7d3d6e82049 | 90 | temp |= data[1] << 8; |
nyamfg | 0:3fd57444bc65 | 91 | |
nyamfg | 0:3fd57444bc65 | 92 | return (float)(42.5 + temp / 480.0); |
nyamfg | 0:3fd57444bc65 | 93 | } |
nyamfg | 0:3fd57444bc65 | 94 | |
nyamfg | 0:3fd57444bc65 | 95 | |
ohtsuka | 3:5a56dd5131bb | 96 | void LPS331_SPI::_write(char subaddress, char data) |
nyamfg | 0:3fd57444bc65 | 97 | { |
nyamfg | 0:3fd57444bc65 | 98 | _i2c.start(); |
nyamfg | 0:3fd57444bc65 | 99 | _i2c.write(_address); |
nyamfg | 0:3fd57444bc65 | 100 | _i2c.write(subaddress); |
nyamfg | 0:3fd57444bc65 | 101 | _i2c.write(data); |
nyamfg | 0:3fd57444bc65 | 102 | _i2c.stop(); |
nyamfg | 0:3fd57444bc65 | 103 | } |
nyamfg | 0:3fd57444bc65 | 104 | |
ohtsuka | 3:5a56dd5131bb | 105 | char LPS331_SPI::_read(char subaddress) |
nyamfg | 0:3fd57444bc65 | 106 | { |
nyamfg | 0:3fd57444bc65 | 107 | char result = 0; |
nyamfg | 0:3fd57444bc65 | 108 | |
nyamfg | 0:3fd57444bc65 | 109 | _i2c.start(); |
nyamfg | 0:3fd57444bc65 | 110 | _i2c.write(_address); |
nyamfg | 0:3fd57444bc65 | 111 | _i2c.write(subaddress); |
nyamfg | 0:3fd57444bc65 | 112 | |
nyamfg | 0:3fd57444bc65 | 113 | _i2c.start(); |
nyamfg | 0:3fd57444bc65 | 114 | _i2c.write(_address | 1); |
nyamfg | 0:3fd57444bc65 | 115 | result = _i2c.read(0); |
nyamfg | 0:3fd57444bc65 | 116 | |
nyamfg | 0:3fd57444bc65 | 117 | _i2c.stop(); |
nyamfg | 0:3fd57444bc65 | 118 | |
nyamfg | 0:3fd57444bc65 | 119 | return result; |
nyamfg | 0:3fd57444bc65 | 120 | } |
nyamfg | 0:3fd57444bc65 | 121 | |
ohtsuka | 3:5a56dd5131bb | 122 | void LPS331_SPI::_read_multibyte(char startsubaddress, char* data, char count) |
nyamfg | 1:b7d3d6e82049 | 123 | { |
nyamfg | 1:b7d3d6e82049 | 124 | _i2c.start(); |
nyamfg | 1:b7d3d6e82049 | 125 | _i2c.write(_address); |
nyamfg | 1:b7d3d6e82049 | 126 | _i2c.write(startsubaddress | 0x80); |
nyamfg | 1:b7d3d6e82049 | 127 | |
nyamfg | 1:b7d3d6e82049 | 128 | _i2c.start(); |
nyamfg | 1:b7d3d6e82049 | 129 | _i2c.write(_address | 1); |
nyamfg | 1:b7d3d6e82049 | 130 | |
nyamfg | 1:b7d3d6e82049 | 131 | for(int i = 0; i < count; i++) { |
nyamfg | 1:b7d3d6e82049 | 132 | data[i] = _i2c.read((i == count - 1) ? 0 : 1); |
nyamfg | 1:b7d3d6e82049 | 133 | } |
nyamfg | 1:b7d3d6e82049 | 134 | |
nyamfg | 1:b7d3d6e82049 | 135 | _i2c.stop(); |
nyamfg | 1:b7d3d6e82049 | 136 | } |
nyamfg | 1:b7d3d6e82049 | 137 |