Preliminary changes

Dependencies:   mbed

Committer:
ryudas
Date:
Tue Oct 08 16:44:21 2019 +0000
Revision:
3:232745b180d9
Parent:
1:a362b9e3aac2
xzx

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 1:a362b9e3aac2 9 * @note AK8963 is a 3-axis magnetometer (magnetic sensor) device manufactured by AKM.
coisme 1:a362b9e3aac2 10 *
coisme 1:a362b9e3aac2 11 * Example:
coisme 1:a362b9e3aac2 12 * @code
coisme 1:a362b9e3aac2 13 * #include "mbed.h"
coisme 1:a362b9e3aac2 14 * #include "ak8963.h"
coisme 1:a362b9e3aac2 15 *
coisme 1:a362b9e3aac2 16 * #define I2C_SPEED_100KHZ 100000
coisme 1:a362b9e3aac2 17 * #define I2C_SPEED_400KHZ 400000
coisme 1:a362b9e3aac2 18 *
coisme 1:a362b9e3aac2 19 * int main() {
coisme 1:a362b9e3aac2 20 * // Creates an instance of I2C
coisme 1:a362b9e3aac2 21 * I2C connection(I2C_SDA0, I2C_SCL0);
coisme 1:a362b9e3aac2 22 * connection.frequency(I2C_SPEED_100KHZ);
coisme 1:a362b9e3aac2 23 *
coisme 1:a362b9e3aac2 24 * // Creates an instance of AK8963
coisme 1:a362b9e3aac2 25 * AK8963 ak8963(&connection, AK8963::SLAVE_ADDR_1);
coisme 1:a362b9e3aac2 26 *
coisme 1:a362b9e3aac2 27 * // Checks connectivity
coisme 1:a362b9e3aac2 28 * if(ak8963.checkConnection() != AK8963::SUCCESS) {
coisme 1:a362b9e3aac2 29 * // Failed to check device connection.
coisme 1:a362b9e3aac2 30 * // - error handling here -
coisme 1:a362b9e3aac2 31 * }
coisme 1:a362b9e3aac2 32 *
coisme 1:a362b9e3aac2 33 * // Puts the device into continuous measurement mode.
coisme 1:a362b9e3aac2 34 * if(ak8963.setOperationMode(AK8963::MODE_CONTINUOUS_1) != AK8963::SUCCESS) {
coisme 1:a362b9e3aac2 35 * // Failed to set the device into continuous measurement mode.
coisme 1:a362b9e3aac2 36 * // - error handling here -
coisme 1:a362b9e3aac2 37 * }
coisme 1:a362b9e3aac2 38 *
coisme 1:a362b9e3aac2 39 * while(true) {
coisme 1:a362b9e3aac2 40 * // checks DRDY
coisme 1:a362b9e3aac2 41 * if (statusAK8963 == AK8963::DATA_READY) {
coisme 1:a362b9e3aac2 42 * AK8963::MagneticVector mag;
coisme 1:a362b9e3aac2 43 * ak8963.getMagneticVector(&mag);
coisme 1:a362b9e3aac2 44 * // You may use serial output to see data.
coisme 1:a362b9e3aac2 45 * // serial.printf("%d,%5.1f,%5.1f,%5.1f\n",
coisme 1:a362b9e3aac2 46 * // mag.isOverflow,
coisme 1:a362b9e3aac2 47 * // mag.mx, mag.my, mag.mz);
coisme 1:a362b9e3aac2 48 * statusAK8963 = AK8963::NOT_DATA_READY;
coisme 1:a362b9e3aac2 49 * } else if (statusAK8963 == AK8963::NOT_DATA_READY) {
coisme 1:a362b9e3aac2 50 * // Nothing to do.
coisme 1:a362b9e3aac2 51 * } else {
coisme 1:a362b9e3aac2 52 * // - error handling here -
coisme 1:a362b9e3aac2 53 * }
coisme 1:a362b9e3aac2 54 * }
coisme 1:a362b9e3aac2 55 * }
coisme 1:a362b9e3aac2 56 * @endcode
coisme 0:fc56973c077a 57 */
coisme 0:fc56973c077a 58 class AK8963
coisme 0:fc56973c077a 59 {
coisme 0:fc56973c077a 60 public:
coisme 0:fc56973c077a 61 /**
coisme 0:fc56973c077a 62 * Possible slave address of AK8963. Selected by CAD1 and CAD0 pins.
coisme 0:fc56973c077a 63 */
coisme 0:fc56973c077a 64 typedef enum {
coisme 0:fc56973c077a 65 SLAVE_ADDR_1 = 0x0c, /**< CAD0 = Low, CAD1 = Low */
coisme 0:fc56973c077a 66 SLAVE_ADDR_2 = 0x0d, /**< CAD0 = High, CAD1 = Low */
coisme 0:fc56973c077a 67 SLAVE_ADDR_3 = 0x0e, /**< CAD0 = Low, CAD1 = High */
coisme 0:fc56973c077a 68 SLAVE_ADDR_4 = 0x0f, /**< CAD0 = High, CAD1 = High */
coisme 0:fc56973c077a 69 } SlaveAddress;
coisme 0:fc56973c077a 70
coisme 0:fc56973c077a 71 /**
coisme 0:fc56973c077a 72 * Available opration modes in AK8963.
coisme 0:fc56973c077a 73 */
coisme 0:fc56973c077a 74 typedef enum {
coisme 0:fc56973c077a 75 MODE_POWER_DOWN = 0x00, /**< Power-down mode */
coisme 0:fc56973c077a 76 MODE_SINGLE_MEASUREMENT = 0x01, /**< Single measurement mode */
coisme 0:fc56973c077a 77 MODE_CONTINUOUS_1 = 0x02, /**< Continuous measurement mode 1, 8 Hz */
coisme 0:fc56973c077a 78 MODE_CONTINUOUS_2 = 0x06, /**< Continuous measurement mode 2, 100 Hz */
coisme 0:fc56973c077a 79 } OperationMode;
coisme 0:fc56973c077a 80
coisme 0:fc56973c077a 81 /**
coisme 0:fc56973c077a 82 * Status of function.
coisme 0:fc56973c077a 83 */
coisme 0:fc56973c077a 84 typedef enum {
coisme 0:fc56973c077a 85 SUCCESS, /**< The function processed successfully. */
coisme 0:fc56973c077a 86 ERROR_I2C_READ, /**< Error related to I2C read. */
coisme 0:fc56973c077a 87 ERROR_I2C_WRITE, /**< Error related to I2C write. */
coisme 0:fc56973c077a 88 ERROR, /**< General Error */
coisme 0:fc56973c077a 89 DATA_READY, /**< Data ready */
coisme 0:fc56973c077a 90 NOT_DATA_READY, /**< Data ready is not asserted. */
coisme 0:fc56973c077a 91 } Status;
coisme 0:fc56973c077a 92
coisme 0:fc56973c077a 93 /**
coisme 0:fc56973c077a 94 * Structure to hold a magnetic vector.
coisme 0:fc56973c077a 95 */
coisme 0:fc56973c077a 96 typedef struct {
coisme 0:fc56973c077a 97 float mx; /**< x component */
coisme 0:fc56973c077a 98 float my; /**< y component */
coisme 0:fc56973c077a 99 float mz; /**< z component */
coisme 1:a362b9e3aac2 100 bool isOverflow; /**< Indicating magnetic sensor overflow */
coisme 0:fc56973c077a 101 } MagneticVector;
coisme 0:fc56973c077a 102
coisme 0:fc56973c077a 103 /**
coisme 0:fc56973c077a 104 * Constructor.
coisme 0:fc56973c077a 105 *
coisme 0:fc56973c077a 106 * @param conn instance of I2C
coisme 0:fc56973c077a 107 * @param addr slave address of the device
coisme 0:fc56973c077a 108 */
coisme 0:fc56973c077a 109 AK8963(I2C *conn, SlaveAddress addr);
coisme 0:fc56973c077a 110
coisme 0:fc56973c077a 111 /**
coisme 0:fc56973c077a 112 * Check the connection.
coisme 0:fc56973c077a 113 *
coisme 0:fc56973c077a 114 * @note Connection check is performed by reading a register which has a fixed value and verify it.
coisme 0:fc56973c077a 115 *
coisme 0:fc56973c077a 116 * @return Returns SUCCESS when succeeded, otherwise returns another code.
coisme 0:fc56973c077a 117 */
coisme 0:fc56973c077a 118 Status checkConnection();
coisme 0:fc56973c077a 119
coisme 0:fc56973c077a 120 /**
coisme 0:fc56973c077a 121 * Sets device operation mode.
coisme 0:fc56973c077a 122 *
coisme 0:fc56973c077a 123 * @param mode device opration mode
coisme 0:fc56973c077a 124 *
coisme 0:fc56973c077a 125 * @return Returns SUCCESS when succeeded, otherwise returns another code.
coisme 0:fc56973c077a 126 */
coisme 0:fc56973c077a 127 Status setOperationMode(OperationMode mode);
coisme 0:fc56973c077a 128
coisme 0:fc56973c077a 129 /**
coisme 0:fc56973c077a 130 * Check if data is ready, i.e. measurement is finished.
coisme 0:fc56973c077a 131 *
coisme 0:fc56973c077a 132 * @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 133 */
coisme 0:fc56973c077a 134 Status isDataReady();
coisme 0:fc56973c077a 135
coisme 0:fc56973c077a 136 /**
coisme 0:fc56973c077a 137 * Gets magnetic vector from the device.
coisme 0:fc56973c077a 138 *
coisme 0:fc56973c077a 139 * @param vec Pointer to a instance of MagneticVector
coisme 0:fc56973c077a 140 *
coisme 0:fc56973c077a 141 * @return Returns SUCCESS when succeeded, otherwise returns another code.
coisme 0:fc56973c077a 142 */
coisme 0:fc56973c077a 143 Status getMagneticVector(MagneticVector *vec);
coisme 0:fc56973c077a 144
coisme 0:fc56973c077a 145 private:
coisme 0:fc56973c077a 146 /**
coisme 0:fc56973c077a 147 * Sensitivity adjustment data.
coisme 0:fc56973c077a 148 */
coisme 0:fc56973c077a 149 typedef struct {
coisme 0:fc56973c077a 150 unsigned char x; /**< sensitivity adjustment value for x */
coisme 0:fc56973c077a 151 unsigned char y; /**< sensitivity adjustment value for y */
coisme 0:fc56973c077a 152 unsigned char z; /**< sensitivity adjustment value for z */
coisme 0:fc56973c077a 153 } SensitivityAdjustment;
coisme 0:fc56973c077a 154
coisme 0:fc56973c077a 155 /**
coisme 0:fc56973c077a 156 * Holds sensitivity adjustment values
coisme 0:fc56973c077a 157 */
coisme 0:fc56973c077a 158 SensitivityAdjustment sensitivityAdjustment;
coisme 0:fc56973c077a 159
coisme 0:fc56973c077a 160 /**
coisme 0:fc56973c077a 161 * Holds a pointer to an I2C object.
coisme 0:fc56973c077a 162 */
coisme 0:fc56973c077a 163 I2C *connection;
coisme 0:fc56973c077a 164
coisme 0:fc56973c077a 165 /**
coisme 0:fc56973c077a 166 * Holds the slave address of AK8963.
coisme 0:fc56973c077a 167 */
coisme 0:fc56973c077a 168 SlaveAddress slaveAddress;
coisme 0:fc56973c077a 169
coisme 0:fc56973c077a 170 /**
coisme 0:fc56973c077a 171 * Writes data to the device.
coisme 0:fc56973c077a 172 * @param registerAddress register address to be written
coisme 0:fc56973c077a 173 * @param data data to be written
coisme 0:fc56973c077a 174 * @param length of the data
coisme 0:fc56973c077a 175 * @return Returns SUCCESS when succeeded, otherwise returns another.
coisme 0:fc56973c077a 176 */
coisme 0:fc56973c077a 177 Status write(char registerAddress, const char *data, int length);
coisme 0:fc56973c077a 178
coisme 0:fc56973c077a 179 /**
coisme 0:fc56973c077a 180 * Reads data from device.
coisme 0:fc56973c077a 181 * @param registerAddress register address to be read
coisme 0:fc56973c077a 182 * @param buf buffer to store the read data
coisme 0:fc56973c077a 183 * @param length bytes to be read
coisme 0:fc56973c077a 184 * @return Returns SUCCESS when succeeded, otherwise returns another.
coisme 0:fc56973c077a 185 */
coisme 0:fc56973c077a 186 Status read(char registerAddress, char *buf, int length);
coisme 0:fc56973c077a 187
coisme 0:fc56973c077a 188 /**
coisme 0:fc56973c077a 189 * Gets magnetic data, from the register ST1 (0x02) to ST2 (0x09), from the device.
coisme 0:fc56973c077a 190 *
coisme 0:fc56973c077a 191 * @param buf buffer to store the data read from the device.
coisme 0:fc56973c077a 192 *
coisme 0:fc56973c077a 193 * @return Returns SUCCESS when succeeded, otherwise returns another.
coisme 0:fc56973c077a 194 */
coisme 0:fc56973c077a 195 Status getData(char *buf);
coisme 0:fc56973c077a 196
coisme 0:fc56973c077a 197 /**
coisme 0:fc56973c077a 198 * Gets sensitivity adjustment values from the register ASAX, ASAY, and ASAZ.
coisme 0:fc56973c077a 199 *
coisme 0:fc56973c077a 200 * @param buf buffer to store sensitivity adjustment data
coisme 0:fc56973c077a 201 *
coisme 0:fc56973c077a 202 * @return SUCCESS when succeeded, otherwise returns another.
coisme 0:fc56973c077a 203 */
coisme 0:fc56973c077a 204 Status getSensitivityAdjustment(SensitivityAdjustment *sns);
coisme 0:fc56973c077a 205
coisme 0:fc56973c077a 206 };
coisme 0:fc56973c077a 207
coisme 0:fc56973c077a 208 #endif