Driver for KX134-1211 Accelerometer
Dependents: KX134-1211 Examples
KX134.h
- Committer:
- Jasper Swallen
- Date:
- 2020-09-22
- Revision:
- 0:01d5616ba355
- Child:
- 1:c6e2a348da09
File content as of revision 0:01d5616ba355:
/** * @author Jasper Swallen * @filename KX134.h * * @section DESCRIPTION * * Software Driver for KX134-1211 accelerometer * * Datasheets: * http://kionixfs.kionix.com/en/document/AN101-Getting-Started.pdf * https://d10bqar0tuhard.cloudfront.net/en/document/KX134-1211-Technical-Reference-Manual-Rev-1.0.pdf * https://d10bqar0tuhard.cloudfront.net/en/document/TN027-Power-On-Procedure.pdf * https://d10bqar0tuhard.cloudfront.net/en/datasheet/KX134-1211-Specifications-Rev-1.0.pdf */ #ifndef KX134_H #define KX134_H #include "mbed.h" class KX134 { public: enum class Register : uint8_t { MAN_ID = 0x00, PART_ID = 0x01, XADP_L = 0x02, XADP_H = 0x03, YADP_L = 0x04, YADP_H = 0x05, ZADP_L = 0x06, ZADP_H = 0x07, XOUT_L = 0x08, XOUT_H = 0x09, YOUT_L = 0x0A, YOUT_H = 0x0B, ZOUT_L = 0x0C, ZOUT_H = 0x0D, COTR = 0x12, WHO_AM_I = 0x13, TSCP = 0x14, TSPP = 0x15, INS1 = 0x16, INS2 = 0x17, INS3 = 0x18, STATUS_REG = 0x19, INT_REL = 0x1A, CNTL1 = 0x1B, CNTL2 = 0x1C, CNTL3 = 0x1D, CNTL4 = 0x1E, CNTL5 = 0x1F, CNTL6 = 0x20, ODCNTL = 0x21, INC1 = 0x22, INC2 = 0x23, INC3 = 0x24, INC4 = 0x25, INC5 = 0x26, INC6 = 0x27, TILT_TIMER = 0x29, TDTRC = 0x2A, TDTC = 0x2B, TTH = 0x2C, TTL = 0x2D, FTD = 0x2E, STD = 0x2F, TLT = 0x30, TWS = 0x31, FFTH = 0x32, FFC = 0x33, FFCNTL = 0x34, TILT_ANGLE_LL = 0x37, TILT_ANGLE_HL = 0x38, HYST_SET = 0x39, LP_CNTL1 = 0x3A, LP_CNTL2 = 0x3B, WUFTH = 0x49, BTSWUFTH = 0x4A, BTSTH = 0x4B, BTSC = 0x4C, WUFC = 0x4D, SELF_TEST = 0x5D, BUF_CNTL1 = 0x5E, BUF_CNTL2 = 0x5F, BUF_STATUS_1 = 0x60, BUF_STATUS_2 = 0x61, BUF_CLEAR = 0x62, BUF_READ = 0x63, ADP_CNTL1 = 0x64, ADP_CNTL2 = 0x65, ADP_CNTL3 = 0x66, ADP_CNTL4 = 0x67, ADP_CNTL5 = 0x68, ADP_CNTL6 = 0x69, ADP_CNTL7 = 0x6A, ADP_CNTL8 = 0x6B, ADP_CNTL9 = 0x6C, ADP_CNTL10 = 0x6D, ADP_CNTL11 = 0x6E, ADP_CNTL12 = 0x6F, ADP_CNTL13 = 0x70, ADP_CNTL14 = 0x71, ADP_CNTL15 = 0x72, ADP_CNTL16 = 0x73, ADP_CNTL17 = 0x74, ADP_CNTL18 = 0x75, ADP_CNTL19 = 0x76, INTERNAL_0X7F = 0x7F }; enum class Range : uint8_t { RANGE_8G = 0b00, RANGE_16G = 0b01, RANGE_32G = 0b10, RANGE_64G = 0b11 }; KX134(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName int1, PinName int2, PinName rst); bool init(); /* Converts a LSB value to gravs * To convert to m/s^2, multiply by 1G (~9.8m/s^2) * * Note: * +-64g: 1LSB = 0.00195g * +-32g: 1LSB = 0.00098g * +-16g: 1LSB = 0.00049g * +-8g: 1LSB = 0.00024g */ float convertRawToGravs(int16_t lsbValue); /* Changes the value of output[3] as follows: * output[0] is X acceleration * output[1] is Y accel * output[2] is Z accel * * Results are in LSB format, to convert call convertRawToGravs() on each * output */ void getAccelerations(int16_t *output); /* Verifies the KX134-1211 unit is connected and functioning normally. * If it returns false, call reset() and check again. */ bool checkExistence(); /* To enable writing to settings registers, this function must be called. * After writing settings, register writing is automatically disabled, and * this function must be called again to enable it. */ void enableRegisterWriting(); /* Saves settings as currently set and disables register writing. * Useful for state changes */ void disableRegisterWriting(); // Set acceleration range (8, 16, 32, or 64 gs) void setAccelRange(Range range); // Set Output Data Rate Bitwise void setOutputDataRateBytes(uint8_t byteHz); // Set Output Data Rate from Hz void setOutputDataRateHz(uint32_t hz); private: // Mbed pin identities SPI _spi; PinName _int1, _int2; DigitalOut _cs; DigitalOut _rst; /* Reset function * Should be called on initial start (init()) and every software reset */ bool reset(); /* Deselect (push high) _cs */ void deselect(); /* Select (push low) _cs */ void select(); /* Read a given register a given number of bytes * * Note: the first byte read should return 0x0, so the data begins at * rx_buf[1] */ void readRegister(Register addr, char *rx_buf, int size = 2); /* Writes a given register a given number of bytes * * Note: the first byte read should return 0x0, so the data begins at * rx_buf[1] */ void writeRegister(Register addr, uint8_t *data, char *rx_buf, int size = 1); /* Writes a given register 1 byte (convenience function, calls * writeRegister()) * * Note: the first byte read should return 0x0, so the data begins at * rx_buf[1] */ void writeRegisterOneByte(Register addr, uint8_t data, char *buf); /* Reads a value from a low and high address and combines them to create a * signed (2s complement) 16-bit integer */ int16_t read16BitValue(Register lowAddr, Register highAddr); // Settings variables // CNTL1 vars bool resStatus; bool drdyeStatus; bool gsel1Status; bool gsel0Status; bool tdteStatus; bool tpeStatus; // ODCNTL vars bool iirBypass; bool lpro; bool fstup; bool osa3; bool osa2; bool osa1; bool osa0; bool registerWritingEnabled; }; #endif // KX134_H