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@7:b74daa677551, 2016-07-28 (annotated)
- Committer:
- ohtsuka
- Date:
- Thu Jul 28 10:32:13 2016 +0000
- Revision:
- 7:b74daa677551
- Parent:
- 6:309af2a65bd6
add comment "support LPS25H"
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nyamfg | 0:3fd57444bc65 | 1 | /* |
ohtsuka | 7:b74daa677551 | 2 | * I2C/SPI digital pressure sensor "LPS331AP" "LPS25H" 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 | 4:af2153bce185 | 13 | LPS331_SPI::LPS331_SPI(PinName mosi, PinName miso, PinName sclk, PinName cs_pin):_spi(mosi, miso, sclk), _cs(cs_pin) |
nyamfg | 0:3fd57444bc65 | 14 | { |
ohtsuka | 4:af2153bce185 | 15 | _spi.format(8,0); |
ohtsuka | 4:af2153bce185 | 16 | _spi.frequency(1000000); |
ohtsuka | 4:af2153bce185 | 17 | |
nyamfg | 0:3fd57444bc65 | 18 | _ctrlreg1 = 0x20; |
nyamfg | 0:3fd57444bc65 | 19 | } |
nyamfg | 0:3fd57444bc65 | 20 | |
ohtsuka | 3:5a56dd5131bb | 21 | LPS331_SPI::~LPS331_SPI() |
nyamfg | 0:3fd57444bc65 | 22 | { |
nyamfg | 0:3fd57444bc65 | 23 | } |
nyamfg | 0:3fd57444bc65 | 24 | |
ohtsuka | 3:5a56dd5131bb | 25 | char LPS331_SPI::whoami() |
nyamfg | 0:3fd57444bc65 | 26 | { |
nyamfg | 0:3fd57444bc65 | 27 | return _read(0x0f); |
nyamfg | 0:3fd57444bc65 | 28 | } |
nyamfg | 0:3fd57444bc65 | 29 | |
ohtsuka | 6:309af2a65bd6 | 30 | bool LPS331_SPI::isLPS331() |
nyamfg | 0:3fd57444bc65 | 31 | { |
nyamfg | 0:3fd57444bc65 | 32 | if(whoami() == 0xbb) { return true; } |
nyamfg | 0:3fd57444bc65 | 33 | |
nyamfg | 0:3fd57444bc65 | 34 | return false; |
nyamfg | 0:3fd57444bc65 | 35 | } |
nyamfg | 0:3fd57444bc65 | 36 | |
ohtsuka | 6:309af2a65bd6 | 37 | bool LPS331_SPI::isLPS25H() |
ohtsuka | 6:309af2a65bd6 | 38 | { |
ohtsuka | 6:309af2a65bd6 | 39 | if(whoami() == 0xbd) { return true; } |
ohtsuka | 6:309af2a65bd6 | 40 | |
ohtsuka | 6:309af2a65bd6 | 41 | return false; |
ohtsuka | 6:309af2a65bd6 | 42 | } |
ohtsuka | 6:309af2a65bd6 | 43 | |
ohtsuka | 3:5a56dd5131bb | 44 | void LPS331_SPI::setResolution(char pressure_avg, char temp_avg) |
nyamfg | 0:3fd57444bc65 | 45 | { |
nyamfg | 0:3fd57444bc65 | 46 | _write(0x10, ((temp_avg & 0x07) << 4) | (pressure_avg & 0x0f)); |
nyamfg | 0:3fd57444bc65 | 47 | } |
nyamfg | 0:3fd57444bc65 | 48 | |
ohtsuka | 3:5a56dd5131bb | 49 | void LPS331_SPI::setActive(bool is_active) |
nyamfg | 0:3fd57444bc65 | 50 | { |
nyamfg | 0:3fd57444bc65 | 51 | if(is_active) { |
nyamfg | 0:3fd57444bc65 | 52 | _ctrlreg1 |= 0x80; |
nyamfg | 0:3fd57444bc65 | 53 | } else { |
nyamfg | 0:3fd57444bc65 | 54 | _ctrlreg1 &= ~0x80; |
nyamfg | 0:3fd57444bc65 | 55 | } |
nyamfg | 0:3fd57444bc65 | 56 | |
nyamfg | 0:3fd57444bc65 | 57 | _write(0x20, _ctrlreg1); |
nyamfg | 0:3fd57444bc65 | 58 | } |
nyamfg | 0:3fd57444bc65 | 59 | |
ohtsuka | 3:5a56dd5131bb | 60 | void LPS331_SPI::setDataRate(char datarate) |
nyamfg | 0:3fd57444bc65 | 61 | { |
nyamfg | 0:3fd57444bc65 | 62 | datarate &= 0x07; |
nyamfg | 0:3fd57444bc65 | 63 | |
nyamfg | 0:3fd57444bc65 | 64 | _ctrlreg1 &= ~(0x07 << 4); |
nyamfg | 0:3fd57444bc65 | 65 | _ctrlreg1 |= datarate << 4; |
nyamfg | 0:3fd57444bc65 | 66 | |
nyamfg | 0:3fd57444bc65 | 67 | _write(0x20, _ctrlreg1); |
nyamfg | 0:3fd57444bc65 | 68 | } |
nyamfg | 0:3fd57444bc65 | 69 | |
ohtsuka | 5:760a5e23dc62 | 70 | void LPS331_SPI::quickStart() |
ohtsuka | 5:760a5e23dc62 | 71 | { |
ohtsuka | 5:760a5e23dc62 | 72 | // initialize |
ohtsuka | 5:760a5e23dc62 | 73 | setResolution(LPS331_SPI_PRESSURE_AVG_1, LPS331_SPI_TEMP_AVG_1); // To prevent delays, not use average. |
ohtsuka | 5:760a5e23dc62 | 74 | setDataRate(LPS331_SPI_DATARATE_25HZ); |
ohtsuka | 5:760a5e23dc62 | 75 | setActive(true); |
ohtsuka | 5:760a5e23dc62 | 76 | } |
nyamfg | 0:3fd57444bc65 | 77 | |
ohtsuka | 3:5a56dd5131bb | 78 | float LPS331_SPI::getPressure() |
nyamfg | 0:3fd57444bc65 | 79 | { |
nyamfg | 1:b7d3d6e82049 | 80 | char data[3]; |
nyamfg | 0:3fd57444bc65 | 81 | float pressure = 0; |
nyamfg | 1:b7d3d6e82049 | 82 | |
nyamfg | 1:b7d3d6e82049 | 83 | _read_multibyte(0x28, data, 3); |
nyamfg | 1:b7d3d6e82049 | 84 | |
nyamfg | 1:b7d3d6e82049 | 85 | pressure = data[0]; |
nyamfg | 1:b7d3d6e82049 | 86 | pressure += data[1] << 8; |
nyamfg | 1:b7d3d6e82049 | 87 | pressure += data[2] << 16; |
nyamfg | 0:3fd57444bc65 | 88 | pressure /= 4096.0; |
nyamfg | 0:3fd57444bc65 | 89 | |
nyamfg | 0:3fd57444bc65 | 90 | return pressure; |
nyamfg | 0:3fd57444bc65 | 91 | } |
nyamfg | 0:3fd57444bc65 | 92 | |
ohtsuka | 3:5a56dd5131bb | 93 | float LPS331_SPI::getTemperature() |
nyamfg | 0:3fd57444bc65 | 94 | { |
nyamfg | 1:b7d3d6e82049 | 95 | char data[2]; |
nyamfg | 0:3fd57444bc65 | 96 | short temp = 0; |
nyamfg | 1:b7d3d6e82049 | 97 | |
nyamfg | 1:b7d3d6e82049 | 98 | _read_multibyte(0x2b, data, 2); |
nyamfg | 1:b7d3d6e82049 | 99 | |
nyamfg | 1:b7d3d6e82049 | 100 | temp = data[0]; |
nyamfg | 1:b7d3d6e82049 | 101 | temp |= data[1] << 8; |
nyamfg | 0:3fd57444bc65 | 102 | |
nyamfg | 0:3fd57444bc65 | 103 | return (float)(42.5 + temp / 480.0); |
nyamfg | 0:3fd57444bc65 | 104 | } |
nyamfg | 0:3fd57444bc65 | 105 | |
nyamfg | 0:3fd57444bc65 | 106 | |
ohtsuka | 3:5a56dd5131bb | 107 | void LPS331_SPI::_write(char subaddress, char data) |
nyamfg | 0:3fd57444bc65 | 108 | { |
ohtsuka | 4:af2153bce185 | 109 | _cs = 0; |
ohtsuka | 4:af2153bce185 | 110 | _spi.write(subaddress); |
ohtsuka | 4:af2153bce185 | 111 | _spi.write(data); |
ohtsuka | 4:af2153bce185 | 112 | _cs = 1; |
nyamfg | 0:3fd57444bc65 | 113 | } |
nyamfg | 0:3fd57444bc65 | 114 | |
ohtsuka | 3:5a56dd5131bb | 115 | char LPS331_SPI::_read(char subaddress) |
nyamfg | 0:3fd57444bc65 | 116 | { |
nyamfg | 0:3fd57444bc65 | 117 | char result = 0; |
nyamfg | 0:3fd57444bc65 | 118 | |
ohtsuka | 4:af2153bce185 | 119 | _cs = 0; |
ohtsuka | 4:af2153bce185 | 120 | _spi.write(subaddress | 0x80); |
ohtsuka | 4:af2153bce185 | 121 | result = _spi.write(0); |
ohtsuka | 4:af2153bce185 | 122 | _cs = 1; |
ohtsuka | 4:af2153bce185 | 123 | |
nyamfg | 0:3fd57444bc65 | 124 | return result; |
nyamfg | 0:3fd57444bc65 | 125 | } |
nyamfg | 0:3fd57444bc65 | 126 | |
ohtsuka | 3:5a56dd5131bb | 127 | void LPS331_SPI::_read_multibyte(char startsubaddress, char* data, char count) |
nyamfg | 1:b7d3d6e82049 | 128 | { |
ohtsuka | 4:af2153bce185 | 129 | _cs = 0; |
ohtsuka | 4:af2153bce185 | 130 | _spi.write(startsubaddress | 0x80 | 0x40); |
nyamfg | 1:b7d3d6e82049 | 131 | |
nyamfg | 1:b7d3d6e82049 | 132 | for(int i = 0; i < count; i++) { |
ohtsuka | 4:af2153bce185 | 133 | data[i] = _spi.write(0); |
nyamfg | 1:b7d3d6e82049 | 134 | } |
ohtsuka | 4:af2153bce185 | 135 | _cs = 1; |
ohtsuka | 4:af2153bce185 | 136 | |
nyamfg | 1:b7d3d6e82049 | 137 | } |