Driver for KX134-1211 Accelerometer
Dependents: KX134-1211 Examples
KX134.h@1:c6e2a348da09, 2020-10-25 (annotated)
- Committer:
- Jasper Swallen
- Date:
- Sun Oct 25 15:47:36 2020 -0400
- Revision:
- 1:c6e2a348da09
- Parent:
- 0:01d5616ba355
make synchronous & read all accel data at once
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jasper Swallen |
0:01d5616ba355 | 1 | /** |
Jasper Swallen |
0:01d5616ba355 | 2 | * @author Jasper Swallen |
Jasper Swallen |
0:01d5616ba355 | 3 | * @filename KX134.h |
Jasper Swallen |
0:01d5616ba355 | 4 | * |
Jasper Swallen |
0:01d5616ba355 | 5 | * @section DESCRIPTION |
Jasper Swallen |
0:01d5616ba355 | 6 | * |
Jasper Swallen |
0:01d5616ba355 | 7 | * Software Driver for KX134-1211 accelerometer |
Jasper Swallen |
0:01d5616ba355 | 8 | * |
Jasper Swallen |
0:01d5616ba355 | 9 | * Datasheets: |
Jasper Swallen |
0:01d5616ba355 | 10 | * http://kionixfs.kionix.com/en/document/AN101-Getting-Started.pdf |
Jasper Swallen |
0:01d5616ba355 | 11 | * https://d10bqar0tuhard.cloudfront.net/en/document/KX134-1211-Technical-Reference-Manual-Rev-1.0.pdf |
Jasper Swallen |
0:01d5616ba355 | 12 | * https://d10bqar0tuhard.cloudfront.net/en/document/TN027-Power-On-Procedure.pdf |
Jasper Swallen |
0:01d5616ba355 | 13 | * https://d10bqar0tuhard.cloudfront.net/en/datasheet/KX134-1211-Specifications-Rev-1.0.pdf |
Jasper Swallen |
0:01d5616ba355 | 14 | */ |
Jasper Swallen |
0:01d5616ba355 | 15 | |
Jasper Swallen |
0:01d5616ba355 | 16 | #ifndef KX134_H |
Jasper Swallen |
0:01d5616ba355 | 17 | #define KX134_H |
Jasper Swallen |
0:01d5616ba355 | 18 | |
Jasper Swallen |
0:01d5616ba355 | 19 | #include "mbed.h" |
Jasper Swallen |
0:01d5616ba355 | 20 | |
Jasper Swallen |
0:01d5616ba355 | 21 | class KX134 |
Jasper Swallen |
0:01d5616ba355 | 22 | { |
Jasper Swallen |
0:01d5616ba355 | 23 | public: |
Jasper Swallen |
0:01d5616ba355 | 24 | enum class Register : uint8_t |
Jasper Swallen |
0:01d5616ba355 | 25 | { |
Jasper Swallen |
0:01d5616ba355 | 26 | MAN_ID = 0x00, |
Jasper Swallen |
0:01d5616ba355 | 27 | PART_ID = 0x01, |
Jasper Swallen |
0:01d5616ba355 | 28 | XADP_L = 0x02, |
Jasper Swallen |
0:01d5616ba355 | 29 | XADP_H = 0x03, |
Jasper Swallen |
0:01d5616ba355 | 30 | YADP_L = 0x04, |
Jasper Swallen |
0:01d5616ba355 | 31 | YADP_H = 0x05, |
Jasper Swallen |
0:01d5616ba355 | 32 | ZADP_L = 0x06, |
Jasper Swallen |
0:01d5616ba355 | 33 | ZADP_H = 0x07, |
Jasper Swallen |
0:01d5616ba355 | 34 | XOUT_L = 0x08, |
Jasper Swallen |
0:01d5616ba355 | 35 | XOUT_H = 0x09, |
Jasper Swallen |
0:01d5616ba355 | 36 | YOUT_L = 0x0A, |
Jasper Swallen |
0:01d5616ba355 | 37 | YOUT_H = 0x0B, |
Jasper Swallen |
0:01d5616ba355 | 38 | ZOUT_L = 0x0C, |
Jasper Swallen |
0:01d5616ba355 | 39 | ZOUT_H = 0x0D, |
Jasper Swallen |
0:01d5616ba355 | 40 | COTR = 0x12, |
Jasper Swallen |
0:01d5616ba355 | 41 | WHO_AM_I = 0x13, |
Jasper Swallen |
0:01d5616ba355 | 42 | TSCP = 0x14, |
Jasper Swallen |
0:01d5616ba355 | 43 | TSPP = 0x15, |
Jasper Swallen |
0:01d5616ba355 | 44 | INS1 = 0x16, |
Jasper Swallen |
0:01d5616ba355 | 45 | INS2 = 0x17, |
Jasper Swallen |
0:01d5616ba355 | 46 | INS3 = 0x18, |
Jasper Swallen |
0:01d5616ba355 | 47 | STATUS_REG = 0x19, |
Jasper Swallen |
0:01d5616ba355 | 48 | INT_REL = 0x1A, |
Jasper Swallen |
0:01d5616ba355 | 49 | CNTL1 = 0x1B, |
Jasper Swallen |
0:01d5616ba355 | 50 | CNTL2 = 0x1C, |
Jasper Swallen |
0:01d5616ba355 | 51 | CNTL3 = 0x1D, |
Jasper Swallen |
0:01d5616ba355 | 52 | CNTL4 = 0x1E, |
Jasper Swallen |
0:01d5616ba355 | 53 | CNTL5 = 0x1F, |
Jasper Swallen |
0:01d5616ba355 | 54 | CNTL6 = 0x20, |
Jasper Swallen |
0:01d5616ba355 | 55 | ODCNTL = 0x21, |
Jasper Swallen |
0:01d5616ba355 | 56 | INC1 = 0x22, |
Jasper Swallen |
0:01d5616ba355 | 57 | INC2 = 0x23, |
Jasper Swallen |
0:01d5616ba355 | 58 | INC3 = 0x24, |
Jasper Swallen |
0:01d5616ba355 | 59 | INC4 = 0x25, |
Jasper Swallen |
0:01d5616ba355 | 60 | INC5 = 0x26, |
Jasper Swallen |
0:01d5616ba355 | 61 | INC6 = 0x27, |
Jasper Swallen |
0:01d5616ba355 | 62 | TILT_TIMER = 0x29, |
Jasper Swallen |
0:01d5616ba355 | 63 | TDTRC = 0x2A, |
Jasper Swallen |
0:01d5616ba355 | 64 | TDTC = 0x2B, |
Jasper Swallen |
0:01d5616ba355 | 65 | TTH = 0x2C, |
Jasper Swallen |
0:01d5616ba355 | 66 | TTL = 0x2D, |
Jasper Swallen |
0:01d5616ba355 | 67 | FTD = 0x2E, |
Jasper Swallen |
0:01d5616ba355 | 68 | STD = 0x2F, |
Jasper Swallen |
0:01d5616ba355 | 69 | TLT = 0x30, |
Jasper Swallen |
0:01d5616ba355 | 70 | TWS = 0x31, |
Jasper Swallen |
0:01d5616ba355 | 71 | FFTH = 0x32, |
Jasper Swallen |
0:01d5616ba355 | 72 | FFC = 0x33, |
Jasper Swallen |
0:01d5616ba355 | 73 | FFCNTL = 0x34, |
Jasper Swallen |
0:01d5616ba355 | 74 | TILT_ANGLE_LL = 0x37, |
Jasper Swallen |
0:01d5616ba355 | 75 | TILT_ANGLE_HL = 0x38, |
Jasper Swallen |
0:01d5616ba355 | 76 | HYST_SET = 0x39, |
Jasper Swallen |
0:01d5616ba355 | 77 | LP_CNTL1 = 0x3A, |
Jasper Swallen |
0:01d5616ba355 | 78 | LP_CNTL2 = 0x3B, |
Jasper Swallen |
0:01d5616ba355 | 79 | WUFTH = 0x49, |
Jasper Swallen |
0:01d5616ba355 | 80 | BTSWUFTH = 0x4A, |
Jasper Swallen |
0:01d5616ba355 | 81 | BTSTH = 0x4B, |
Jasper Swallen |
0:01d5616ba355 | 82 | BTSC = 0x4C, |
Jasper Swallen |
0:01d5616ba355 | 83 | WUFC = 0x4D, |
Jasper Swallen |
0:01d5616ba355 | 84 | SELF_TEST = 0x5D, |
Jasper Swallen |
0:01d5616ba355 | 85 | BUF_CNTL1 = 0x5E, |
Jasper Swallen |
0:01d5616ba355 | 86 | BUF_CNTL2 = 0x5F, |
Jasper Swallen |
0:01d5616ba355 | 87 | BUF_STATUS_1 = 0x60, |
Jasper Swallen |
0:01d5616ba355 | 88 | BUF_STATUS_2 = 0x61, |
Jasper Swallen |
0:01d5616ba355 | 89 | BUF_CLEAR = 0x62, |
Jasper Swallen |
0:01d5616ba355 | 90 | BUF_READ = 0x63, |
Jasper Swallen |
0:01d5616ba355 | 91 | ADP_CNTL1 = 0x64, |
Jasper Swallen |
0:01d5616ba355 | 92 | ADP_CNTL2 = 0x65, |
Jasper Swallen |
0:01d5616ba355 | 93 | ADP_CNTL3 = 0x66, |
Jasper Swallen |
0:01d5616ba355 | 94 | ADP_CNTL4 = 0x67, |
Jasper Swallen |
0:01d5616ba355 | 95 | ADP_CNTL5 = 0x68, |
Jasper Swallen |
0:01d5616ba355 | 96 | ADP_CNTL6 = 0x69, |
Jasper Swallen |
0:01d5616ba355 | 97 | ADP_CNTL7 = 0x6A, |
Jasper Swallen |
0:01d5616ba355 | 98 | ADP_CNTL8 = 0x6B, |
Jasper Swallen |
0:01d5616ba355 | 99 | ADP_CNTL9 = 0x6C, |
Jasper Swallen |
0:01d5616ba355 | 100 | ADP_CNTL10 = 0x6D, |
Jasper Swallen |
0:01d5616ba355 | 101 | ADP_CNTL11 = 0x6E, |
Jasper Swallen |
0:01d5616ba355 | 102 | ADP_CNTL12 = 0x6F, |
Jasper Swallen |
0:01d5616ba355 | 103 | ADP_CNTL13 = 0x70, |
Jasper Swallen |
0:01d5616ba355 | 104 | ADP_CNTL14 = 0x71, |
Jasper Swallen |
0:01d5616ba355 | 105 | ADP_CNTL15 = 0x72, |
Jasper Swallen |
0:01d5616ba355 | 106 | ADP_CNTL16 = 0x73, |
Jasper Swallen |
0:01d5616ba355 | 107 | ADP_CNTL17 = 0x74, |
Jasper Swallen |
0:01d5616ba355 | 108 | ADP_CNTL18 = 0x75, |
Jasper Swallen |
0:01d5616ba355 | 109 | ADP_CNTL19 = 0x76, |
Jasper Swallen |
0:01d5616ba355 | 110 | INTERNAL_0X7F = 0x7F |
Jasper Swallen |
0:01d5616ba355 | 111 | }; |
Jasper Swallen |
0:01d5616ba355 | 112 | |
Jasper Swallen |
0:01d5616ba355 | 113 | enum class Range : uint8_t |
Jasper Swallen |
0:01d5616ba355 | 114 | { |
Jasper Swallen |
0:01d5616ba355 | 115 | RANGE_8G = 0b00, |
Jasper Swallen |
0:01d5616ba355 | 116 | RANGE_16G = 0b01, |
Jasper Swallen |
0:01d5616ba355 | 117 | RANGE_32G = 0b10, |
Jasper Swallen |
0:01d5616ba355 | 118 | RANGE_64G = 0b11 |
Jasper Swallen |
0:01d5616ba355 | 119 | }; |
Jasper Swallen |
0:01d5616ba355 | 120 | |
Jasper Swallen |
0:01d5616ba355 | 121 | KX134(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName int1, |
Jasper Swallen |
0:01d5616ba355 | 122 | PinName int2, PinName rst); |
Jasper Swallen |
0:01d5616ba355 | 123 | |
Jasper Swallen |
0:01d5616ba355 | 124 | bool init(); |
Jasper Swallen |
0:01d5616ba355 | 125 | |
Jasper Swallen |
0:01d5616ba355 | 126 | /* Converts a LSB value to gravs |
Jasper Swallen |
0:01d5616ba355 | 127 | * To convert to m/s^2, multiply by 1G (~9.8m/s^2) |
Jasper Swallen |
0:01d5616ba355 | 128 | * |
Jasper Swallen |
0:01d5616ba355 | 129 | * Note: |
Jasper Swallen |
0:01d5616ba355 | 130 | * +-64g: 1LSB = 0.00195g |
Jasper Swallen |
0:01d5616ba355 | 131 | * +-32g: 1LSB = 0.00098g |
Jasper Swallen |
0:01d5616ba355 | 132 | * +-16g: 1LSB = 0.00049g |
Jasper Swallen |
0:01d5616ba355 | 133 | * +-8g: 1LSB = 0.00024g |
Jasper Swallen |
0:01d5616ba355 | 134 | */ |
Jasper Swallen |
0:01d5616ba355 | 135 | float convertRawToGravs(int16_t lsbValue); |
Jasper Swallen |
0:01d5616ba355 | 136 | |
Jasper Swallen |
0:01d5616ba355 | 137 | /* Changes the value of output[3] as follows: |
Jasper Swallen |
0:01d5616ba355 | 138 | * output[0] is X acceleration |
Jasper Swallen |
0:01d5616ba355 | 139 | * output[1] is Y accel |
Jasper Swallen |
0:01d5616ba355 | 140 | * output[2] is Z accel |
Jasper Swallen |
0:01d5616ba355 | 141 | * |
Jasper Swallen |
0:01d5616ba355 | 142 | * Results are in LSB format, to convert call convertRawToGravs() on each |
Jasper Swallen |
0:01d5616ba355 | 143 | * output |
Jasper Swallen |
0:01d5616ba355 | 144 | */ |
Jasper Swallen |
0:01d5616ba355 | 145 | void getAccelerations(int16_t *output); |
Jasper Swallen |
0:01d5616ba355 | 146 | |
Jasper Swallen |
0:01d5616ba355 | 147 | /* Verifies the KX134-1211 unit is connected and functioning normally. |
Jasper Swallen |
0:01d5616ba355 | 148 | * If it returns false, call reset() and check again. |
Jasper Swallen |
0:01d5616ba355 | 149 | */ |
Jasper Swallen |
0:01d5616ba355 | 150 | bool checkExistence(); |
Jasper Swallen |
0:01d5616ba355 | 151 | |
Jasper Swallen |
0:01d5616ba355 | 152 | /* To enable writing to settings registers, this function must be called. |
Jasper Swallen |
0:01d5616ba355 | 153 | * After writing settings, register writing is automatically disabled, and |
Jasper Swallen |
0:01d5616ba355 | 154 | * this function must be called again to enable it. |
Jasper Swallen |
0:01d5616ba355 | 155 | */ |
Jasper Swallen |
0:01d5616ba355 | 156 | void enableRegisterWriting(); |
Jasper Swallen |
0:01d5616ba355 | 157 | |
Jasper Swallen |
0:01d5616ba355 | 158 | /* Saves settings as currently set and disables register writing. |
Jasper Swallen |
0:01d5616ba355 | 159 | * Useful for state changes |
Jasper Swallen |
0:01d5616ba355 | 160 | */ |
Jasper Swallen |
0:01d5616ba355 | 161 | void disableRegisterWriting(); |
Jasper Swallen |
0:01d5616ba355 | 162 | |
Jasper Swallen |
0:01d5616ba355 | 163 | // Set acceleration range (8, 16, 32, or 64 gs) |
Jasper Swallen |
0:01d5616ba355 | 164 | void setAccelRange(Range range); |
Jasper Swallen |
0:01d5616ba355 | 165 | |
Jasper Swallen |
0:01d5616ba355 | 166 | // Set Output Data Rate Bitwise |
Jasper Swallen |
0:01d5616ba355 | 167 | void setOutputDataRateBytes(uint8_t byteHz); |
Jasper Swallen |
0:01d5616ba355 | 168 | |
Jasper Swallen |
0:01d5616ba355 | 169 | // Set Output Data Rate from Hz |
Jasper Swallen |
0:01d5616ba355 | 170 | void setOutputDataRateHz(uint32_t hz); |
Jasper Swallen |
0:01d5616ba355 | 171 | |
Jasper Swallen |
1:c6e2a348da09 | 172 | bool dataReady(); |
Jasper Swallen |
1:c6e2a348da09 | 173 | |
Jasper Swallen |
0:01d5616ba355 | 174 | private: |
Jasper Swallen |
0:01d5616ba355 | 175 | // Mbed pin identities |
Jasper Swallen |
0:01d5616ba355 | 176 | SPI _spi; |
Jasper Swallen |
0:01d5616ba355 | 177 | PinName _int1, _int2; |
Jasper Swallen |
0:01d5616ba355 | 178 | DigitalOut _cs; |
Jasper Swallen |
0:01d5616ba355 | 179 | DigitalOut _rst; |
Jasper Swallen |
0:01d5616ba355 | 180 | |
Jasper Swallen |
0:01d5616ba355 | 181 | /* Reset function |
Jasper Swallen |
0:01d5616ba355 | 182 | * Should be called on initial start (init()) and every software reset |
Jasper Swallen |
0:01d5616ba355 | 183 | */ |
Jasper Swallen |
0:01d5616ba355 | 184 | bool reset(); |
Jasper Swallen |
0:01d5616ba355 | 185 | |
Jasper Swallen |
0:01d5616ba355 | 186 | /* Deselect (push high) _cs |
Jasper Swallen |
0:01d5616ba355 | 187 | */ |
Jasper Swallen |
0:01d5616ba355 | 188 | void deselect(); |
Jasper Swallen |
0:01d5616ba355 | 189 | |
Jasper Swallen |
0:01d5616ba355 | 190 | /* Select (push low) _cs |
Jasper Swallen |
0:01d5616ba355 | 191 | */ |
Jasper Swallen |
0:01d5616ba355 | 192 | void select(); |
Jasper Swallen |
0:01d5616ba355 | 193 | |
Jasper Swallen |
0:01d5616ba355 | 194 | /* Read a given register a given number of bytes |
Jasper Swallen |
0:01d5616ba355 | 195 | * |
Jasper Swallen |
0:01d5616ba355 | 196 | * Note: the first byte read should return 0x0, so the data begins at |
Jasper Swallen |
0:01d5616ba355 | 197 | * rx_buf[1] |
Jasper Swallen |
0:01d5616ba355 | 198 | */ |
Jasper Swallen |
1:c6e2a348da09 | 199 | void readRegister(Register addr, uint8_t *rx_buf, int size = 2); |
Jasper Swallen |
0:01d5616ba355 | 200 | |
Jasper Swallen |
0:01d5616ba355 | 201 | /* Writes a given register a given number of bytes |
Jasper Swallen |
0:01d5616ba355 | 202 | * |
Jasper Swallen |
0:01d5616ba355 | 203 | * Note: the first byte read should return 0x0, so the data begins at |
Jasper Swallen |
0:01d5616ba355 | 204 | * rx_buf[1] |
Jasper Swallen |
0:01d5616ba355 | 205 | */ |
Jasper Swallen |
1:c6e2a348da09 | 206 | void writeRegister(Register addr, uint8_t *data, uint8_t *rx_buf, |
Jasper Swallen |
0:01d5616ba355 | 207 | int size = 1); |
Jasper Swallen |
0:01d5616ba355 | 208 | |
Jasper Swallen |
0:01d5616ba355 | 209 | /* Writes a given register 1 byte (convenience function, calls |
Jasper Swallen |
0:01d5616ba355 | 210 | * writeRegister()) |
Jasper Swallen |
0:01d5616ba355 | 211 | * |
Jasper Swallen |
0:01d5616ba355 | 212 | * Note: the first byte read should return 0x0, so the data begins at |
Jasper Swallen |
0:01d5616ba355 | 213 | * rx_buf[1] |
Jasper Swallen |
0:01d5616ba355 | 214 | */ |
Jasper Swallen |
1:c6e2a348da09 | 215 | void writeRegisterOneByte(Register addr, uint8_t data, uint8_t *buf); |
Jasper Swallen |
0:01d5616ba355 | 216 | |
Jasper Swallen |
0:01d5616ba355 | 217 | /* Reads a value from a low and high address and combines them to create a |
Jasper Swallen |
0:01d5616ba355 | 218 | * signed (2s complement) 16-bit integer |
Jasper Swallen |
0:01d5616ba355 | 219 | */ |
Jasper Swallen |
0:01d5616ba355 | 220 | int16_t read16BitValue(Register lowAddr, Register highAddr); |
Jasper Swallen |
0:01d5616ba355 | 221 | |
Jasper Swallen |
1:c6e2a348da09 | 222 | /* Converts 2 8-bit unsigned integers to a single signed 16-bit (2s |
Jasper Swallen |
1:c6e2a348da09 | 223 | * complement) integer |
Jasper Swallen |
1:c6e2a348da09 | 224 | */ |
Jasper Swallen |
1:c6e2a348da09 | 225 | int16_t convertTo16BitValue(uint8_t low, uint8_t high); |
Jasper Swallen |
1:c6e2a348da09 | 226 | |
Jasper Swallen |
0:01d5616ba355 | 227 | // Settings variables |
Jasper Swallen |
0:01d5616ba355 | 228 | |
Jasper Swallen |
0:01d5616ba355 | 229 | // CNTL1 vars |
Jasper Swallen |
0:01d5616ba355 | 230 | bool resStatus; |
Jasper Swallen |
0:01d5616ba355 | 231 | bool drdyeStatus; |
Jasper Swallen |
0:01d5616ba355 | 232 | bool gsel1Status; |
Jasper Swallen |
0:01d5616ba355 | 233 | bool gsel0Status; |
Jasper Swallen |
0:01d5616ba355 | 234 | bool tdteStatus; |
Jasper Swallen |
0:01d5616ba355 | 235 | bool tpeStatus; |
Jasper Swallen |
0:01d5616ba355 | 236 | |
Jasper Swallen |
0:01d5616ba355 | 237 | // ODCNTL vars |
Jasper Swallen |
0:01d5616ba355 | 238 | bool iirBypass; |
Jasper Swallen |
0:01d5616ba355 | 239 | bool lpro; |
Jasper Swallen |
0:01d5616ba355 | 240 | bool fstup; |
Jasper Swallen |
0:01d5616ba355 | 241 | bool osa3; |
Jasper Swallen |
0:01d5616ba355 | 242 | bool osa2; |
Jasper Swallen |
0:01d5616ba355 | 243 | bool osa1; |
Jasper Swallen |
0:01d5616ba355 | 244 | bool osa0; |
Jasper Swallen |
0:01d5616ba355 | 245 | |
Jasper Swallen |
0:01d5616ba355 | 246 | bool registerWritingEnabled; |
Jasper Swallen |
0:01d5616ba355 | 247 | }; |
Jasper Swallen |
0:01d5616ba355 | 248 | |
Jasper Swallen |
1:c6e2a348da09 | 249 | #endif // KX134_H |