3-axis MEMS ultra low power accelerometer
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3
Diff: LIS2DW12Sensor.h
- Revision:
- 4:94c5d5546161
- Parent:
- 0:dff8803aace7
--- a/LIS2DW12Sensor.h Wed Nov 21 15:43:22 2018 +0000 +++ b/LIS2DW12Sensor.h Wed Jul 24 14:18:07 2019 +0000 @@ -66,40 +66,36 @@ /* Typedefs ------------------------------------------------------------------*/ -typedef struct -{ - unsigned int WakeUpStatus : 1; - unsigned int D6DOrientationStatus : 1; - unsigned int SleepStatus : 1; +typedef struct { + unsigned int WakeUpStatus : 1; + unsigned int D6DOrientationStatus : 1; + unsigned int SleepStatus : 1; } LIS2DW12_Event_Status_t; -typedef enum -{ - LIS2DW12_HIGH_PERFORMANCE_MODE, - LIS2DW12_LOW_POWER_MODE4, - LIS2DW12_LOW_POWER_MODE3, - LIS2DW12_LOW_POWER_MODE2, - LIS2DW12_LOW_POWER_MODE1 +typedef enum { + LIS2DW12_HIGH_PERFORMANCE_MODE, + LIS2DW12_LOW_POWER_MODE4, + LIS2DW12_LOW_POWER_MODE3, + LIS2DW12_LOW_POWER_MODE2, + LIS2DW12_LOW_POWER_MODE1 } LIS2DW12_Operating_Mode_t; -typedef enum -{ - LIS2DW12_LOW_NOISE_DISABLE, - LIS2DW12_LOW_NOISE_ENABLE +typedef enum { + LIS2DW12_LOW_NOISE_DISABLE, + LIS2DW12_LOW_NOISE_ENABLE } LIS2DW12_Low_Noise_t; /* Class Declaration ---------------------------------------------------------*/ - + /** * Abstract class of an LIS2DW12 Inertial Measurement Unit (IMU) 3 axes * sensor. */ -class LIS2DW12Sensor : public MotionSensor -{ - public: +class LIS2DW12Sensor : public MotionSensor { +public: enum SPI_type_t {SPI3W, SPI4W}; - LIS2DW12Sensor(DevI2C *i2c, uint8_t address=LIS2DW12_I2C_ADD_H, PinName int1_pin=NC, PinName int2_pin=NC); - LIS2DW12Sensor(SPI *spi, PinName cs_pin, PinName int1_pin=NC, PinName int2_pin=NC, SPI_type_t spi_type=SPI4W); + LIS2DW12Sensor(DevI2C *i2c, uint8_t address = LIS2DW12_I2C_ADD_H, PinName int1_pin = NC, PinName int2_pin = NC); + LIS2DW12Sensor(SPI *spi, PinName cs_pin, PinName int1_pin = NC, PinName int2_pin = NC, SPI_type_t spi_type = SPI4W); virtual int init(void *init); virtual int read_id(uint8_t *id); virtual int get_x_axes(int32_t *pData); @@ -109,7 +105,7 @@ virtual int set_x_odr(float odr); virtual int get_x_fs(float *fullScale); virtual int set_x_fs(float fullScale); - int set_x_odr_with_mode(float odr, LIS2DW12_Operating_Mode_t mode=LIS2DW12_HIGH_PERFORMANCE_MODE, LIS2DW12_Low_Noise_t noise=LIS2DW12_LOW_NOISE_DISABLE); + int set_x_odr_with_mode(float odr, LIS2DW12_Operating_Mode_t mode = LIS2DW12_HIGH_PERFORMANCE_MODE, LIS2DW12_Low_Noise_t noise = LIS2DW12_LOW_NOISE_DISABLE); int enable_x(void); int disable_x(void); int enable_wake_up_detection(void); @@ -133,7 +129,7 @@ int set_fifo_mode(uint8_t mode); int read_reg(uint8_t reg, uint8_t *data); int write_reg(uint8_t reg, uint8_t data); - + /** * @brief Attaching an interrupt handler to the INT1 interrupt. * @param fptr An interrupt handler. @@ -153,7 +149,7 @@ { _int1_irq.enable_irq(); } - + /** * @brief Disabling the INT1 interrupt handling. * @param None. @@ -163,7 +159,7 @@ { _int1_irq.disable_irq(); } - + /** * @brief Attaching an interrupt handler to the INT2 interrupt. * @param fptr An interrupt handler. @@ -183,7 +179,7 @@ { _int2_irq.enable_irq(); } - + /** * @brief Disabling the INT2 interrupt handling. * @param None. @@ -193,7 +189,7 @@ { _int2_irq.disable_irq(); } - + /** * @brief Utility function to read data. * @param pBuffer: pointer to data to be read. @@ -201,30 +197,32 @@ * @param NumByteToRead: number of bytes to be read. * @retval 0 if ok, an error code otherwise. */ - uint8_t io_read(uint8_t* pBuffer, uint8_t RegisterAddr, uint16_t NumByteToRead) - { + uint8_t io_read(uint8_t *pBuffer, uint8_t RegisterAddr, uint16_t NumByteToRead) + { if (_dev_spi) { - /* Write Reg Address */ + /* Write Reg Address */ _dev_spi->lock(); - _cs_pin = 0; - if (_spi_type == SPI4W) { + _cs_pin = 0; + if (_spi_type == SPI4W) { _dev_spi->write(RegisterAddr | 0x80); - for (int i=0; i<NumByteToRead; i++) { - *(pBuffer+i) = _dev_spi->write(0x00); + for (int i = 0; i < NumByteToRead; i++) { + *(pBuffer + i) = _dev_spi->write(0x00); } - } else if (_spi_type == SPI3W){ + } else if (_spi_type == SPI3W) { /* Write RD Reg Address with RD bit*/ - uint8_t TxByte = RegisterAddr | 0x80; + uint8_t TxByte = RegisterAddr | 0x80; _dev_spi->write((char *)&TxByte, 1, (char *)pBuffer, (int) NumByteToRead); - } + } _cs_pin = 1; - _dev_spi->unlock(); + _dev_spi->unlock(); return 0; - } - if (_dev_i2c) return (uint8_t) _dev_i2c->i2c_read(pBuffer, _address, RegisterAddr, NumByteToRead); + } + if (_dev_i2c) { + return (uint8_t) _dev_i2c->i2c_read(pBuffer, _address, RegisterAddr, NumByteToRead); + } return 1; } - + /** * @brief Utility function to write data. * @param pBuffer: pointer to data to be written. @@ -232,36 +230,38 @@ * @param NumByteToWrite: number of bytes to write. * @retval 0 if ok, an error code otherwise. */ - uint8_t io_write(uint8_t* pBuffer, uint8_t RegisterAddr, uint16_t NumByteToWrite) - { - if (_dev_spi) { + uint8_t io_write(uint8_t *pBuffer, uint8_t RegisterAddr, uint16_t NumByteToWrite) + { + if (_dev_spi) { _dev_spi->lock(); _cs_pin = 0; - _dev_spi->write(RegisterAddr); - _dev_spi->write((char *)pBuffer, (int) NumByteToWrite, NULL, 0); - _cs_pin = 1; + _dev_spi->write(RegisterAddr); + _dev_spi->write((char *)pBuffer, (int) NumByteToWrite, NULL, 0); + _cs_pin = 1; _dev_spi->unlock(); - return 0; - } - if (_dev_i2c) return (uint8_t) _dev_i2c->i2c_write(pBuffer, _address, RegisterAddr, NumByteToWrite); + return 0; + } + if (_dev_i2c) { + return (uint8_t) _dev_i2c->i2c_write(pBuffer, _address, RegisterAddr, NumByteToWrite); + } return 1; } - private: +private: int set_x_odr_when_enabled(float odr, LIS2DW12_Operating_Mode_t mode, LIS2DW12_Low_Noise_t noise); int set_x_odr_when_disabled(float odr, LIS2DW12_Operating_Mode_t mode, LIS2DW12_Low_Noise_t noise); /* Helper classes. */ DevI2C *_dev_i2c; SPI *_dev_spi; - + /* Configuration */ uint8_t _address; - DigitalOut _cs_pin; + DigitalOut _cs_pin; InterruptIn _int1_irq; InterruptIn _int2_irq; SPI_type_t _spi_type; - + uint8_t _x_is_enabled; float _x_last_odr; LIS2DW12_Operating_Mode_t _x_last_operating_mode; @@ -271,12 +271,12 @@ }; #ifdef __cplusplus - extern "C" { +extern "C" { #endif -int32_t LIS2DW12_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite ); -int32_t LIS2DW12_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead ); +int32_t LIS2DW12_io_write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite); +int32_t LIS2DW12_io_read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead); #ifdef __cplusplus - } +} #endif #endif