Taylor Street / AkmSensor

Fork of AkmSensor by AKM Development Platform

Committer:
masahikofukasawa
Date:
Wed Feb 22 21:56:05 2017 +0000
Revision:
20:2fca76521680
Parent:
18:b7182d5ad8d5
Child:
24:1d37438f31a9
Debugged for AK09915 when stop sensor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masahikofukasawa 0:7a00359e701e 1 #ifndef AkmECompass_H
masahikofukasawa 0:7a00359e701e 2 #define AkmECompass_H
masahikofukasawa 0:7a00359e701e 3
masahikofukasawa 0:7a00359e701e 4 #include "mbed.h"
masahikofukasawa 0:7a00359e701e 5
masahikofukasawa 0:7a00359e701e 6 class AkmECompass
masahikofukasawa 0:7a00359e701e 7 {
masahikofukasawa 0:7a00359e701e 8 public:
masahikofukasawa 0:7a00359e701e 9 /**
masahikofukasawa 0:7a00359e701e 10 * Possible slave address of AkmECompass. Selected by CAD1 and CAD0 pins.
masahikofukasawa 0:7a00359e701e 11 */
masahikofukasawa 0:7a00359e701e 12 typedef enum {
masahikofukasawa 0:7a00359e701e 13 SLAVE_ADDR_1 = 0x0c, /**< CAD0 = Low, CAD1 = Low */
masahikofukasawa 0:7a00359e701e 14 SLAVE_ADDR_2 = 0x0d, /**< CAD0 = High, CAD1 = Low */
masahikofukasawa 0:7a00359e701e 15 SLAVE_ADDR_3 = 0x0e, /**< CAD0 = Low, CAD1 = High */
masahikofukasawa 0:7a00359e701e 16 SLAVE_ADDR_4 = 0x0f, /**< CAD0 = High, CAD1 = High */
masahikofukasawa 0:7a00359e701e 17 } SlaveAddress;
masahikofukasawa 0:7a00359e701e 18
masahikofukasawa 20:2fca76521680 19
masahikofukasawa 20:2fca76521680 20 /**
masahikofukasawa 20:2fca76521680 21 * Device ID stored in the register(WIA2).
masahikofukasawa 20:2fca76521680 22 */
masahikofukasawa 20:2fca76521680 23 typedef enum {
masahikofukasawa 20:2fca76521680 24 AK8963 = 0x00,
masahikofukasawa 20:2fca76521680 25 AK09911 = 0x05,
masahikofukasawa 20:2fca76521680 26 AK09912 = 0x04,
masahikofukasawa 20:2fca76521680 27 AK09915 = 0x10,
masahikofukasawa 20:2fca76521680 28 AK09916C = 0x09,
masahikofukasawa 20:2fca76521680 29 AK09916D = 0x0B,
masahikofukasawa 20:2fca76521680 30 AK09918 = 0x0C,
masahikofukasawa 20:2fca76521680 31 } DeviceId;
masahikofukasawa 20:2fca76521680 32
masahikofukasawa 0:7a00359e701e 33 /**
masahikofukasawa 0:7a00359e701e 34 * Available opration modes in AkmECompass.
masahikofukasawa 0:7a00359e701e 35 */
masahikofukasawa 0:7a00359e701e 36 typedef enum {
masahikofukasawa 0:7a00359e701e 37 MODE_POWER_DOWN = 0x00, /**< Power-down mode */
masahikofukasawa 0:7a00359e701e 38 MODE_SINGLE_MEASUREMENT = 0x01, /**< Single measurement mode */
masahikofukasawa 0:7a00359e701e 39 MODE_AK8963_CONTINUOUS_1 = 0x02, /**< Continuous measurement mode 1, 8 Hz */
masahikofukasawa 0:7a00359e701e 40 MODE_AK8963_CONTINUOUS_2 = 0x06, /**< Continuous measurement mode 2, 100 Hz */
masahikofukasawa 9:6fa3e7b17c27 41 MODE_AK8963_SELF_TEST = 0x08, /**< Self test mode */
masahikofukasawa 0:7a00359e701e 42 MODE_AK099XX_CONTINUOUS_1 = 0x02, /**< Continuous measurement mode 1, 10 Hz */
masahikofukasawa 0:7a00359e701e 43 MODE_AK099XX_CONTINUOUS_2 = 0x04, /**< Continuous measurement mode 2, 20 Hz */
masahikofukasawa 0:7a00359e701e 44 MODE_AK099XX_CONTINUOUS_3 = 0x06, /**< Continuous measurement mode 3, 50 Hz */
masahikofukasawa 0:7a00359e701e 45 MODE_AK099XX_CONTINUOUS_4 = 0x08, /**< Continuous measurement mode 4, 100 Hz */
masahikofukasawa 9:6fa3e7b17c27 46 MODE_AK099XX_CONTINUOUS_5 = 0x0A, /**< Continuous measurement mode 5, 200 Hz (Only AK09915) */
masahikofukasawa 9:6fa3e7b17c27 47 MODE_AK099XX_CONTINUOUS_6 = 0x0C, /**< Continuous measurement mode 6, 1 Hz (Only AK09915) */
masahikofukasawa 9:6fa3e7b17c27 48 MODE_AK099XX_SELF_TEST = 0x10, /**< Self test mode */
masahikofukasawa 0:7a00359e701e 49 } OperationMode;
masahikofukasawa 0:7a00359e701e 50
masahikofukasawa 9:6fa3e7b17c27 51 /**
masahikofukasawa 9:6fa3e7b17c27 52 * NSF(Noise suppression filter) setting for AK09912/AK09915.
masahikofukasawa 9:6fa3e7b17c27 53 */
masahikofukasawa 9:6fa3e7b17c27 54 typedef enum {
masahikofukasawa 9:6fa3e7b17c27 55 NSF_DISABLE = 0x00,
masahikofukasawa 9:6fa3e7b17c27 56 NSF_LOW = 0x01,
masahikofukasawa 9:6fa3e7b17c27 57 NSF_MIDDLE = 0x02,
masahikofukasawa 9:6fa3e7b17c27 58 NSF_HIGH = 0x03,
masahikofukasawa 9:6fa3e7b17c27 59 } Nsf;
masahikofukasawa 9:6fa3e7b17c27 60
masahikofukasawa 9:6fa3e7b17c27 61 /**
masahikofukasawa 9:6fa3e7b17c27 62 * SDR(Sensor Drive Setting) setting for AK09915.
masahikofukasawa 9:6fa3e7b17c27 63 */
masahikofukasawa 9:6fa3e7b17c27 64 typedef enum {
masahikofukasawa 9:6fa3e7b17c27 65 SDR_LOW_POWER_DRIVE = 0x00,
masahikofukasawa 9:6fa3e7b17c27 66 SDR_LOW_NOISE_DRIVE = 0x01,
masahikofukasawa 9:6fa3e7b17c27 67 } Sdr;
masahikofukasawa 9:6fa3e7b17c27 68
masahikofukasawa 0:7a00359e701e 69
masahikofukasawa 0:7a00359e701e 70 /**
masahikofukasawa 0:7a00359e701e 71 * Status of function.
masahikofukasawa 0:7a00359e701e 72 */
masahikofukasawa 0:7a00359e701e 73 typedef enum {
masahikofukasawa 0:7a00359e701e 74 SUCCESS, /**< The function processed successfully. */
masahikofukasawa 0:7a00359e701e 75 ERROR_I2C_READ, /**< Error related to I2C read. */
masahikofukasawa 0:7a00359e701e 76 ERROR_I2C_WRITE, /**< Error related to I2C write. */
masahikofukasawa 0:7a00359e701e 77 ERROR, /**< General Error */
masahikofukasawa 0:7a00359e701e 78 DATA_READY, /**< Data ready */
masahikofukasawa 0:7a00359e701e 79 NOT_DATA_READY, /**< Data ready is not asserted. */
masahikofukasawa 0:7a00359e701e 80 DATA_OVER_RUN, /**< Data over run. */
masahikofukasawa 0:7a00359e701e 81 } Status;
masahikofukasawa 0:7a00359e701e 82
masahikofukasawa 0:7a00359e701e 83 /**
masahikofukasawa 0:7a00359e701e 84 * Structure to hold a magnetic vector.
masahikofukasawa 0:7a00359e701e 85 */
masahikofukasawa 0:7a00359e701e 86 typedef struct {
masahikofukasawa 0:7a00359e701e 87 float mx; /**< x component */
masahikofukasawa 0:7a00359e701e 88 float my; /**< y component */
masahikofukasawa 0:7a00359e701e 89 float mz; /**< z component */
masahikofukasawa 0:7a00359e701e 90 bool isOverflow; /**< Indicating magnetic sensor overflow */
masahikofukasawa 0:7a00359e701e 91 } MagneticVector;
masahikofukasawa 0:7a00359e701e 92
masahikofukasawa 10:5c69b067d88a 93 /**
masahikofukasawa 18:b7182d5ad8d5 94 * Sensitivity adjustment data.
masahikofukasawa 18:b7182d5ad8d5 95 */
masahikofukasawa 18:b7182d5ad8d5 96 typedef struct {
masahikofukasawa 18:b7182d5ad8d5 97 unsigned char x; /**< sensitivity adjustment value for x */
masahikofukasawa 18:b7182d5ad8d5 98 unsigned char y; /**< sensitivity adjustment value for y */
masahikofukasawa 18:b7182d5ad8d5 99 unsigned char z; /**< sensitivity adjustment value for z */
masahikofukasawa 18:b7182d5ad8d5 100 } SensitivityAdjustment;
masahikofukasawa 18:b7182d5ad8d5 101
masahikofukasawa 18:b7182d5ad8d5 102 /**
masahikofukasawa 10:5c69b067d88a 103 * Constructor.
masahikofukasawa 10:5c69b067d88a 104 *
masahikofukasawa 10:5c69b067d88a 105 */
masahikofukasawa 0:7a00359e701e 106 AkmECompass(){}
masahikofukasawa 10:5c69b067d88a 107
masahikofukasawa 10:5c69b067d88a 108 /**
masahikofukasawa 10:5c69b067d88a 109 * Destructor.
masahikofukasawa 10:5c69b067d88a 110 *
masahikofukasawa 10:5c69b067d88a 111 */
masahikofukasawa 0:7a00359e701e 112 virtual ~AkmECompass(){}
masahikofukasawa 0:7a00359e701e 113
masahikofukasawa 10:5c69b067d88a 114 /**
masahikofukasawa 10:5c69b067d88a 115 * Initialize sensor with I2C connection.
masahikofukasawa 10:5c69b067d88a 116 *
masahikofukasawa 10:5c69b067d88a 117 * @param _i2c Pointer to the I2C instance
masahikofukasawa 10:5c69b067d88a 118 * @param addr Slave address of the device
masahikofukasawa 20:2fca76521680 119 * @param deviceId Device Id enum
masahikofukasawa 10:5c69b067d88a 120 *
masahikofukasawa 10:5c69b067d88a 121 */
masahikofukasawa 20:2fca76521680 122 virtual void init(I2C *_i2c, SlaveAddress addr, DeviceId deviceId) = 0;
masahikofukasawa 10:5c69b067d88a 123
masahikofukasawa 10:5c69b067d88a 124 /**
masahikofukasawa 10:5c69b067d88a 125 * Initialize sensor with SPI connection.
masahikofukasawa 10:5c69b067d88a 126 *
masahikofukasawa 10:5c69b067d88a 127 * @param _spi Pointer to the SPI instance
masahikofukasawa 10:5c69b067d88a 128 * @param _cs Pointer to the chip select DigitalOut pin
masahikofukasawa 20:2fca76521680 129 * @param deviceId Device Id enum
masahikofukasawa 10:5c69b067d88a 130 *
masahikofukasawa 10:5c69b067d88a 131 */
masahikofukasawa 20:2fca76521680 132 virtual void init(SPI *_spi, DigitalOut *_cs, DeviceId deviceId) = 0;
masahikofukasawa 0:7a00359e701e 133
masahikofukasawa 0:7a00359e701e 134 /**
masahikofukasawa 0:7a00359e701e 135 * Check the connection.
masahikofukasawa 0:7a00359e701e 136 *
masahikofukasawa 0:7a00359e701e 137 * @note Connection check is performed by reading a register which has a fixed value and verify it.
masahikofukasawa 0:7a00359e701e 138 *
masahikofukasawa 0:7a00359e701e 139 * @return Returns SUCCESS when succeeded, otherwise returns another code.
masahikofukasawa 0:7a00359e701e 140 */
masahikofukasawa 0:7a00359e701e 141 virtual Status checkConnection() = 0;
masahikofukasawa 0:7a00359e701e 142
masahikofukasawa 0:7a00359e701e 143 /**
masahikofukasawa 9:6fa3e7b17c27 144 * Gets device operation mode.
masahikofukasawa 9:6fa3e7b17c27 145 *
masahikofukasawa 9:6fa3e7b17c27 146 * @param mode device opration mode
masahikofukasawa 9:6fa3e7b17c27 147 *
masahikofukasawa 9:6fa3e7b17c27 148 * @return Returns SUCCESS when succeeded, otherwise returns another code.
masahikofukasawa 9:6fa3e7b17c27 149 */
masahikofukasawa 9:6fa3e7b17c27 150 virtual Status getOperationMode(OperationMode *mode) = 0;
masahikofukasawa 9:6fa3e7b17c27 151
masahikofukasawa 9:6fa3e7b17c27 152 /**
masahikofukasawa 18:b7182d5ad8d5 153 * Gets device operation mode.
masahikofukasawa 18:b7182d5ad8d5 154 *
masahikofukasawa 18:b7182d5ad8d5 155 * @param mode device opration mode
masahikofukasawa 18:b7182d5ad8d5 156 * @param nsf noise suppression filter setting
masahikofukasawa 18:b7182d5ad8d5 157 *
masahikofukasawa 18:b7182d5ad8d5 158 * @return Returns SUCCESS when succeeded, otherwise returns another code.
masahikofukasawa 18:b7182d5ad8d5 159 */
masahikofukasawa 18:b7182d5ad8d5 160 virtual Status getOperationMode(OperationMode *mode, Nsf *nsf) = 0;
masahikofukasawa 18:b7182d5ad8d5 161
masahikofukasawa 18:b7182d5ad8d5 162 /**
masahikofukasawa 18:b7182d5ad8d5 163 * Gets device operation mode.
masahikofukasawa 18:b7182d5ad8d5 164 *
masahikofukasawa 18:b7182d5ad8d5 165 * @param mode device opration mode
masahikofukasawa 18:b7182d5ad8d5 166 * @param nsf noise suppression filter setting
masahikofukasawa 18:b7182d5ad8d5 167 * @param sdr sensor drive setting
masahikofukasawa 18:b7182d5ad8d5 168 *
masahikofukasawa 18:b7182d5ad8d5 169 * @return Returns SUCCESS when succeeded, otherwise returns another code.
masahikofukasawa 18:b7182d5ad8d5 170 */
masahikofukasawa 18:b7182d5ad8d5 171 virtual Status getOperationMode(OperationMode *mode, Nsf *nsf, Sdr *sdr) = 0;
masahikofukasawa 18:b7182d5ad8d5 172
masahikofukasawa 18:b7182d5ad8d5 173 /**
masahikofukasawa 0:7a00359e701e 174 * Sets device operation mode.
masahikofukasawa 0:7a00359e701e 175 *
masahikofukasawa 0:7a00359e701e 176 * @param mode device opration mode
masahikofukasawa 0:7a00359e701e 177 *
masahikofukasawa 0:7a00359e701e 178 * @return Returns SUCCESS when succeeded, otherwise returns another code.
masahikofukasawa 0:7a00359e701e 179 */
masahikofukasawa 0:7a00359e701e 180 virtual Status setOperationMode(OperationMode mode) = 0;
masahikofukasawa 9:6fa3e7b17c27 181
masahikofukasawa 9:6fa3e7b17c27 182 /**
masahikofukasawa 10:5c69b067d88a 183 * Sets device operation mode for AK09912.
masahikofukasawa 9:6fa3e7b17c27 184 *
masahikofukasawa 9:6fa3e7b17c27 185 * @param mode device opration mode
masahikofukasawa 10:5c69b067d88a 186 * @param nsf noise suppression filter setting
masahikofukasawa 9:6fa3e7b17c27 187 *
masahikofukasawa 9:6fa3e7b17c27 188 * @return Returns SUCCESS when succeeded, otherwise returns another code.
masahikofukasawa 9:6fa3e7b17c27 189 */
masahikofukasawa 10:5c69b067d88a 190 virtual Status setOperationMode(OperationMode mode, Nsf nsf) = 0;
masahikofukasawa 10:5c69b067d88a 191
masahikofukasawa 10:5c69b067d88a 192 /**
masahikofukasawa 10:5c69b067d88a 193 * Sets device operation mode for AK09915.
masahikofukasawa 10:5c69b067d88a 194 *
masahikofukasawa 10:5c69b067d88a 195 * @param mode device opration mode
masahikofukasawa 10:5c69b067d88a 196 * @param nsf noise suppression filter setting
masahikofukasawa 10:5c69b067d88a 197 * @param sdr sensor drive setting
masahikofukasawa 10:5c69b067d88a 198 *
masahikofukasawa 10:5c69b067d88a 199 * @return Returns SUCCESS when succeeded, otherwise returns another code.
masahikofukasawa 10:5c69b067d88a 200 */
masahikofukasawa 10:5c69b067d88a 201 virtual Status setOperationMode(OperationMode mode, Nsf nsf, Sdr sdr) = 0;
masahikofukasawa 0:7a00359e701e 202
masahikofukasawa 0:7a00359e701e 203 /**
masahikofukasawa 0:7a00359e701e 204 * Check if data is ready, i.e. measurement is finished.
masahikofukasawa 0:7a00359e701e 205 *
masahikofukasawa 0:7a00359e701e 206 * @return Returns DATA_READY if data is ready or NOT_DATA_READY if data is not ready. If error happens, returns another code.
masahikofukasawa 0:7a00359e701e 207 */
masahikofukasawa 0:7a00359e701e 208 virtual Status isDataReady() = 0;
masahikofukasawa 0:7a00359e701e 209
masahikofukasawa 0:7a00359e701e 210 /**
masahikofukasawa 0:7a00359e701e 211 * Gets magnetic vector from the device.
masahikofukasawa 0:7a00359e701e 212 *
masahikofukasawa 0:7a00359e701e 213 * @param vec Pointer to a instance of MagneticVector
masahikofukasawa 0:7a00359e701e 214 *
masahikofukasawa 0:7a00359e701e 215 * @return Returns SUCCESS when succeeded, otherwise returns another code.
masahikofukasawa 0:7a00359e701e 216 */
masahikofukasawa 0:7a00359e701e 217 virtual Status getMagneticVector(MagneticVector *vec) = 0;
masahikofukasawa 0:7a00359e701e 218
masahikofukasawa 0:7a00359e701e 219 /**
masahikofukasawa 0:7a00359e701e 220 * Writes data to the device.
masahikofukasawa 0:7a00359e701e 221 * @param registerAddress register address to be written
masahikofukasawa 0:7a00359e701e 222 * @param data data to be written
masahikofukasawa 0:7a00359e701e 223 * @param length of the data
masahikofukasawa 0:7a00359e701e 224 * @return Returns SUCCESS when succeeded, otherwise returns another.
masahikofukasawa 0:7a00359e701e 225 */
masahikofukasawa 0:7a00359e701e 226 virtual Status write(char registerAddress, const char *data, int length) = 0;
masahikofukasawa 0:7a00359e701e 227
masahikofukasawa 0:7a00359e701e 228 /**
masahikofukasawa 0:7a00359e701e 229 * Reads data from device.
masahikofukasawa 0:7a00359e701e 230 * @param registerAddress register address to be read
masahikofukasawa 0:7a00359e701e 231 * @param buf buffer to store the read data
masahikofukasawa 0:7a00359e701e 232 * @param length bytes to be read
masahikofukasawa 0:7a00359e701e 233 * @return Returns SUCCESS when succeeded, otherwise returns another.
masahikofukasawa 0:7a00359e701e 234 */
masahikofukasawa 0:7a00359e701e 235 virtual Status read(char registerAddress, char *buf, int length) = 0;
masahikofukasawa 0:7a00359e701e 236
masahikofukasawa 9:6fa3e7b17c27 237 protected:
masahikofukasawa 18:b7182d5ad8d5 238 /**
masahikofukasawa 18:b7182d5ad8d5 239 * Holds a pointer to an I2C object.
masahikofukasawa 9:6fa3e7b17c27 240 */
masahikofukasawa 18:b7182d5ad8d5 241 I2C *i2c;
masahikofukasawa 18:b7182d5ad8d5 242
masahikofukasawa 18:b7182d5ad8d5 243 /**
masahikofukasawa 18:b7182d5ad8d5 244 * Holds a pointer to an SPI object.
masahikofukasawa 18:b7182d5ad8d5 245 */
masahikofukasawa 18:b7182d5ad8d5 246 SPI *spi;
masahikofukasawa 18:b7182d5ad8d5 247
masahikofukasawa 18:b7182d5ad8d5 248 /**
masahikofukasawa 18:b7182d5ad8d5 249 * Holds a DigitalOut oblject for CS;
masahikofukasawa 18:b7182d5ad8d5 250 */
masahikofukasawa 18:b7182d5ad8d5 251 DigitalOut *cs;
masahikofukasawa 18:b7182d5ad8d5 252
masahikofukasawa 18:b7182d5ad8d5 253 /**
masahikofukasawa 18:b7182d5ad8d5 254 * Holds the slave address of AkmECompass.
masahikofukasawa 18:b7182d5ad8d5 255 */
masahikofukasawa 18:b7182d5ad8d5 256 SlaveAddress slaveAddress;
masahikofukasawa 20:2fca76521680 257
masahikofukasawa 20:2fca76521680 258 /**
masahikofukasawa 20:2fca76521680 259 * Holds the device ID(WIA2).
masahikofukasawa 20:2fca76521680 260 */
masahikofukasawa 20:2fca76521680 261 DeviceId deviceId;
masahikofukasawa 9:6fa3e7b17c27 262
masahikofukasawa 0:7a00359e701e 263 /**
masahikofukasawa 20:2fca76521680 264 * Holds sensitivity adjustment values
masahikofukasawa 0:7a00359e701e 265 */
masahikofukasawa 20:2fca76521680 266 SensitivityAdjustment sensitivityAdjustment;
masahikofukasawa 0:7a00359e701e 267 };
masahikofukasawa 0:7a00359e701e 268
masahikofukasawa 0:7a00359e701e 269 #endif