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
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 }
Generated on Fri Jul 22 2022 21:26:34 by 1.7.2