This is a device driver of AK8963, which is 3-axis magnetometer manufactured by AKM.
Dependents: SimpleSample combination combination
ak8963.h@0:fc56973c077a, 2015-08-05 (annotated)
- 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?
User | Revision | Line number | New 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 |