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
LIS3DH.h@0:ce2396b1c9a1, 2017-03-15 (annotated)
- 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?
User | Revision | Line number | New 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 |