ECE 4180 Project

Dependencies:   Camera_LS_Y201 SDFileSystem mbed

Fork of 4180_Final_Project by Paul Wilson

Committer:
lzzcd001
Date:
Thu Apr 30 19:01:22 2015 +0000
Revision:
1:dcd6c9be9e4b
ECE 4180 Project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lzzcd001 1:dcd6c9be9e4b 1 /**
lzzcd001 1:dcd6c9be9e4b 2 * @author Aaron Berk
lzzcd001 1:dcd6c9be9e4b 3 *
lzzcd001 1:dcd6c9be9e4b 4 * @section LICENSE
lzzcd001 1:dcd6c9be9e4b 5 *
lzzcd001 1:dcd6c9be9e4b 6 * Copyright (c) 2010 ARM Limited
lzzcd001 1:dcd6c9be9e4b 7 *
lzzcd001 1:dcd6c9be9e4b 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
lzzcd001 1:dcd6c9be9e4b 9 * of this software and associated documentation files (the "Software"), to deal
lzzcd001 1:dcd6c9be9e4b 10 * in the Software without restriction, including without limitation the rights
lzzcd001 1:dcd6c9be9e4b 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
lzzcd001 1:dcd6c9be9e4b 12 * copies of the Software, and to permit persons to whom the Software is
lzzcd001 1:dcd6c9be9e4b 13 * furnished to do so, subject to the following conditions:
lzzcd001 1:dcd6c9be9e4b 14 *
lzzcd001 1:dcd6c9be9e4b 15 * The above copyright notice and this permission notice shall be included in
lzzcd001 1:dcd6c9be9e4b 16 * all copies or substantial portions of the Software.
lzzcd001 1:dcd6c9be9e4b 17 *
lzzcd001 1:dcd6c9be9e4b 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
lzzcd001 1:dcd6c9be9e4b 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
lzzcd001 1:dcd6c9be9e4b 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
lzzcd001 1:dcd6c9be9e4b 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
lzzcd001 1:dcd6c9be9e4b 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
lzzcd001 1:dcd6c9be9e4b 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
lzzcd001 1:dcd6c9be9e4b 24 * THE SOFTWARE.
lzzcd001 1:dcd6c9be9e4b 25 *
lzzcd001 1:dcd6c9be9e4b 26 * @section DESCRIPTION
lzzcd001 1:dcd6c9be9e4b 27 *
lzzcd001 1:dcd6c9be9e4b 28 * Honeywell HMC6352 digital compass.
lzzcd001 1:dcd6c9be9e4b 29 *
lzzcd001 1:dcd6c9be9e4b 30 * Datasheet:
lzzcd001 1:dcd6c9be9e4b 31 *
lzzcd001 1:dcd6c9be9e4b 32 * http://www.ssec.honeywell.com/magnetic/datasheets/HMC6352.pdf
lzzcd001 1:dcd6c9be9e4b 33 */
lzzcd001 1:dcd6c9be9e4b 34
lzzcd001 1:dcd6c9be9e4b 35 /**
lzzcd001 1:dcd6c9be9e4b 36 * Includes
lzzcd001 1:dcd6c9be9e4b 37 */
lzzcd001 1:dcd6c9be9e4b 38 #include "HMC6352.h"
lzzcd001 1:dcd6c9be9e4b 39
lzzcd001 1:dcd6c9be9e4b 40 HMC6352::HMC6352(PinName sda, PinName scl) {
lzzcd001 1:dcd6c9be9e4b 41
lzzcd001 1:dcd6c9be9e4b 42 i2c_ = new I2C(sda, scl);
lzzcd001 1:dcd6c9be9e4b 43 //100KHz, as specified by the datasheet.
lzzcd001 1:dcd6c9be9e4b 44 i2c_->frequency(100000);
lzzcd001 1:dcd6c9be9e4b 45
lzzcd001 1:dcd6c9be9e4b 46 operationMode_ = getOpMode();
lzzcd001 1:dcd6c9be9e4b 47
lzzcd001 1:dcd6c9be9e4b 48 }
lzzcd001 1:dcd6c9be9e4b 49
lzzcd001 1:dcd6c9be9e4b 50 int HMC6352::sample(void) {
lzzcd001 1:dcd6c9be9e4b 51
lzzcd001 1:dcd6c9be9e4b 52 char tx[1];
lzzcd001 1:dcd6c9be9e4b 53 char rx[2];
lzzcd001 1:dcd6c9be9e4b 54
lzzcd001 1:dcd6c9be9e4b 55 if (operationMode_ == HMC6352_STANDBY || operationMode_ == HMC6352_QUERY) {
lzzcd001 1:dcd6c9be9e4b 56 tx[0] = HMC6352_GET_DATA;
lzzcd001 1:dcd6c9be9e4b 57
lzzcd001 1:dcd6c9be9e4b 58 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
lzzcd001 1:dcd6c9be9e4b 59 wait_ms(1);
lzzcd001 1:dcd6c9be9e4b 60 }
lzzcd001 1:dcd6c9be9e4b 61
lzzcd001 1:dcd6c9be9e4b 62 i2c_->read((HMC6352_I2C_ADDRESS << 1) | 0x01, rx, 2);
lzzcd001 1:dcd6c9be9e4b 63 wait_ms(1);
lzzcd001 1:dcd6c9be9e4b 64
lzzcd001 1:dcd6c9be9e4b 65 return (((int)rx[0] << 8) | (int)rx[1]);
lzzcd001 1:dcd6c9be9e4b 66
lzzcd001 1:dcd6c9be9e4b 67 }
lzzcd001 1:dcd6c9be9e4b 68
lzzcd001 1:dcd6c9be9e4b 69 void HMC6352::setSleepMode(int exitOrEnter) {
lzzcd001 1:dcd6c9be9e4b 70
lzzcd001 1:dcd6c9be9e4b 71 char tx[1];
lzzcd001 1:dcd6c9be9e4b 72
lzzcd001 1:dcd6c9be9e4b 73 tx[0] = exitOrEnter;
lzzcd001 1:dcd6c9be9e4b 74
lzzcd001 1:dcd6c9be9e4b 75 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
lzzcd001 1:dcd6c9be9e4b 76 wait_ms(1);
lzzcd001 1:dcd6c9be9e4b 77
lzzcd001 1:dcd6c9be9e4b 78 }
lzzcd001 1:dcd6c9be9e4b 79
lzzcd001 1:dcd6c9be9e4b 80 void HMC6352::setReset(void) {
lzzcd001 1:dcd6c9be9e4b 81
lzzcd001 1:dcd6c9be9e4b 82 char tx[1];
lzzcd001 1:dcd6c9be9e4b 83
lzzcd001 1:dcd6c9be9e4b 84 tx[0] = HMC6352_SET_RESET;
lzzcd001 1:dcd6c9be9e4b 85
lzzcd001 1:dcd6c9be9e4b 86 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
lzzcd001 1:dcd6c9be9e4b 87 wait_ms(7);
lzzcd001 1:dcd6c9be9e4b 88
lzzcd001 1:dcd6c9be9e4b 89 }
lzzcd001 1:dcd6c9be9e4b 90
lzzcd001 1:dcd6c9be9e4b 91 void HMC6352::setCalibrationMode(int exitOrEnter) {
lzzcd001 1:dcd6c9be9e4b 92
lzzcd001 1:dcd6c9be9e4b 93 char tx[1];
lzzcd001 1:dcd6c9be9e4b 94 int delay = 0;
lzzcd001 1:dcd6c9be9e4b 95
lzzcd001 1:dcd6c9be9e4b 96 tx[0] = exitOrEnter;
lzzcd001 1:dcd6c9be9e4b 97
lzzcd001 1:dcd6c9be9e4b 98 if (exitOrEnter == HMC6352_EXIT_CALIB) {
lzzcd001 1:dcd6c9be9e4b 99 delay = 15;
lzzcd001 1:dcd6c9be9e4b 100 } else if (exitOrEnter == HMC6352_ENTER_CALIB) {
lzzcd001 1:dcd6c9be9e4b 101 delay = 1;
lzzcd001 1:dcd6c9be9e4b 102 }
lzzcd001 1:dcd6c9be9e4b 103
lzzcd001 1:dcd6c9be9e4b 104 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
lzzcd001 1:dcd6c9be9e4b 105 wait_ms(delay);
lzzcd001 1:dcd6c9be9e4b 106
lzzcd001 1:dcd6c9be9e4b 107 }
lzzcd001 1:dcd6c9be9e4b 108
lzzcd001 1:dcd6c9be9e4b 109 void HMC6352::saveOpMode(void) {
lzzcd001 1:dcd6c9be9e4b 110
lzzcd001 1:dcd6c9be9e4b 111 char tx[1];
lzzcd001 1:dcd6c9be9e4b 112
lzzcd001 1:dcd6c9be9e4b 113 tx[0] = HMC6352_SAVE_OPMODE;
lzzcd001 1:dcd6c9be9e4b 114
lzzcd001 1:dcd6c9be9e4b 115 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
lzzcd001 1:dcd6c9be9e4b 116 wait_ms(1);
lzzcd001 1:dcd6c9be9e4b 117
lzzcd001 1:dcd6c9be9e4b 118 }
lzzcd001 1:dcd6c9be9e4b 119
lzzcd001 1:dcd6c9be9e4b 120 int HMC6352::getSlaveAddress(void) {
lzzcd001 1:dcd6c9be9e4b 121
lzzcd001 1:dcd6c9be9e4b 122 return read(HMC6352_EEPROM_READ, HMC6352_SLAVE_ADDR);
lzzcd001 1:dcd6c9be9e4b 123
lzzcd001 1:dcd6c9be9e4b 124 }
lzzcd001 1:dcd6c9be9e4b 125
lzzcd001 1:dcd6c9be9e4b 126 int HMC6352::getOffset(int axis) {
lzzcd001 1:dcd6c9be9e4b 127
lzzcd001 1:dcd6c9be9e4b 128 char rx[2] = {0x00, 0x00};
lzzcd001 1:dcd6c9be9e4b 129
lzzcd001 1:dcd6c9be9e4b 130 if (axis == HMC6352_MX_OFFSET) {
lzzcd001 1:dcd6c9be9e4b 131
lzzcd001 1:dcd6c9be9e4b 132 rx[0] = read(HMC6352_EEPROM_READ, HMC6352_MX_OFF_MSB);
lzzcd001 1:dcd6c9be9e4b 133 rx[1] = read(HMC6352_EEPROM_READ, HMC6352_MX_OFF_LSB);
lzzcd001 1:dcd6c9be9e4b 134
lzzcd001 1:dcd6c9be9e4b 135 } else if (axis == HMC6352_MY_OFFSET) {
lzzcd001 1:dcd6c9be9e4b 136
lzzcd001 1:dcd6c9be9e4b 137 rx[0] = read(HMC6352_EEPROM_READ, HMC6352_MY_OFF_MSB);
lzzcd001 1:dcd6c9be9e4b 138 rx[1] = read(HMC6352_EEPROM_READ, HMC6352_MY_OFF_LSB);
lzzcd001 1:dcd6c9be9e4b 139
lzzcd001 1:dcd6c9be9e4b 140 }
lzzcd001 1:dcd6c9be9e4b 141
lzzcd001 1:dcd6c9be9e4b 142 return ((rx[0] << 8) | (rx[1]));
lzzcd001 1:dcd6c9be9e4b 143
lzzcd001 1:dcd6c9be9e4b 144 }
lzzcd001 1:dcd6c9be9e4b 145
lzzcd001 1:dcd6c9be9e4b 146 void HMC6352::setOffset(int axis, int offset) {
lzzcd001 1:dcd6c9be9e4b 147
lzzcd001 1:dcd6c9be9e4b 148 char tx[2] = {0x00, 0x00};
lzzcd001 1:dcd6c9be9e4b 149
lzzcd001 1:dcd6c9be9e4b 150 tx[0] = (offset & 0x0000FF00) >> 8;
lzzcd001 1:dcd6c9be9e4b 151 tx[1] = (offset & 0x000000FF);
lzzcd001 1:dcd6c9be9e4b 152
lzzcd001 1:dcd6c9be9e4b 153 if (axis == HMC6352_MX_OFFSET) {
lzzcd001 1:dcd6c9be9e4b 154
lzzcd001 1:dcd6c9be9e4b 155 write(HMC6352_EEPROM_WRITE, HMC6352_MX_OFF_MSB, tx[0]);
lzzcd001 1:dcd6c9be9e4b 156 write(HMC6352_EEPROM_WRITE, HMC6352_MX_OFF_MSB, tx[1]);
lzzcd001 1:dcd6c9be9e4b 157
lzzcd001 1:dcd6c9be9e4b 158 } else if (axis == HMC6352_MY_OFFSET) {
lzzcd001 1:dcd6c9be9e4b 159
lzzcd001 1:dcd6c9be9e4b 160 write(HMC6352_EEPROM_WRITE, HMC6352_MY_OFF_MSB, tx[0]);
lzzcd001 1:dcd6c9be9e4b 161 write(HMC6352_EEPROM_WRITE, HMC6352_MY_OFF_MSB, tx[1]);
lzzcd001 1:dcd6c9be9e4b 162
lzzcd001 1:dcd6c9be9e4b 163 }
lzzcd001 1:dcd6c9be9e4b 164
lzzcd001 1:dcd6c9be9e4b 165 }
lzzcd001 1:dcd6c9be9e4b 166
lzzcd001 1:dcd6c9be9e4b 167 int HMC6352::getTimeDelay(void) {
lzzcd001 1:dcd6c9be9e4b 168
lzzcd001 1:dcd6c9be9e4b 169 return read(HMC6352_EEPROM_READ, HMC6352_TIME_DELAY);
lzzcd001 1:dcd6c9be9e4b 170
lzzcd001 1:dcd6c9be9e4b 171 }
lzzcd001 1:dcd6c9be9e4b 172
lzzcd001 1:dcd6c9be9e4b 173 void HMC6352::setTimeDelay(int delay) {
lzzcd001 1:dcd6c9be9e4b 174
lzzcd001 1:dcd6c9be9e4b 175 write(HMC6352_EEPROM_WRITE, HMC6352_TIME_DELAY, delay);
lzzcd001 1:dcd6c9be9e4b 176
lzzcd001 1:dcd6c9be9e4b 177 }
lzzcd001 1:dcd6c9be9e4b 178
lzzcd001 1:dcd6c9be9e4b 179 int HMC6352::getSumNumber(void) {
lzzcd001 1:dcd6c9be9e4b 180
lzzcd001 1:dcd6c9be9e4b 181 return read(HMC6352_EEPROM_READ, HMC6352_SUMMED);
lzzcd001 1:dcd6c9be9e4b 182
lzzcd001 1:dcd6c9be9e4b 183 }
lzzcd001 1:dcd6c9be9e4b 184
lzzcd001 1:dcd6c9be9e4b 185 void HMC6352::setSumNumber(int sum) {
lzzcd001 1:dcd6c9be9e4b 186
lzzcd001 1:dcd6c9be9e4b 187 write(HMC6352_EEPROM_WRITE, HMC6352_SUMMED, sum);
lzzcd001 1:dcd6c9be9e4b 188
lzzcd001 1:dcd6c9be9e4b 189 }
lzzcd001 1:dcd6c9be9e4b 190
lzzcd001 1:dcd6c9be9e4b 191 int HMC6352::getSoftwareVersion(void) {
lzzcd001 1:dcd6c9be9e4b 192
lzzcd001 1:dcd6c9be9e4b 193 return read(HMC6352_EEPROM_READ, HMC6352_SOFT_VER);
lzzcd001 1:dcd6c9be9e4b 194
lzzcd001 1:dcd6c9be9e4b 195 }
lzzcd001 1:dcd6c9be9e4b 196
lzzcd001 1:dcd6c9be9e4b 197 int HMC6352::getOpMode(void) {
lzzcd001 1:dcd6c9be9e4b 198
lzzcd001 1:dcd6c9be9e4b 199 int response = 0;
lzzcd001 1:dcd6c9be9e4b 200
lzzcd001 1:dcd6c9be9e4b 201 response = read(HMC6352_RAM_READ, HMC6352_RAM_OPMODE);
lzzcd001 1:dcd6c9be9e4b 202
lzzcd001 1:dcd6c9be9e4b 203 return (response & 0x00000003);
lzzcd001 1:dcd6c9be9e4b 204
lzzcd001 1:dcd6c9be9e4b 205 }
lzzcd001 1:dcd6c9be9e4b 206
lzzcd001 1:dcd6c9be9e4b 207 void HMC6352::setOpMode(int mode, int periodicSetReset, int measurementRate) {
lzzcd001 1:dcd6c9be9e4b 208
lzzcd001 1:dcd6c9be9e4b 209 char opModeByte = mode;
lzzcd001 1:dcd6c9be9e4b 210
lzzcd001 1:dcd6c9be9e4b 211 if (periodicSetReset == 1) {
lzzcd001 1:dcd6c9be9e4b 212 opModeByte |= HMC6352_PERIODIC_SR;
lzzcd001 1:dcd6c9be9e4b 213 }
lzzcd001 1:dcd6c9be9e4b 214
lzzcd001 1:dcd6c9be9e4b 215 if (measurementRate == 5) {
lzzcd001 1:dcd6c9be9e4b 216 opModeByte |= HMC6352_CM_MR_5HZ;
lzzcd001 1:dcd6c9be9e4b 217 } else if (measurementRate == 10) {
lzzcd001 1:dcd6c9be9e4b 218 opModeByte |= HMC6352_CM_MR_10HZ;
lzzcd001 1:dcd6c9be9e4b 219 } else if (measurementRate == 20) {
lzzcd001 1:dcd6c9be9e4b 220 opModeByte |= HMC6352_CM_MR_20HZ;
lzzcd001 1:dcd6c9be9e4b 221 }
lzzcd001 1:dcd6c9be9e4b 222
lzzcd001 1:dcd6c9be9e4b 223 write(HMC6352_RAM_WRITE, HMC6352_RAM_OPMODE, opModeByte);
lzzcd001 1:dcd6c9be9e4b 224 write(HMC6352_EEPROM_WRITE, HMC6352_OPMODE, opModeByte);
lzzcd001 1:dcd6c9be9e4b 225
lzzcd001 1:dcd6c9be9e4b 226 operationMode_ = mode;
lzzcd001 1:dcd6c9be9e4b 227
lzzcd001 1:dcd6c9be9e4b 228 }
lzzcd001 1:dcd6c9be9e4b 229
lzzcd001 1:dcd6c9be9e4b 230 int HMC6352::getOutputMode(void) {
lzzcd001 1:dcd6c9be9e4b 231
lzzcd001 1:dcd6c9be9e4b 232 return read(HMC6352_RAM_READ, HMC6352_RAM_OUTPUT);
lzzcd001 1:dcd6c9be9e4b 233
lzzcd001 1:dcd6c9be9e4b 234 }
lzzcd001 1:dcd6c9be9e4b 235
lzzcd001 1:dcd6c9be9e4b 236 void HMC6352::setOutputMode(int mode) {
lzzcd001 1:dcd6c9be9e4b 237
lzzcd001 1:dcd6c9be9e4b 238 write(HMC6352_RAM_WRITE, HMC6352_RAM_OUTPUT, mode);
lzzcd001 1:dcd6c9be9e4b 239
lzzcd001 1:dcd6c9be9e4b 240 }
lzzcd001 1:dcd6c9be9e4b 241
lzzcd001 1:dcd6c9be9e4b 242 void HMC6352::write(int EepromOrRam, int address, int data) {
lzzcd001 1:dcd6c9be9e4b 243
lzzcd001 1:dcd6c9be9e4b 244 char tx[3];
lzzcd001 1:dcd6c9be9e4b 245
lzzcd001 1:dcd6c9be9e4b 246 tx[0] = EepromOrRam;
lzzcd001 1:dcd6c9be9e4b 247 tx[1] = address;
lzzcd001 1:dcd6c9be9e4b 248 tx[2] = data;
lzzcd001 1:dcd6c9be9e4b 249
lzzcd001 1:dcd6c9be9e4b 250 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 3);
lzzcd001 1:dcd6c9be9e4b 251 wait_ms(1);
lzzcd001 1:dcd6c9be9e4b 252
lzzcd001 1:dcd6c9be9e4b 253 }
lzzcd001 1:dcd6c9be9e4b 254
lzzcd001 1:dcd6c9be9e4b 255 int HMC6352::read(int EepromOrRam, int address) {
lzzcd001 1:dcd6c9be9e4b 256
lzzcd001 1:dcd6c9be9e4b 257 char tx[2];
lzzcd001 1:dcd6c9be9e4b 258 char rx[1];
lzzcd001 1:dcd6c9be9e4b 259
lzzcd001 1:dcd6c9be9e4b 260 tx[0] = EepromOrRam;
lzzcd001 1:dcd6c9be9e4b 261 tx[1] = address;
lzzcd001 1:dcd6c9be9e4b 262
lzzcd001 1:dcd6c9be9e4b 263 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 2);
lzzcd001 1:dcd6c9be9e4b 264 wait_ms(1);
lzzcd001 1:dcd6c9be9e4b 265 i2c_->read((HMC6352_I2C_ADDRESS << 1) | 0x01, rx, 1);
lzzcd001 1:dcd6c9be9e4b 266 wait_ms(1);
lzzcd001 1:dcd6c9be9e4b 267
lzzcd001 1:dcd6c9be9e4b 268 return (rx[0]);
lzzcd001 1:dcd6c9be9e4b 269
lzzcd001 1:dcd6c9be9e4b 270 }