LIS3DH through spi

Dependents:   SimpleBLE-ObCP_ENSMM_V2019_Test_BLE SimpleBLE-ObCP_ENSMM_V2019_Test_BLE_S Roller_catcher_tests_fonctionnel SimpleBLE-ObCp_test-BLE_envoi ... more

Committer:
franzle
Date:
Wed Mar 15 17:41:22 2017 +0000
Revision:
0:ce2396b1c9a1
Modified librbary for using LIS3DH through spi with enable pin by sw

Who changed what in which revision?

UserRevisionLine numberNew contents of line
franzle 0:ce2396b1c9a1 1 /*
franzle 0:ce2396b1c9a1 2 * mbed library program
franzle 0:ce2396b1c9a1 3 * LIS3DH MEMS motion sensor: 3-axis "nano" accelerometer, made by STMicroelectronics
franzle 0:ce2396b1c9a1 4 * http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM89/SC444/PF250725
franzle 0:ce2396b1c9a1 5 *
franzle 0:ce2396b1c9a1 6 * Copyright (c) 2014,'15 Kenji Arai / JH1PJL
franzle 0:ce2396b1c9a1 7 * http://www.page.sannet.ne.jp/kenjia/index.html
franzle 0:ce2396b1c9a1 8 * http://mbed.org/users/kenjiArai/
franzle 0:ce2396b1c9a1 9 * Created: July 14th, 2014
franzle 0:ce2396b1c9a1 10 * Revised: December 12th, 2015
franzle 0:ce2396b1c9a1 11 *
franzle 0:ce2396b1c9a1 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
franzle 0:ce2396b1c9a1 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
franzle 0:ce2396b1c9a1 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
franzle 0:ce2396b1c9a1 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
franzle 0:ce2396b1c9a1 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
franzle 0:ce2396b1c9a1 17 */
franzle 0:ce2396b1c9a1 18
franzle 0:ce2396b1c9a1 19 #ifndef LIS3DH_H
franzle 0:ce2396b1c9a1 20 #define LIS3DH_H
franzle 0:ce2396b1c9a1 21
franzle 0:ce2396b1c9a1 22 #include "mbed.h"
franzle 0:ce2396b1c9a1 23
franzle 0:ce2396b1c9a1 24 // revision 6 have two bugs, (1) read_mg_data, (2) divided by 15 (16 is coorect value)
franzle 0:ce2396b1c9a1 25 #define OLD_REV 0 // KEEP 0!! (If you set 1, work as old revision)
franzle 0:ce2396b1c9a1 26
franzle 0:ce2396b1c9a1 27 // LIS3DH ID
franzle 0:ce2396b1c9a1 28 #define I_AM_LIS3DH 0x33
franzle 0:ce2396b1c9a1 29
franzle 0:ce2396b1c9a1 30 // Register's definition
franzle 0:ce2396b1c9a1 31 #define LIS3DH_STATUS_REG_AUX 0x07
franzle 0:ce2396b1c9a1 32 #define LIS3DH_OUT_ADC1_L 0x08
franzle 0:ce2396b1c9a1 33 #define LIS3DH_OUT_ADC1_H 0x09
franzle 0:ce2396b1c9a1 34 #define LIS3DH_OUT_ADC2_L 0x0a
franzle 0:ce2396b1c9a1 35 #define LIS3DH_OUT_ADC2_H 0x0b
franzle 0:ce2396b1c9a1 36 #define LIS3DH_OUT_ADC3_L 0x0c
franzle 0:ce2396b1c9a1 37 #define LIS3DH_OUT_ADC3_H 0x0d
franzle 0:ce2396b1c9a1 38 #define LIS3DH_INT_COUNTER_REG 0x0e
franzle 0:ce2396b1c9a1 39 #define LIS3DH_WHO_AM_I 0x0f
franzle 0:ce2396b1c9a1 40 #define LIS3DH_TEMP_CFG_REG 0x1f
franzle 0:ce2396b1c9a1 41 #define LIS3DH_CTRL_REG1 0x20
franzle 0:ce2396b1c9a1 42 #define LIS3DH_CTRL_REG2 0x21
franzle 0:ce2396b1c9a1 43 #define LIS3DH_CTRL_REG3 0x22
franzle 0:ce2396b1c9a1 44 #define LIS3DH_CTRL_REG4 0x23
franzle 0:ce2396b1c9a1 45 #define LIS3DH_CTRL_REG5 0x24
franzle 0:ce2396b1c9a1 46 #define LIS3DH_CTRL_REG6 0x25
franzle 0:ce2396b1c9a1 47 #define LIS3DH_REFERENCE 0x26
franzle 0:ce2396b1c9a1 48 #define LIS3DH_STATUS_REG 0x27
franzle 0:ce2396b1c9a1 49 #define LIS3DH_OUT_X_L 0x28
franzle 0:ce2396b1c9a1 50 #define LIS3DH_OUT_X_H 0x29
franzle 0:ce2396b1c9a1 51 #define LIS3DH_OUT_Y_L 0x2a
franzle 0:ce2396b1c9a1 52 #define LIS3DH_OUT_Y_H 0x2b
franzle 0:ce2396b1c9a1 53 #define LIS3DH_OUT_Z_L 0x2c
franzle 0:ce2396b1c9a1 54 #define LIS3DH_OUT_Z_H 0x2d
franzle 0:ce2396b1c9a1 55 #define LIS3DH_FIFO_CTRL_REG 0x2e
franzle 0:ce2396b1c9a1 56 #define LIS3DH_FIFO_SRC_REG 0x2f
franzle 0:ce2396b1c9a1 57 #define LIS3DH_INT1_CFG 0x30
franzle 0:ce2396b1c9a1 58 #define LIS3DH_INT1_SOURCE 0x31
franzle 0:ce2396b1c9a1 59 #define LIS3DH_INT1_THS 0x32
franzle 0:ce2396b1c9a1 60 #define LIS3DH_INT1_DURATION 0x33
franzle 0:ce2396b1c9a1 61 #define LIS3DH_CLICK_CFG 0x38
franzle 0:ce2396b1c9a1 62 #define LIS3DH_CLICK_SRC 0x39
franzle 0:ce2396b1c9a1 63 #define LIS3DH_CLICK_THS 0x3a
franzle 0:ce2396b1c9a1 64 #define LIS3DH_TIME_LIMIT 0x3b
franzle 0:ce2396b1c9a1 65 #define LIS3DH_TIME_LATENCY 0x3c
franzle 0:ce2396b1c9a1 66 #define LIS3DH_TIME_WINDOW 0x3d
franzle 0:ce2396b1c9a1 67
franzle 0:ce2396b1c9a1 68 // Output Data Rate (ODR)
franzle 0:ce2396b1c9a1 69 #define LIS3DH_DR_PWRDWN 0
franzle 0:ce2396b1c9a1 70 #define LIS3DH_DR_NR_LP_1HZ 1
franzle 0:ce2396b1c9a1 71 #define LIS3DH_DR_NR_LP_10HZ 2
franzle 0:ce2396b1c9a1 72 #define LIS3DH_DR_NR_LP_25HZ 3
franzle 0:ce2396b1c9a1 73 #define LIS3DH_DR_NR_LP_50HZ 4
franzle 0:ce2396b1c9a1 74 #define LIS3DH_DR_NR_LP_100HZ 5
franzle 0:ce2396b1c9a1 75 #define LIS3DH_DR_NR_LP_200HZ 6
franzle 0:ce2396b1c9a1 76 #define LIS3DH_DR_NR_LP_400HZ 7
franzle 0:ce2396b1c9a1 77 #define LIS3DH_DR_LP_1R6KHZ 8
franzle 0:ce2396b1c9a1 78 #define LIS3DH_DR_NR_1R25KHZ 9
franzle 0:ce2396b1c9a1 79
franzle 0:ce2396b1c9a1 80 // Bandwidth (Low pass)
franzle 0:ce2396b1c9a1 81 #define LIS3DH_BW_LOW 0
franzle 0:ce2396b1c9a1 82 #define LIS3DH_BW_M_LOW 1
franzle 0:ce2396b1c9a1 83 #define LIS3DH_BW_M_HI 2
franzle 0:ce2396b1c9a1 84 #define LIS3DH_BW_HI 3
franzle 0:ce2396b1c9a1 85
franzle 0:ce2396b1c9a1 86 // Low power mode enable/disable
franzle 0:ce2396b1c9a1 87 #define LIS3DH_LP_EN 0
franzle 0:ce2396b1c9a1 88 #define LIS3DH_LP_DIS 1
franzle 0:ce2396b1c9a1 89
franzle 0:ce2396b1c9a1 90 // Axis control
franzle 0:ce2396b1c9a1 91 #define LIS3DH_X_EN 1
franzle 0:ce2396b1c9a1 92 #define LIS3DH_X_DIS 0
franzle 0:ce2396b1c9a1 93 #define LIS3DH_Y_EN 1
franzle 0:ce2396b1c9a1 94 #define LIS3DH_Y_DIS 0
franzle 0:ce2396b1c9a1 95 #define LIS3DH_Z_EN 1
franzle 0:ce2396b1c9a1 96 #define LIS3DH_Z_DIS 0
franzle 0:ce2396b1c9a1 97
franzle 0:ce2396b1c9a1 98 // Full Scale
franzle 0:ce2396b1c9a1 99 #define LIS3DH_FS_2G 0
franzle 0:ce2396b1c9a1 100 #define LIS3DH_FS_4G 1
franzle 0:ce2396b1c9a1 101 #define LIS3DH_FS_8G 2
franzle 0:ce2396b1c9a1 102 #define LIS3DH_FS_16G 3
franzle 0:ce2396b1c9a1 103
franzle 0:ce2396b1c9a1 104 // definition for Nomalization
franzle 0:ce2396b1c9a1 105 #if OLD_REV
franzle 0:ce2396b1c9a1 106 #define LIS3DH_SENSITIVITY_2G (0.001F)
franzle 0:ce2396b1c9a1 107 #define LIS3DH_SENSITIVITY_4G (0.002F)
franzle 0:ce2396b1c9a1 108 #define LIS3DH_SENSITIVITY_8G (0.004F)
franzle 0:ce2396b1c9a1 109 #define LIS3DH_SENSITIVITY_16G (0.012F)
franzle 0:ce2396b1c9a1 110 #else
franzle 0:ce2396b1c9a1 111 #define LIS3DH_SENSITIVITY_2G 1
franzle 0:ce2396b1c9a1 112 #define LIS3DH_SENSITIVITY_4G 2
franzle 0:ce2396b1c9a1 113 #define LIS3DH_SENSITIVITY_8G 4
franzle 0:ce2396b1c9a1 114 #define LIS3DH_SENSITIVITY_16G 12
franzle 0:ce2396b1c9a1 115 #endif
franzle 0:ce2396b1c9a1 116
franzle 0:ce2396b1c9a1 117 //Gravity at Earth's surface in m/s/s
franzle 0:ce2396b1c9a1 118 #if OLD_REV
franzle 0:ce2396b1c9a1 119 #define GRAVITY (9.80665F)
franzle 0:ce2396b1c9a1 120 #else
franzle 0:ce2396b1c9a1 121 #define GRAVITY (9.80665F / 1000)
franzle 0:ce2396b1c9a1 122 #endif
franzle 0:ce2396b1c9a1 123
franzle 0:ce2396b1c9a1 124 class LIS3DH
franzle 0:ce2396b1c9a1 125 {
franzle 0:ce2396b1c9a1 126 public:
franzle 0:ce2396b1c9a1 127 /** Configure data pin
franzle 0:ce2396b1c9a1 128 * @param data MISO MOSI SCLK and CS pins
franzle 0:ce2396b1c9a1 129 * @param output data rate selection, power down mode, 1Hz to 5KHz
franzle 0:ce2396b1c9a1 130 * @param full scale selection, +/-2g to +/-16g
franzle 0:ce2396b1c9a1 131 */
franzle 0:ce2396b1c9a1 132 LIS3DH(PinName p_mosi, PinName p_miso, PinName p_sclk, PinName p_ssel, uint8_t data_rate, uint8_t fullscale);
franzle 0:ce2396b1c9a1 133
franzle 0:ce2396b1c9a1 134 /** Configure data pin
franzle 0:ce2396b1c9a1 135 * @param data MISO MOSI SCLK and CS pins
franzle 0:ce2396b1c9a1 136 * @default output data rate selection = 50Hz
franzle 0:ce2396b1c9a1 137 * @default full scale selection = +/-8g
franzle 0:ce2396b1c9a1 138 */
franzle 0:ce2396b1c9a1 139 LIS3DH (PinName p_mosi, PinName p_miso, PinName p_sclk, PinName p_ssel);
franzle 0:ce2396b1c9a1 140
franzle 0:ce2396b1c9a1 141 /** Read a float type data from acc
franzle 0:ce2396b1c9a1 142 * @param float type of three arry's address, e.g. float dt_usr[3];
franzle 0:ce2396b1c9a1 143 * @return acc motion data unit: m/s/s(m/s2)
franzle 0:ce2396b1c9a1 144 * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z
franzle 0:ce2396b1c9a1 145 */
franzle 0:ce2396b1c9a1 146 void read_data(float *dt_usr);
franzle 0:ce2396b1c9a1 147
franzle 0:ce2396b1c9a1 148 /** Read a float type data from acc
franzle 0:ce2396b1c9a1 149 * @param float type of three arry's address, e.g. float dt_usr[3];
franzle 0:ce2396b1c9a1 150 * @return acc motion data unit: mg
franzle 0:ce2396b1c9a1 151 * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z
franzle 0:ce2396b1c9a1 152 */
franzle 0:ce2396b1c9a1 153 void read_mg_data(float *dt_usr);
franzle 0:ce2396b1c9a1 154
franzle 0:ce2396b1c9a1 155 /** Read a acc ID number
franzle 0:ce2396b1c9a1 156 * @param none
franzle 0:ce2396b1c9a1 157 * @return if STM MEMS acc, it should be I_AM_ LIS3DH(0x33)
franzle 0:ce2396b1c9a1 158 */
franzle 0:ce2396b1c9a1 159 uint8_t read_id();
franzle 0:ce2396b1c9a1 160
franzle 0:ce2396b1c9a1 161 /** Read Data Ready flag
franzle 0:ce2396b1c9a1 162 * @param none
franzle 0:ce2396b1c9a1 163 * @return 1 = Ready
franzle 0:ce2396b1c9a1 164 */
franzle 0:ce2396b1c9a1 165 uint8_t data_ready();
franzle 0:ce2396b1c9a1 166
franzle 0:ce2396b1c9a1 167 /** Set I2C clock frequency
franzle 0:ce2396b1c9a1 168 * @param freq.
franzle 0:ce2396b1c9a1 169 * @return none
franzle 0:ce2396b1c9a1 170 */
franzle 0:ce2396b1c9a1 171 void set_frequency(int hz);
franzle 0:ce2396b1c9a1 172
franzle 0:ce2396b1c9a1 173 /** Read register (general purpose)
franzle 0:ce2396b1c9a1 174 * @param register's address
franzle 0:ce2396b1c9a1 175 * @return register data
franzle 0:ce2396b1c9a1 176 */
franzle 0:ce2396b1c9a1 177 uint8_t read_reg(uint8_t addr);
franzle 0:ce2396b1c9a1 178
franzle 0:ce2396b1c9a1 179 /** Write register (general purpose)
franzle 0:ce2396b1c9a1 180 * @param register's address
franzle 0:ce2396b1c9a1 181 * @param data
franzle 0:ce2396b1c9a1 182 * @return none
franzle 0:ce2396b1c9a1 183 */
franzle 0:ce2396b1c9a1 184 void write_reg(uint8_t addr, uint8_t data);
franzle 0:ce2396b1c9a1 185
franzle 0:ce2396b1c9a1 186 protected:
franzle 0:ce2396b1c9a1 187 void readRegs(uint8_t addr, uint8_t * data, int len);
franzle 0:ce2396b1c9a1 188 void writeRegs(uint8_t * data, int len);
franzle 0:ce2396b1c9a1 189 void write16(uint8_t addr, uint16_t data16);
franzle 0:ce2396b1c9a1 190 uint16_t read16(uint8_t addr);
franzle 0:ce2396b1c9a1 191 void init(uint8_t data_rate, uint8_t fullscale);
franzle 0:ce2396b1c9a1 192
franzle 0:ce2396b1c9a1 193 void read_reg_data(char *data);
franzle 0:ce2396b1c9a1 194 SPI _spi;
franzle 0:ce2396b1c9a1 195 DigitalOut _cs ;
franzle 0:ce2396b1c9a1 196
franzle 0:ce2396b1c9a1 197 private:
franzle 0:ce2396b1c9a1 198 #if OLD_REV
franzle 0:ce2396b1c9a1 199 float fs_factor; // full scale factor
franzle 0:ce2396b1c9a1 200 #else
franzle 0:ce2396b1c9a1 201 uint8_t fs_factor; // full scale factor
franzle 0:ce2396b1c9a1 202 #endif
franzle 0:ce2396b1c9a1 203 char dt[2]; // working buffer
franzle 0:ce2396b1c9a1 204 uint8_t acc_id; // acc ID
franzle 0:ce2396b1c9a1 205 uint8_t acc_ready; // acc is on I2C line = 1, not = 0
franzle 0:ce2396b1c9a1 206 };
franzle 0:ce2396b1c9a1 207
franzle 0:ce2396b1c9a1 208 #endif // LIS3DH_H
franzle 0:ce2396b1c9a1 209
franzle 0:ce2396b1c9a1 210
franzle 0:ce2396b1c9a1 211
franzle 0:ce2396b1c9a1 212