This is a device driver of AK8963, which is 3-axis magnetometer manufactured by AKM.

Dependents:   SimpleSample combination combination

Committer:
coisme
Date:
Wed Aug 05 23:08:02 2015 +0000
Revision:
0:fc56973c077a
Child:
1:a362b9e3aac2
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
coisme 0:fc56973c077a 1 #ifndef AK8963_H
coisme 0:fc56973c077a 2 #define AK8963_H
coisme 0:fc56973c077a 3
coisme 0:fc56973c077a 4 #include "mbed.h"
coisme 0:fc56973c077a 5
coisme 0:fc56973c077a 6 /**
coisme 0:fc56973c077a 7 * This is a device driver of AK8963.
coisme 0:fc56973c077a 8 *
coisme 0:fc56973c077a 9 * @note AK8963 is a 3-axis magnetic sensor device manufactured by AKM.
coisme 0:fc56973c077a 10 */
coisme 0:fc56973c077a 11 class AK8963
coisme 0:fc56973c077a 12 {
coisme 0:fc56973c077a 13 public:
coisme 0:fc56973c077a 14 /**
coisme 0:fc56973c077a 15 * Possible slave address of AK8963. Selected by CAD1 and CAD0 pins.
coisme 0:fc56973c077a 16 */
coisme 0:fc56973c077a 17 typedef enum {
coisme 0:fc56973c077a 18 SLAVE_ADDR_1 = 0x0c, /**< CAD0 = Low, CAD1 = Low */
coisme 0:fc56973c077a 19 SLAVE_ADDR_2 = 0x0d, /**< CAD0 = High, CAD1 = Low */
coisme 0:fc56973c077a 20 SLAVE_ADDR_3 = 0x0e, /**< CAD0 = Low, CAD1 = High */
coisme 0:fc56973c077a 21 SLAVE_ADDR_4 = 0x0f, /**< CAD0 = High, CAD1 = High */
coisme 0:fc56973c077a 22 } SlaveAddress;
coisme 0:fc56973c077a 23
coisme 0:fc56973c077a 24 /**
coisme 0:fc56973c077a 25 * Available opration modes in AK8963.
coisme 0:fc56973c077a 26 */
coisme 0:fc56973c077a 27 typedef enum {
coisme 0:fc56973c077a 28 MODE_POWER_DOWN = 0x00, /**< Power-down mode */
coisme 0:fc56973c077a 29 MODE_SINGLE_MEASUREMENT = 0x01, /**< Single measurement mode */
coisme 0:fc56973c077a 30 MODE_CONTINUOUS_1 = 0x02, /**< Continuous measurement mode 1, 8 Hz */
coisme 0:fc56973c077a 31 MODE_CONTINUOUS_2 = 0x06, /**< Continuous measurement mode 2, 100 Hz */
coisme 0:fc56973c077a 32 } OperationMode;
coisme 0:fc56973c077a 33
coisme 0:fc56973c077a 34 /**
coisme 0:fc56973c077a 35 * Status of function.
coisme 0:fc56973c077a 36 */
coisme 0:fc56973c077a 37 typedef enum {
coisme 0:fc56973c077a 38 SUCCESS, /**< The function processed successfully. */
coisme 0:fc56973c077a 39 ERROR_I2C_READ, /**< Error related to I2C read. */
coisme 0:fc56973c077a 40 ERROR_I2C_WRITE, /**< Error related to I2C write. */
coisme 0:fc56973c077a 41 ERROR, /**< General Error */
coisme 0:fc56973c077a 42 DATA_READY, /**< Data ready */
coisme 0:fc56973c077a 43 NOT_DATA_READY, /**< Data ready is not asserted. */
coisme 0:fc56973c077a 44 } Status;
coisme 0:fc56973c077a 45
coisme 0:fc56973c077a 46 /**
coisme 0:fc56973c077a 47 * Structure to hold a magnetic vector.
coisme 0:fc56973c077a 48 */
coisme 0:fc56973c077a 49 typedef struct {
coisme 0:fc56973c077a 50 float mx; /**< x component */
coisme 0:fc56973c077a 51 float my; /**< y component */
coisme 0:fc56973c077a 52 float mz; /**< z component */
coisme 0:fc56973c077a 53 } MagneticVector;
coisme 0:fc56973c077a 54
coisme 0:fc56973c077a 55 /**
coisme 0:fc56973c077a 56 * Constructor.
coisme 0:fc56973c077a 57 *
coisme 0:fc56973c077a 58 * @param conn instance of I2C
coisme 0:fc56973c077a 59 * @param addr slave address of the device
coisme 0:fc56973c077a 60 */
coisme 0:fc56973c077a 61 AK8963(I2C *conn, SlaveAddress addr);
coisme 0:fc56973c077a 62
coisme 0:fc56973c077a 63 /**
coisme 0:fc56973c077a 64 * Check the connection.
coisme 0:fc56973c077a 65 *
coisme 0:fc56973c077a 66 * @note Connection check is performed by reading a register which has a fixed value and verify it.
coisme 0:fc56973c077a 67 *
coisme 0:fc56973c077a 68 * @return Returns SUCCESS when succeeded, otherwise returns another code.
coisme 0:fc56973c077a 69 */
coisme 0:fc56973c077a 70 Status checkConnection();
coisme 0:fc56973c077a 71
coisme 0:fc56973c077a 72 /**
coisme 0:fc56973c077a 73 * Sets device operation mode.
coisme 0:fc56973c077a 74 *
coisme 0:fc56973c077a 75 * @param mode device opration mode
coisme 0:fc56973c077a 76 *
coisme 0:fc56973c077a 77 * @return Returns SUCCESS when succeeded, otherwise returns another code.
coisme 0:fc56973c077a 78 */
coisme 0:fc56973c077a 79 Status setOperationMode(OperationMode mode);
coisme 0:fc56973c077a 80
coisme 0:fc56973c077a 81 /**
coisme 0:fc56973c077a 82 * Check if data is ready, i.e. measurement is finished.
coisme 0:fc56973c077a 83 *
coisme 0:fc56973c077a 84 * @return Returns DATA_READY if data is ready or NOT_DATA_READY if data is not ready. If error happens, returns another code.
coisme 0:fc56973c077a 85 */
coisme 0:fc56973c077a 86 Status isDataReady();
coisme 0:fc56973c077a 87
coisme 0:fc56973c077a 88 /**
coisme 0:fc56973c077a 89 * Gets magnetic vector from the device.
coisme 0:fc56973c077a 90 *
coisme 0:fc56973c077a 91 * @param vec Pointer to a instance of MagneticVector
coisme 0:fc56973c077a 92 *
coisme 0:fc56973c077a 93 * @return Returns SUCCESS when succeeded, otherwise returns another code.
coisme 0:fc56973c077a 94 */
coisme 0:fc56973c077a 95 Status getMagneticVector(MagneticVector *vec);
coisme 0:fc56973c077a 96
coisme 0:fc56973c077a 97 private:
coisme 0:fc56973c077a 98 /**
coisme 0:fc56973c077a 99 * Sensitivity adjustment data.
coisme 0:fc56973c077a 100 */
coisme 0:fc56973c077a 101 typedef struct {
coisme 0:fc56973c077a 102 unsigned char x; /**< sensitivity adjustment value for x */
coisme 0:fc56973c077a 103 unsigned char y; /**< sensitivity adjustment value for y */
coisme 0:fc56973c077a 104 unsigned char z; /**< sensitivity adjustment value for z */
coisme 0:fc56973c077a 105 } SensitivityAdjustment;
coisme 0:fc56973c077a 106
coisme 0:fc56973c077a 107 /**
coisme 0:fc56973c077a 108 * Holds sensitivity adjustment values
coisme 0:fc56973c077a 109 */
coisme 0:fc56973c077a 110 SensitivityAdjustment sensitivityAdjustment;
coisme 0:fc56973c077a 111
coisme 0:fc56973c077a 112 /**
coisme 0:fc56973c077a 113 * Holds a pointer to an I2C object.
coisme 0:fc56973c077a 114 */
coisme 0:fc56973c077a 115 I2C *connection;
coisme 0:fc56973c077a 116
coisme 0:fc56973c077a 117 /**
coisme 0:fc56973c077a 118 * Holds the slave address of AK8963.
coisme 0:fc56973c077a 119 */
coisme 0:fc56973c077a 120 SlaveAddress slaveAddress;
coisme 0:fc56973c077a 121
coisme 0:fc56973c077a 122 /**
coisme 0:fc56973c077a 123 * Writes data to the device.
coisme 0:fc56973c077a 124 * @param registerAddress register address to be written
coisme 0:fc56973c077a 125 * @param data data to be written
coisme 0:fc56973c077a 126 * @param length of the data
coisme 0:fc56973c077a 127 * @return Returns SUCCESS when succeeded, otherwise returns another.
coisme 0:fc56973c077a 128 */
coisme 0:fc56973c077a 129 Status write(char registerAddress, const char *data, int length);
coisme 0:fc56973c077a 130
coisme 0:fc56973c077a 131 /**
coisme 0:fc56973c077a 132 * Reads data from device.
coisme 0:fc56973c077a 133 * @param registerAddress register address to be read
coisme 0:fc56973c077a 134 * @param buf buffer to store the read data
coisme 0:fc56973c077a 135 * @param length bytes to be read
coisme 0:fc56973c077a 136 * @return Returns SUCCESS when succeeded, otherwise returns another.
coisme 0:fc56973c077a 137 */
coisme 0:fc56973c077a 138 Status read(char registerAddress, char *buf, int length);
coisme 0:fc56973c077a 139
coisme 0:fc56973c077a 140 /**
coisme 0:fc56973c077a 141 * Gets magnetic data, from the register ST1 (0x02) to ST2 (0x09), from the device.
coisme 0:fc56973c077a 142 *
coisme 0:fc56973c077a 143 * @param buf buffer to store the data read from the device.
coisme 0:fc56973c077a 144 *
coisme 0:fc56973c077a 145 * @return Returns SUCCESS when succeeded, otherwise returns another.
coisme 0:fc56973c077a 146 */
coisme 0:fc56973c077a 147 Status getData(char *buf);
coisme 0:fc56973c077a 148
coisme 0:fc56973c077a 149 /**
coisme 0:fc56973c077a 150 * Gets sensitivity adjustment values from the register ASAX, ASAY, and ASAZ.
coisme 0:fc56973c077a 151 *
coisme 0:fc56973c077a 152 * @param buf buffer to store sensitivity adjustment data
coisme 0:fc56973c077a 153 *
coisme 0:fc56973c077a 154 * @return SUCCESS when succeeded, otherwise returns another.
coisme 0:fc56973c077a 155 */
coisme 0:fc56973c077a 156 Status getSensitivityAdjustment(SensitivityAdjustment *sns);
coisme 0:fc56973c077a 157
coisme 0:fc56973c077a 158 };
coisme 0:fc56973c077a 159
coisme 0:fc56973c077a 160 #endif