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 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?

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