Driver for KX134-1211 Accelerometer

Dependents:   KX134-1211 Examples

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?

UserRevisionLine numberNew 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