Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: CanSat-C_test test AvoidTest Run-Avoid
HMC6352.h@0:83c0cb554099, 2010-11-27 (annotated)
- Committer:
 - aberk
 - Date:
 - Sat Nov 27 12:15:03 2010 +0000
 - Revision:
 - 0:83c0cb554099
 - Child:
 - 1:c1e543f15817
 
Version 1.0
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| aberk | 0:83c0cb554099 | 1 | /** | 
| aberk | 0:83c0cb554099 | 2 | * @author Aaron Berk | 
| aberk | 0:83c0cb554099 | 3 | * | 
| aberk | 0:83c0cb554099 | 4 | * @section LICENSE | 
| aberk | 0:83c0cb554099 | 5 | * | 
| aberk | 0:83c0cb554099 | 6 | * Copyright (c) 2010 ARM Limited | 
| aberk | 0:83c0cb554099 | 7 | * | 
| aberk | 0:83c0cb554099 | 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy | 
| aberk | 0:83c0cb554099 | 9 | * of this software and associated documentation files (the "Software"), to deal | 
| aberk | 0:83c0cb554099 | 10 | * in the Software without restriction, including without limitation the rights | 
| aberk | 0:83c0cb554099 | 11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
| aberk | 0:83c0cb554099 | 12 | * copies of the Software, and to permit persons to whom the Software is | 
| aberk | 0:83c0cb554099 | 13 | * furnished to do so, subject to the following conditions: | 
| aberk | 0:83c0cb554099 | 14 | * | 
| aberk | 0:83c0cb554099 | 15 | * The above copyright notice and this permission notice shall be included in | 
| aberk | 0:83c0cb554099 | 16 | * all copies or substantial portions of the Software. | 
| aberk | 0:83c0cb554099 | 17 | * | 
| aberk | 0:83c0cb554099 | 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
| aberk | 0:83c0cb554099 | 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
| aberk | 0:83c0cb554099 | 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
| aberk | 0:83c0cb554099 | 21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
| aberk | 0:83c0cb554099 | 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
| aberk | 0:83c0cb554099 | 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
| aberk | 0:83c0cb554099 | 24 | * THE SOFTWARE. | 
| aberk | 0:83c0cb554099 | 25 | * | 
| aberk | 0:83c0cb554099 | 26 | * @section DESCRIPTION | 
| aberk | 0:83c0cb554099 | 27 | * | 
| aberk | 0:83c0cb554099 | 28 | * Honeywell HMC6352 digital compass. | 
| aberk | 0:83c0cb554099 | 29 | * | 
| aberk | 0:83c0cb554099 | 30 | * Datasheet: | 
| aberk | 0:83c0cb554099 | 31 | * | 
| aberk | 0:83c0cb554099 | 32 | * http://www.ssec.honeywell.com/magnetic/datasheets/HMC6352.pdf | 
| aberk | 0:83c0cb554099 | 33 | */ | 
| aberk | 0:83c0cb554099 | 34 | |
| aberk | 0:83c0cb554099 | 35 | #ifndef HMC6352_H | 
| aberk | 0:83c0cb554099 | 36 | #define HMC6352_H | 
| aberk | 0:83c0cb554099 | 37 | |
| aberk | 0:83c0cb554099 | 38 | /** | 
| aberk | 0:83c0cb554099 | 39 | * Includes | 
| aberk | 0:83c0cb554099 | 40 | */ | 
| aberk | 0:83c0cb554099 | 41 | #include "mbed.h" | 
| aberk | 0:83c0cb554099 | 42 | |
| aberk | 0:83c0cb554099 | 43 | /** | 
| aberk | 0:83c0cb554099 | 44 | * Defines | 
| aberk | 0:83c0cb554099 | 45 | */ | 
| aberk | 0:83c0cb554099 | 46 | #define HMC6352_I2C_ADDRESS 0x21 //7-bit address. 0x43 write, 0x42 read. | 
| aberk | 0:83c0cb554099 | 47 | |
| aberk | 0:83c0cb554099 | 48 | //Commands. | 
| aberk | 0:83c0cb554099 | 49 | #define HMC6352_EEPROM_WRITE 0x77 | 
| aberk | 0:83c0cb554099 | 50 | #define HMC6352_EEPROM_READ 0x72 | 
| aberk | 0:83c0cb554099 | 51 | #define HMC6352_RAM_WRITE 0x47 | 
| aberk | 0:83c0cb554099 | 52 | #define HMC6352_RAM_READ 0x67 | 
| aberk | 0:83c0cb554099 | 53 | #define HMC6352_ENTER_SLEEP 0x53 | 
| aberk | 0:83c0cb554099 | 54 | #define HMC6352_EXIT_SLEEP 0x57 | 
| aberk | 0:83c0cb554099 | 55 | #define HMC6352_SET_RESET 0x4F | 
| aberk | 0:83c0cb554099 | 56 | #define HMC6352_ENTER_CALIB 0x43 | 
| aberk | 0:83c0cb554099 | 57 | #define HMC6352_EXIT_CALIB 0x45 | 
| aberk | 0:83c0cb554099 | 58 | #define HMC6352_SAVE_OPMODE 0x4C | 
| aberk | 0:83c0cb554099 | 59 | #define HMC6352_GET_DATA 0x41 | 
| aberk | 0:83c0cb554099 | 60 | |
| aberk | 0:83c0cb554099 | 61 | //EEPROM locations. | 
| aberk | 0:83c0cb554099 | 62 | #define HMC6352_SLAVE_ADDR 0x00 | 
| aberk | 0:83c0cb554099 | 63 | #define HMC6352_MX_OFF_MSB 0x01 | 
| aberk | 0:83c0cb554099 | 64 | #define HMC6352_MX_OFF_LSB 0x02 | 
| aberk | 0:83c0cb554099 | 65 | #define HMC6352_MY_OFF_MSB 0x03 | 
| aberk | 0:83c0cb554099 | 66 | #define HMC6352_MY_OFF_LSB 0x04 | 
| aberk | 0:83c0cb554099 | 67 | #define HMC6352_TIME_DELAY 0x05 | 
| aberk | 0:83c0cb554099 | 68 | #define HMC6352_SUMMED 0x06 | 
| aberk | 0:83c0cb554099 | 69 | #define HMC6352_SOFT_VER 0x07 | 
| aberk | 0:83c0cb554099 | 70 | #define HMC6352_OPMODE 0x08 | 
| aberk | 0:83c0cb554099 | 71 | |
| aberk | 0:83c0cb554099 | 72 | //RAM registers. | 
| aberk | 0:83c0cb554099 | 73 | #define HMC6352_RAM_OPMODE 0x74 | 
| aberk | 0:83c0cb554099 | 74 | #define HMC6352_RAM_OUTPUT 0x4E | 
| aberk | 0:83c0cb554099 | 75 | |
| aberk | 0:83c0cb554099 | 76 | #define HMC6352_MX_OFFSET 0x00 | 
| aberk | 0:83c0cb554099 | 77 | #define HMC6352_MY_OFFSET 0x01 | 
| aberk | 0:83c0cb554099 | 78 | |
| aberk | 0:83c0cb554099 | 79 | #define HMC6352_HEADING_MODE 0x00 | 
| aberk | 0:83c0cb554099 | 80 | #define HMC6352_RAWMAGX_MODE 0x01 | 
| aberk | 0:83c0cb554099 | 81 | #define HMC6352_RAWMAGY_MODE 0x02 | 
| aberk | 0:83c0cb554099 | 82 | #define HMC6352_MAGX_MODE 0x03 | 
| aberk | 0:83c0cb554099 | 83 | #define HMC6352_MAGY_MODE 0x04 | 
| aberk | 0:83c0cb554099 | 84 | |
| aberk | 0:83c0cb554099 | 85 | //Operational mode register masks. | 
| aberk | 0:83c0cb554099 | 86 | #define HMC6352_CM_MR_1HZ 0x00 | 
| aberk | 0:83c0cb554099 | 87 | #define HMC6352_CM_MR_5HZ 0x20 | 
| aberk | 0:83c0cb554099 | 88 | #define HMC6352_CM_MR_10HZ 0x40 | 
| aberk | 0:83c0cb554099 | 89 | #define HMC6352_CM_MR_20HZ 0x60 | 
| aberk | 0:83c0cb554099 | 90 | |
| aberk | 0:83c0cb554099 | 91 | #define HMC6352_PERIODIC_SR 0x10 | 
| aberk | 0:83c0cb554099 | 92 | |
| aberk | 0:83c0cb554099 | 93 | #define HMC6352_STANDBY 0x00 | 
| aberk | 0:83c0cb554099 | 94 | #define HMC6352_QUERY 0x01 | 
| aberk | 0:83c0cb554099 | 95 | #define HMC6352_CONTINUOUS 0x02 | 
| aberk | 0:83c0cb554099 | 96 | |
| aberk | 0:83c0cb554099 | 97 | /** | 
| aberk | 0:83c0cb554099 | 98 | * Honeywell HMC6352 digital compass. | 
| aberk | 0:83c0cb554099 | 99 | */ | 
| aberk | 0:83c0cb554099 | 100 | class HMC6352 { | 
| aberk | 0:83c0cb554099 | 101 | |
| aberk | 0:83c0cb554099 | 102 | public: | 
| aberk | 0:83c0cb554099 | 103 | |
| aberk | 0:83c0cb554099 | 104 | /** | 
| aberk | 0:83c0cb554099 | 105 | * Constructor. | 
| aberk | 0:83c0cb554099 | 106 | * | 
| aberk | 0:83c0cb554099 | 107 | * @param sda mbed pin to use for SDA line of I2C interface. | 
| aberk | 0:83c0cb554099 | 108 | * @param scl mbed pin to use for SCL line of I2C interface. | 
| aberk | 0:83c0cb554099 | 109 | */ | 
| aberk | 0:83c0cb554099 | 110 | HMC6352(PinName sda, PinName scl); | 
| aberk | 0:83c0cb554099 | 111 | |
| aberk | 0:83c0cb554099 | 112 | /** | 
| aberk | 0:83c0cb554099 | 113 | * Sample the device and return the result. | 
| aberk | 0:83c0cb554099 | 114 | * | 
| aberk | 0:83c0cb554099 | 115 | * @return In heading output mode, the current heading as a number between | 
| aberk | 0:83c0cb554099 | 116 | * 0-3599, representing 0-359.9 degrees. | 
| aberk | 0:83c0cb554099 | 117 | * In raw magnetometer X output mode, the raw output of the X-axis | 
| aberk | 0:83c0cb554099 | 118 | * magnetometer. | 
| aberk | 0:83c0cb554099 | 119 | * In raw magnetometer Y mode, the raw output of the Y-axis | 
| aberk | 0:83c0cb554099 | 120 | * magnetometer. | 
| aberk | 0:83c0cb554099 | 121 | * In magnetometer X mode, the corrected output of the X-axis | 
| aberk | 0:83c0cb554099 | 122 | * magnetometer. | 
| aberk | 0:83c0cb554099 | 123 | * In magnetometer Y mode, the corrected output of the Y-axis | 
| aberk | 0:83c0cb554099 | 124 | * magnetometer. | 
| aberk | 0:83c0cb554099 | 125 | */ | 
| aberk | 0:83c0cb554099 | 126 | int sample(void); | 
| aberk | 0:83c0cb554099 | 127 | |
| aberk | 0:83c0cb554099 | 128 | /** | 
| aberk | 0:83c0cb554099 | 129 | * Enter into or exit from sleep mode. | 
| aberk | 0:83c0cb554099 | 130 | * | 
| aberk | 0:83c0cb554099 | 131 | * @param enterOrExit 0x57 -> Exit sleep mode | 
| aberk | 0:83c0cb554099 | 132 | * 0x53 -> Enter | 
| aberk | 0:83c0cb554099 | 133 | */ | 
| aberk | 0:83c0cb554099 | 134 | void setSleepMode(int enterOrExit); | 
| aberk | 0:83c0cb554099 | 135 | |
| aberk | 0:83c0cb554099 | 136 | /** | 
| aberk | 0:83c0cb554099 | 137 | * Update bridge offsets. | 
| aberk | 0:83c0cb554099 | 138 | * | 
| aberk | 0:83c0cb554099 | 139 | * Performs a set/reset immediately. | 
| aberk | 0:83c0cb554099 | 140 | */ | 
| aberk | 0:83c0cb554099 | 141 | void setReset(void); | 
| aberk | 0:83c0cb554099 | 142 | |
| aberk | 0:83c0cb554099 | 143 | /** | 
| aberk | 0:83c0cb554099 | 144 | * Enter into or exit from calibration mode. | 
| aberk | 0:83c0cb554099 | 145 | * | 
| aberk | 0:83c0cb554099 | 146 | * @param enterOrExit 0x45 -> Exit | 
| aberk | 0:83c0cb554099 | 147 | * 0x43 -> Enter | 
| aberk | 0:83c0cb554099 | 148 | */ | 
| aberk | 0:83c0cb554099 | 149 | void setCalibrationMode(int enterOrExit); | 
| aberk | 0:83c0cb554099 | 150 | |
| aberk | 0:83c0cb554099 | 151 | /** | 
| aberk | 0:83c0cb554099 | 152 | * Save the current operation mode byte to EEPROM. | 
| aberk | 0:83c0cb554099 | 153 | */ | 
| aberk | 0:83c0cb554099 | 154 | void saveOpMode(void); | 
| aberk | 0:83c0cb554099 | 155 | |
| aberk | 0:83c0cb554099 | 156 | /** | 
| aberk | 0:83c0cb554099 | 157 | * Read the memory location on the device which contains the slave address. | 
| aberk | 0:83c0cb554099 | 158 | * | 
| aberk | 0:83c0cb554099 | 159 | * @return The slave address of the device. | 
| aberk | 0:83c0cb554099 | 160 | */ | 
| aberk | 0:83c0cb554099 | 161 | int getSlaveAddress(void); | 
| aberk | 0:83c0cb554099 | 162 | |
| aberk | 0:83c0cb554099 | 163 | /** | 
| aberk | 0:83c0cb554099 | 164 | * Read the current offset for X or Y axis magnetometer. | 
| aberk | 0:83c0cb554099 | 165 | * | 
| aberk | 0:83c0cb554099 | 166 | * @param axis 0x00 -> X-axis | 
| aberk | 0:83c0cb554099 | 167 | * 0x01 -> Y-axis | 
| aberk | 0:83c0cb554099 | 168 | * @return The current offset for the axis as a 16-bit number. | 
| aberk | 0:83c0cb554099 | 169 | */ | 
| aberk | 0:83c0cb554099 | 170 | int getOffset(int axis); | 
| aberk | 0:83c0cb554099 | 171 | |
| aberk | 0:83c0cb554099 | 172 | /** | 
| aberk | 0:83c0cb554099 | 173 | * Set the offset for X or Y axis magnetometer. | 
| aberk | 0:83c0cb554099 | 174 | * | 
| aberk | 0:83c0cb554099 | 175 | * @param axis 0x00 -> X-axis | 
| aberk | 0:83c0cb554099 | 176 | * 0x01 -> Y-axis | 
| aberk | 0:83c0cb554099 | 177 | * @param offset The offset to set for the axis (set to a 16-bit number). | 
| aberk | 0:83c0cb554099 | 178 | */ | 
| aberk | 0:83c0cb554099 | 179 | void setOffset(int axis, int offset); | 
| aberk | 0:83c0cb554099 | 180 | |
| aberk | 0:83c0cb554099 | 181 | /** | 
| aberk | 0:83c0cb554099 | 182 | * Get the current time delay. | 
| aberk | 0:83c0cb554099 | 183 | * | 
| aberk | 0:83c0cb554099 | 184 | * @return The time delay in milliseconds. | 
| aberk | 0:83c0cb554099 | 185 | */ | 
| aberk | 0:83c0cb554099 | 186 | int getTimeDelay(void); | 
| aberk | 0:83c0cb554099 | 187 | |
| aberk | 0:83c0cb554099 | 188 | /** | 
| aberk | 0:83c0cb554099 | 189 | * Set the time delay of the device. | 
| aberk | 0:83c0cb554099 | 190 | * | 
| aberk | 0:83c0cb554099 | 191 | * @param delay The time delay to set in milliseconds (between 0-255); | 
| aberk | 0:83c0cb554099 | 192 | */ | 
| aberk | 0:83c0cb554099 | 193 | void setTimeDelay(int delay); | 
| aberk | 0:83c0cb554099 | 194 | |
| aberk | 0:83c0cb554099 | 195 | /** | 
| aberk | 0:83c0cb554099 | 196 | * Get the number of measurements being summed each sample. | 
| aberk | 0:83c0cb554099 | 197 | * | 
| aberk | 0:83c0cb554099 | 198 | * @return The number of summed measurement. | 
| aberk | 0:83c0cb554099 | 199 | */ | 
| aberk | 0:83c0cb554099 | 200 | int getSumNumber(void); | 
| aberk | 0:83c0cb554099 | 201 | |
| aberk | 0:83c0cb554099 | 202 | /** | 
| aberk | 0:83c0cb554099 | 203 | * Set the number of measurements being summed each sample. | 
| aberk | 0:83c0cb554099 | 204 | * | 
| aberk | 0:83c0cb554099 | 205 | * @param sum The number of measurements to be summed (between 0-16); | 
| aberk | 0:83c0cb554099 | 206 | */ | 
| aberk | 0:83c0cb554099 | 207 | void setSumNumber(int sum); | 
| aberk | 0:83c0cb554099 | 208 | |
| aberk | 0:83c0cb554099 | 209 | /** | 
| aberk | 0:83c0cb554099 | 210 | * Get the software version on the device. | 
| aberk | 0:83c0cb554099 | 211 | * | 
| aberk | 0:83c0cb554099 | 212 | * @return The software version number. | 
| aberk | 0:83c0cb554099 | 213 | */ | 
| aberk | 0:83c0cb554099 | 214 | int getSoftwareVersion(void); | 
| aberk | 0:83c0cb554099 | 215 | |
| aberk | 0:83c0cb554099 | 216 | /** | 
| aberk | 0:83c0cb554099 | 217 | * Get the current operation mode. | 
| aberk | 0:83c0cb554099 | 218 | * | 
| aberk | 0:83c0cb554099 | 219 | * @return 0x00 -> Standby mode | 
| aberk | 0:83c0cb554099 | 220 | * 0x01 -> Query mode | 
| aberk | 0:83c0cb554099 | 221 | * 0x02 -> Continuous mode | 
| aberk | 0:83c0cb554099 | 222 | */ | 
| aberk | 0:83c0cb554099 | 223 | int getOpMode(void); | 
| aberk | 0:83c0cb554099 | 224 | |
| aberk | 0:83c0cb554099 | 225 | /** | 
| aberk | 0:83c0cb554099 | 226 | * Set the operation mode. | 
| aberk | 0:83c0cb554099 | 227 | * | 
| aberk | 0:83c0cb554099 | 228 | * @param mode 0x00 -> Standby mode | 
| aberk | 0:83c0cb554099 | 229 | * 0x01 -> Query mode | 
| aberk | 0:83c0cb554099 | 230 | * 0x02 -> Continuous mode | 
| aberk | 0:83c0cb554099 | 231 | * @param periodicSetReset 0x00 -> No periodic set/reset | 
| aberk | 0:83c0cb554099 | 232 | * 0x01 -> Periodic set/reset | 
| aberk | 0:83c0cb554099 | 233 | * @measurementRate Measurement rate in Hz for continuous rate. | 
| aberk | 0:83c0cb554099 | 234 | * Possible rates: {1, 5, 10, 20}Hz. | 
| aberk | 0:83c0cb554099 | 235 | */ | 
| aberk | 0:83c0cb554099 | 236 | void setOpMode(int mode, int periodicSetReset, int measurementRate = 0); | 
| aberk | 0:83c0cb554099 | 237 | |
| aberk | 0:83c0cb554099 | 238 | /** | 
| aberk | 0:83c0cb554099 | 239 | * Get the current output mode of the device. | 
| aberk | 0:83c0cb554099 | 240 | * | 
| aberk | 0:83c0cb554099 | 241 | * @return The current output mode. | 
| aberk | 0:83c0cb554099 | 242 | */ | 
| aberk | 0:83c0cb554099 | 243 | int getOutputMode(void); | 
| aberk | 0:83c0cb554099 | 244 | |
| aberk | 0:83c0cb554099 | 245 | /** | 
| aberk | 0:83c0cb554099 | 246 | * Set the output mode of the device. | 
| aberk | 0:83c0cb554099 | 247 | * | 
| aberk | 0:83c0cb554099 | 248 | * @param mode 0x00 -> Heading mode | 
| aberk | 0:83c0cb554099 | 249 | * 0x01 -> Raw magnetometer X mode | 
| aberk | 0:83c0cb554099 | 250 | * 0x02 -> Raw magnetometer Y mode | 
| aberk | 0:83c0cb554099 | 251 | * 0x03 -> Magnetometer X mode | 
| aberk | 0:83c0cb554099 | 252 | * 0x04 -> Magnetometer Y mode | 
| aberk | 0:83c0cb554099 | 253 | */ | 
| aberk | 0:83c0cb554099 | 254 | void setOutputMode(int mode); | 
| aberk | 0:83c0cb554099 | 255 | |
| aberk | 0:83c0cb554099 | 256 | private: | 
| aberk | 0:83c0cb554099 | 257 | |
| aberk | 0:83c0cb554099 | 258 | I2C* i2c_; | 
| aberk | 0:83c0cb554099 | 259 | int operationMode_; | 
| aberk | 0:83c0cb554099 | 260 | |
| aberk | 0:83c0cb554099 | 261 | /** | 
| aberk | 0:83c0cb554099 | 262 | * Write to EEPROM or RAM on the device. | 
| aberk | 0:83c0cb554099 | 263 | * | 
| aberk | 0:83c0cb554099 | 264 | * @param EepromOrRam 0x77 -> Writing to EEPROM | 
| aberk | 0:83c0cb554099 | 265 | * 0x47 -> Writing to RAM | 
| aberk | 0:83c0cb554099 | 266 | * @param address Address to write to. | 
| aberk | 0:83c0cb554099 | 267 | * @param data Data to write. | 
| aberk | 0:83c0cb554099 | 268 | */ | 
| aberk | 0:83c0cb554099 | 269 | void write(int EepromOrRam, int address, int data); | 
| aberk | 0:83c0cb554099 | 270 | |
| aberk | 0:83c0cb554099 | 271 | /** | 
| aberk | 0:83c0cb554099 | 272 | * Read EEPROM or RAM on the device. | 
| aberk | 0:83c0cb554099 | 273 | * | 
| aberk | 0:83c0cb554099 | 274 | * @param EepromOrRam 0x72 -> Reading from EEPROM | 
| aberk | 0:83c0cb554099 | 275 | * 0x67 -> Reading from RAM | 
| aberk | 0:83c0cb554099 | 276 | * @param address Address to read from. | 
| aberk | 0:83c0cb554099 | 277 | * @return The contents of the memory address. | 
| aberk | 0:83c0cb554099 | 278 | */ | 
| aberk | 0:83c0cb554099 | 279 | int read(int EepromOrRam, int address); | 
| aberk | 0:83c0cb554099 | 280 | |
| aberk | 0:83c0cb554099 | 281 | }; | 
| aberk | 0:83c0cb554099 | 282 | |
| aberk | 0:83c0cb554099 | 283 | #endif /* HMC6352_H */ |