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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LPS331_SPI.cpp Source File

LPS331_SPI.cpp

00001 /*
00002  *  I2C/SPI digital pressure sensor "LPS331AP" "LPS25H" library for SPI mode.
00003  *
00004  *  Copyright(c) -2016 Toru OHTSUKA, 
00005  *  Copyright(c) -2013 unos@NYAMFG, 
00006  *  Released under the MIT License: http://mbed.org/license/mit
00007  *
00008  *  revision: see LPS331_SPI.h.
00009  */
00010 
00011 #include "LPS331_SPI.h"
00012 
00013 LPS331_SPI::LPS331_SPI(PinName mosi, PinName miso, PinName sclk, PinName cs_pin):_spi(mosi, miso, sclk), _cs(cs_pin)
00014 {
00015     _spi.format(8,0);
00016     _spi.frequency(1000000);
00017 
00018     _ctrlreg1 = 0x20;
00019 }
00020 
00021 LPS331_SPI::~LPS331_SPI()
00022 {
00023 }
00024 
00025 char LPS331_SPI::whoami()
00026 {
00027     return _read(0x0f);
00028 }
00029 
00030 bool LPS331_SPI::isLPS331()
00031 {
00032     if(whoami() == 0xbb) { return true; }
00033     
00034     return false;
00035 }
00036 
00037 bool LPS331_SPI::isLPS25H()
00038 {
00039     if(whoami() == 0xbd) { return true; }
00040     
00041     return false;
00042 }
00043 
00044 void LPS331_SPI::setResolution(char pressure_avg, char temp_avg)
00045 {
00046     _write(0x10, ((temp_avg & 0x07) << 4) | (pressure_avg & 0x0f));
00047 }
00048 
00049 void LPS331_SPI::setActive(bool is_active)
00050 {
00051     if(is_active) {
00052         _ctrlreg1 |= 0x80;
00053     } else {
00054         _ctrlreg1 &= ~0x80;
00055     }
00056 
00057     _write(0x20, _ctrlreg1);
00058 }
00059 
00060 void LPS331_SPI::setDataRate(char datarate)
00061 {
00062     datarate &= 0x07;
00063     
00064     _ctrlreg1 &= ~(0x07 << 4);
00065     _ctrlreg1 |= datarate << 4;
00066     
00067     _write(0x20, _ctrlreg1);
00068 }
00069 
00070 void LPS331_SPI::quickStart()
00071 {
00072     // initialize
00073     setResolution(LPS331_SPI_PRESSURE_AVG_1, LPS331_SPI_TEMP_AVG_1); // To prevent delays, not use average.
00074     setDataRate(LPS331_SPI_DATARATE_25HZ);
00075     setActive(true);
00076 }
00077     
00078 float LPS331_SPI::getPressure()
00079 {
00080     char data[3];
00081     float pressure = 0;
00082 
00083     _read_multibyte(0x28, data, 3);
00084     
00085     pressure  = data[0];
00086     pressure += data[1] << 8;
00087     pressure += data[2] << 16;
00088     pressure /= 4096.0;
00089     
00090     return pressure;
00091 }
00092 
00093 float LPS331_SPI::getTemperature()
00094 {
00095     char data[2];
00096     short temp = 0;
00097     
00098     _read_multibyte(0x2b, data, 2);    
00099     
00100     temp  = data[0];
00101     temp |= data[1] << 8;
00102     
00103     return (float)(42.5 + temp / 480.0);
00104 }
00105 
00106 
00107 void LPS331_SPI::_write(char subaddress, char data)
00108 {
00109     _cs = 0;
00110     _spi.write(subaddress);
00111     _spi.write(data);
00112     _cs = 1;
00113 }
00114 
00115 char LPS331_SPI::_read(char subaddress)
00116 {
00117     char result = 0;
00118     
00119     _cs = 0;
00120     _spi.write(subaddress | 0x80);
00121     result = _spi.write(0);
00122     _cs = 1;
00123 
00124     return result;
00125 }
00126 
00127 void LPS331_SPI::_read_multibyte(char startsubaddress, char* data, char count)
00128 {
00129     _cs = 0;
00130     _spi.write(startsubaddress | 0x80 | 0x40);
00131 
00132     for(int i = 0; i < count; i++) {
00133         data[i] = _spi.write(0);
00134     }
00135     _cs = 1;
00136 
00137 }