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 NYA Manufacturing

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?

UserRevisionLine numberNew 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 }