Workshop example

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Committer:
JimCarver
Date:
Tue May 21 21:16:24 2019 +0000
Revision:
35:42b3fba640b1
Parent:
18:a15bfe7aaebd
Simple version for workshop

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 18:a15bfe7aaebd 1 /**
screamer 18:a15bfe7aaebd 2 ******************************************************************************
screamer 18:a15bfe7aaebd 3 * @file lis3mdl_class.h
screamer 18:a15bfe7aaebd 4 * @author AST / EST
screamer 18:a15bfe7aaebd 5 * @version V0.0.1
screamer 18:a15bfe7aaebd 6 * @date 14-April-2015
screamer 18:a15bfe7aaebd 7 * @brief Header file for component LIS3MDL
screamer 18:a15bfe7aaebd 8 ******************************************************************************
screamer 18:a15bfe7aaebd 9 * @attention
screamer 18:a15bfe7aaebd 10 *
screamer 18:a15bfe7aaebd 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
screamer 18:a15bfe7aaebd 12 *
screamer 18:a15bfe7aaebd 13 * Redistribution and use in source and binary forms, with or without modification,
screamer 18:a15bfe7aaebd 14 * are permitted provided that the following conditions are met:
screamer 18:a15bfe7aaebd 15 * 1. Redistributions of source code must retain the above copyright notice,
screamer 18:a15bfe7aaebd 16 * this list of conditions and the following disclaimer.
screamer 18:a15bfe7aaebd 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
screamer 18:a15bfe7aaebd 18 * this list of conditions and the following disclaimer in the documentation
screamer 18:a15bfe7aaebd 19 * and/or other materials provided with the distribution.
screamer 18:a15bfe7aaebd 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
screamer 18:a15bfe7aaebd 21 * may be used to endorse or promote products derived from this software
screamer 18:a15bfe7aaebd 22 * without specific prior written permission.
screamer 18:a15bfe7aaebd 23 *
screamer 18:a15bfe7aaebd 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
screamer 18:a15bfe7aaebd 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
screamer 18:a15bfe7aaebd 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
screamer 18:a15bfe7aaebd 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
screamer 18:a15bfe7aaebd 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
screamer 18:a15bfe7aaebd 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
screamer 18:a15bfe7aaebd 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
screamer 18:a15bfe7aaebd 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
screamer 18:a15bfe7aaebd 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
screamer 18:a15bfe7aaebd 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
screamer 18:a15bfe7aaebd 34 *
screamer 18:a15bfe7aaebd 35 ******************************************************************************
screamer 18:a15bfe7aaebd 36 */
screamer 18:a15bfe7aaebd 37
screamer 18:a15bfe7aaebd 38 #ifndef __LIS3MDL_CLASS_H
screamer 18:a15bfe7aaebd 39 #define __LIS3MDL_CLASS_H
screamer 18:a15bfe7aaebd 40
screamer 18:a15bfe7aaebd 41 /* Includes ------------------------------------------------------------------*/
screamer 18:a15bfe7aaebd 42 #include "mbed.h"
screamer 18:a15bfe7aaebd 43 #include "DevI2C.h"
screamer 18:a15bfe7aaebd 44 #include "lis3mdl.h"
screamer 18:a15bfe7aaebd 45 #include "MagneticSensor.h"
screamer 18:a15bfe7aaebd 46 #include <assert.h>
screamer 18:a15bfe7aaebd 47
screamer 18:a15bfe7aaebd 48
screamer 18:a15bfe7aaebd 49 /* Classes -------------------------------------------------------------------*/
screamer 18:a15bfe7aaebd 50 /** Class representing a LIS3MDL sensor component
screamer 18:a15bfe7aaebd 51 */
screamer 18:a15bfe7aaebd 52 class LIS3MDL : public MagneticSensor {
screamer 18:a15bfe7aaebd 53 public:
screamer 18:a15bfe7aaebd 54 enum SPI_type_t {SPI3W, SPI4W};
screamer 18:a15bfe7aaebd 55
screamer 18:a15bfe7aaebd 56 LIS3MDL(SPI *spi, PinName cs_pin, PinName int_pin=NC, SPI_type_t spi_type=SPI4W);
screamer 18:a15bfe7aaebd 57
screamer 18:a15bfe7aaebd 58 /** Constructor
screamer 18:a15bfe7aaebd 59 * @param[in] i2c device I2C to be used for communication
screamer 18:a15bfe7aaebd 60 */
screamer 18:a15bfe7aaebd 61
screamer 18:a15bfe7aaebd 62 LIS3MDL(DevI2C *i2c, uint8_t address=LIS3MDL_M_MEMS_ADDRESS_HIGH, PinName int_pin=NC);
screamer 18:a15bfe7aaebd 63
screamer 18:a15bfe7aaebd 64 /** Destructor
screamer 18:a15bfe7aaebd 65 */
screamer 18:a15bfe7aaebd 66 virtual ~LIS3MDL() {}
screamer 18:a15bfe7aaebd 67
screamer 18:a15bfe7aaebd 68 /*** Interface Methods ***/
screamer 18:a15bfe7aaebd 69 virtual int init(void *init_struct) {
screamer 18:a15bfe7aaebd 70 return LIS3MDL_Init((MAGNETO_InitTypeDef*)init_struct);
screamer 18:a15bfe7aaebd 71 }
screamer 18:a15bfe7aaebd 72
screamer 18:a15bfe7aaebd 73 virtual int read_id(uint8_t *m_id) {
screamer 18:a15bfe7aaebd 74 return LIS3MDL_Read_M_ID(m_id);
screamer 18:a15bfe7aaebd 75 }
screamer 18:a15bfe7aaebd 76
screamer 18:a15bfe7aaebd 77 virtual int get_m_axes(int32_t *pData) {
screamer 18:a15bfe7aaebd 78 return LIS3MDL_M_GetAxes(pData);
screamer 18:a15bfe7aaebd 79 }
screamer 18:a15bfe7aaebd 80
screamer 18:a15bfe7aaebd 81 virtual int get_m_axes_raw(int16_t *pData) {
screamer 18:a15bfe7aaebd 82 return LIS3MDL_M_GetAxesRaw(pData);
screamer 18:a15bfe7aaebd 83 }
screamer 18:a15bfe7aaebd 84
screamer 18:a15bfe7aaebd 85 protected:
screamer 18:a15bfe7aaebd 86 /*** Methods ***/
screamer 18:a15bfe7aaebd 87 MAGNETO_StatusTypeDef LIS3MDL_Init(MAGNETO_InitTypeDef *LIS3MDL_Init);
screamer 18:a15bfe7aaebd 88 MAGNETO_StatusTypeDef LIS3MDL_Read_M_ID(uint8_t *m_id);
screamer 18:a15bfe7aaebd 89 MAGNETO_StatusTypeDef LIS3MDL_M_GetAxes(int32_t *pData);
screamer 18:a15bfe7aaebd 90 MAGNETO_StatusTypeDef LIS3MDL_M_GetAxesRaw(int16_t *pData);
screamer 18:a15bfe7aaebd 91 MAGNETO_StatusTypeDef LIS3MDL_Set_SpiInterface (void *handle, LIS3MDL_SPIMode_t spimode);
screamer 18:a15bfe7aaebd 92
screamer 18:a15bfe7aaebd 93 /**
screamer 18:a15bfe7aaebd 94 * @brief Configures LIS3MDL interrupt lines for NUCLEO boards
screamer 18:a15bfe7aaebd 95 */
screamer 18:a15bfe7aaebd 96 void LIS3MDL_IO_ITConfig(void)
screamer 18:a15bfe7aaebd 97 {
screamer 18:a15bfe7aaebd 98 /* To be implemented */
screamer 18:a15bfe7aaebd 99 }
screamer 18:a15bfe7aaebd 100
screamer 18:a15bfe7aaebd 101 /**
screamer 18:a15bfe7aaebd 102 * @brief Configures LIS3MDL I2C interface
screamer 18:a15bfe7aaebd 103 * @return MAGNETO_OK in case of success, an error code otherwise
screamer 18:a15bfe7aaebd 104 */
screamer 18:a15bfe7aaebd 105 MAGNETO_StatusTypeDef LIS3MDL_IO_Init(void)
screamer 18:a15bfe7aaebd 106 {
screamer 18:a15bfe7aaebd 107 return MAGNETO_OK; /* done in constructor */
screamer 18:a15bfe7aaebd 108 }
screamer 18:a15bfe7aaebd 109
screamer 18:a15bfe7aaebd 110 /**
screamer 18:a15bfe7aaebd 111 * @brief Utility function to read data from LIS3MDL
screamer 18:a15bfe7aaebd 112 * @param[out] pBuffer pointer to the byte-array to read data in to
screamer 18:a15bfe7aaebd 113 * @param[in] RegisterAddr specifies internal address register to read from.
screamer 18:a15bfe7aaebd 114 * @param[in] NumByteToRead number of bytes to be read.
screamer 18:a15bfe7aaebd 115 * @retval MAGNETO_OK if ok,
screamer 18:a15bfe7aaebd 116 * @retval MAGNETO_ERROR if an I2C error has occured
screamer 18:a15bfe7aaebd 117 */
screamer 18:a15bfe7aaebd 118 MAGNETO_StatusTypeDef LIS3MDL_IO_Read(uint8_t* pBuffer,
screamer 18:a15bfe7aaebd 119 uint8_t RegisterAddr, uint16_t NumByteToRead)
screamer 18:a15bfe7aaebd 120 {
screamer 18:a15bfe7aaebd 121 if (_dev_spi) {
screamer 18:a15bfe7aaebd 122 /* Write Reg Address */
screamer 18:a15bfe7aaebd 123 _dev_spi->lock();
screamer 18:a15bfe7aaebd 124 _cs_pin = 0;
screamer 18:a15bfe7aaebd 125 if (_spi_type == SPI4W) {
screamer 18:a15bfe7aaebd 126 _dev_spi->write(RegisterAddr | 0x80);
screamer 18:a15bfe7aaebd 127 for (int i=0; i<NumByteToRead; i++) {
screamer 18:a15bfe7aaebd 128 *(pBuffer+i) = _dev_spi->write(0x00);
screamer 18:a15bfe7aaebd 129 }
screamer 18:a15bfe7aaebd 130 } else if (_spi_type == SPI3W){
screamer 18:a15bfe7aaebd 131 /* Write RD Reg Address with RD bit*/
screamer 18:a15bfe7aaebd 132 uint8_t TxByte = RegisterAddr | 0x80;
screamer 18:a15bfe7aaebd 133 _dev_spi->write((char *)&TxByte, 1, (char *)pBuffer, (int) NumByteToRead);
screamer 18:a15bfe7aaebd 134 }
screamer 18:a15bfe7aaebd 135 _cs_pin = 1;
screamer 18:a15bfe7aaebd 136 _dev_spi->unlock();
screamer 18:a15bfe7aaebd 137 return MAGNETO_OK;
screamer 18:a15bfe7aaebd 138 }
screamer 18:a15bfe7aaebd 139 if (!_dev_i2c) return MAGNETO_ERROR;
screamer 18:a15bfe7aaebd 140 int ret = _dev_i2c->i2c_read(pBuffer,
screamer 18:a15bfe7aaebd 141 _address,
screamer 18:a15bfe7aaebd 142 RegisterAddr,
screamer 18:a15bfe7aaebd 143 NumByteToRead);
screamer 18:a15bfe7aaebd 144 if(ret != 0) {
screamer 18:a15bfe7aaebd 145 return MAGNETO_ERROR;
screamer 18:a15bfe7aaebd 146 }
screamer 18:a15bfe7aaebd 147 return MAGNETO_OK;
screamer 18:a15bfe7aaebd 148 }
screamer 18:a15bfe7aaebd 149
screamer 18:a15bfe7aaebd 150 /**
screamer 18:a15bfe7aaebd 151 * @brief Utility function to write data to LIS3MDL
screamer 18:a15bfe7aaebd 152 * @param[in] pBuffer pointer to the byte-array data to send
screamer 18:a15bfe7aaebd 153 * @param[in] RegisterAddr specifies internal address register to read from.
screamer 18:a15bfe7aaebd 154 * @param[in] NumByteToWrite number of bytes to write.
screamer 18:a15bfe7aaebd 155 * @retval MAGNETO_OK if ok,
screamer 18:a15bfe7aaebd 156 * @retval MAGNETO_ERROR if an I2C error has occured
screamer 18:a15bfe7aaebd 157 */
screamer 18:a15bfe7aaebd 158 MAGNETO_StatusTypeDef LIS3MDL_IO_Write(uint8_t* pBuffer,
screamer 18:a15bfe7aaebd 159 uint8_t RegisterAddr, uint16_t NumByteToWrite)
screamer 18:a15bfe7aaebd 160 {
screamer 18:a15bfe7aaebd 161
screamer 18:a15bfe7aaebd 162 if (_dev_spi) {
screamer 18:a15bfe7aaebd 163 _dev_spi->lock();
screamer 18:a15bfe7aaebd 164 _cs_pin = 0;
screamer 18:a15bfe7aaebd 165 int data = _dev_spi->write(RegisterAddr);
screamer 18:a15bfe7aaebd 166 _dev_spi->write((char *)pBuffer, (int) NumByteToWrite, NULL, 0);
screamer 18:a15bfe7aaebd 167 _cs_pin = 1;
screamer 18:a15bfe7aaebd 168 _dev_spi->unlock();
screamer 18:a15bfe7aaebd 169 return MAGNETO_OK;
screamer 18:a15bfe7aaebd 170 }
screamer 18:a15bfe7aaebd 171
screamer 18:a15bfe7aaebd 172 if (!_dev_i2c) return MAGNETO_ERROR;
screamer 18:a15bfe7aaebd 173 int ret = _dev_i2c->i2c_write(pBuffer, _address, RegisterAddr, NumByteToWrite);
screamer 18:a15bfe7aaebd 174 if(ret != 0) {
screamer 18:a15bfe7aaebd 175 return MAGNETO_ERROR;
screamer 18:a15bfe7aaebd 176 }
screamer 18:a15bfe7aaebd 177 return MAGNETO_OK;
screamer 18:a15bfe7aaebd 178 }
screamer 18:a15bfe7aaebd 179
screamer 18:a15bfe7aaebd 180 /*** Instance Variables ***/
screamer 18:a15bfe7aaebd 181 /* IO Device */
screamer 18:a15bfe7aaebd 182 DevI2C *_dev_i2c;
screamer 18:a15bfe7aaebd 183 SPI *_dev_spi;
screamer 18:a15bfe7aaebd 184 uint8_t _address;
screamer 18:a15bfe7aaebd 185 DigitalOut _cs_pin;
screamer 18:a15bfe7aaebd 186 InterruptIn _int_pin;
screamer 18:a15bfe7aaebd 187 SPI_type_t _spi_type;
screamer 18:a15bfe7aaebd 188 };
screamer 18:a15bfe7aaebd 189
screamer 18:a15bfe7aaebd 190 #endif // __LIS3MDL_CLASS_H