CanSat-C 2021 / HMC

Dependents:   CanSat-C_test test AvoidTest Run-Avoid

Committer:
miyajitakenari
Date:
Sat Nov 06 03:07:09 2021 +0000
Revision:
2:0a44cb78fd9a
Parent:
0:83c0cb554099
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aberk 0:83c0cb554099 1 #include "HMC6352.h"
aberk 0:83c0cb554099 2
aberk 0:83c0cb554099 3 HMC6352::HMC6352(PinName sda, PinName scl) {
aberk 0:83c0cb554099 4
aberk 0:83c0cb554099 5 i2c_ = new I2C(sda, scl);
aberk 0:83c0cb554099 6 //100KHz, as specified by the datasheet.
aberk 0:83c0cb554099 7 i2c_->frequency(100000);
aberk 0:83c0cb554099 8
aberk 0:83c0cb554099 9 operationMode_ = getOpMode();
aberk 0:83c0cb554099 10
aberk 0:83c0cb554099 11 }
aberk 0:83c0cb554099 12
aberk 0:83c0cb554099 13 int HMC6352::sample(void) {
aberk 0:83c0cb554099 14
aberk 0:83c0cb554099 15 char tx[1];
aberk 0:83c0cb554099 16 char rx[2];
aberk 0:83c0cb554099 17
aberk 0:83c0cb554099 18 if (operationMode_ == HMC6352_STANDBY || operationMode_ == HMC6352_QUERY) {
aberk 0:83c0cb554099 19 tx[0] = HMC6352_GET_DATA;
aberk 0:83c0cb554099 20
aberk 0:83c0cb554099 21 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
aberk 0:83c0cb554099 22 wait_ms(1);
aberk 0:83c0cb554099 23 }
aberk 0:83c0cb554099 24
aberk 0:83c0cb554099 25 i2c_->read((HMC6352_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:83c0cb554099 26 wait_ms(1);
aberk 0:83c0cb554099 27
aberk 0:83c0cb554099 28 return (((int)rx[0] << 8) | (int)rx[1]);
aberk 0:83c0cb554099 29
aberk 0:83c0cb554099 30 }
aberk 0:83c0cb554099 31
aberk 0:83c0cb554099 32 void HMC6352::setCalibrationMode(int exitOrEnter) {
aberk 0:83c0cb554099 33
aberk 0:83c0cb554099 34 char tx[1];
aberk 0:83c0cb554099 35 int delay = 0;
aberk 0:83c0cb554099 36
aberk 0:83c0cb554099 37 tx[0] = exitOrEnter;
aberk 0:83c0cb554099 38
aberk 0:83c0cb554099 39 if (exitOrEnter == HMC6352_EXIT_CALIB) {
aberk 0:83c0cb554099 40 delay = 15;
aberk 0:83c0cb554099 41 } else if (exitOrEnter == HMC6352_ENTER_CALIB) {
aberk 0:83c0cb554099 42 delay = 1;
aberk 0:83c0cb554099 43 }
aberk 0:83c0cb554099 44
aberk 0:83c0cb554099 45 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 1);
aberk 0:83c0cb554099 46 wait_ms(delay);
aberk 0:83c0cb554099 47
aberk 0:83c0cb554099 48 }
aberk 0:83c0cb554099 49
aberk 0:83c0cb554099 50 int HMC6352::getOpMode(void) {
aberk 0:83c0cb554099 51
aberk 0:83c0cb554099 52 int response = 0;
aberk 0:83c0cb554099 53
aberk 0:83c0cb554099 54 response = read(HMC6352_RAM_READ, HMC6352_RAM_OPMODE);
aberk 0:83c0cb554099 55
aberk 0:83c0cb554099 56 return (response & 0x00000003);
aberk 0:83c0cb554099 57
aberk 0:83c0cb554099 58 }
aberk 0:83c0cb554099 59
aberk 0:83c0cb554099 60 void HMC6352::setOpMode(int mode, int periodicSetReset, int measurementRate) {
aberk 0:83c0cb554099 61
aberk 0:83c0cb554099 62 char opModeByte = mode;
aberk 0:83c0cb554099 63
aberk 0:83c0cb554099 64 if (periodicSetReset == 1) {
aberk 0:83c0cb554099 65 opModeByte |= HMC6352_PERIODIC_SR;
aberk 0:83c0cb554099 66 }
aberk 0:83c0cb554099 67
aberk 0:83c0cb554099 68 if (measurementRate == 5) {
aberk 0:83c0cb554099 69 opModeByte |= HMC6352_CM_MR_5HZ;
aberk 0:83c0cb554099 70 } else if (measurementRate == 10) {
aberk 0:83c0cb554099 71 opModeByte |= HMC6352_CM_MR_10HZ;
aberk 0:83c0cb554099 72 } else if (measurementRate == 20) {
aberk 0:83c0cb554099 73 opModeByte |= HMC6352_CM_MR_20HZ;
aberk 0:83c0cb554099 74 }
aberk 0:83c0cb554099 75
aberk 0:83c0cb554099 76 write(HMC6352_RAM_WRITE, HMC6352_RAM_OPMODE, opModeByte);
aberk 0:83c0cb554099 77 write(HMC6352_EEPROM_WRITE, HMC6352_OPMODE, opModeByte);
aberk 0:83c0cb554099 78
aberk 0:83c0cb554099 79 operationMode_ = mode;
aberk 0:83c0cb554099 80
aberk 0:83c0cb554099 81 }
aberk 0:83c0cb554099 82
aberk 0:83c0cb554099 83 void HMC6352::write(int EepromOrRam, int address, int data) {
aberk 0:83c0cb554099 84
aberk 0:83c0cb554099 85 char tx[3];
aberk 0:83c0cb554099 86
aberk 0:83c0cb554099 87 tx[0] = EepromOrRam;
aberk 0:83c0cb554099 88 tx[1] = address;
aberk 0:83c0cb554099 89 tx[2] = data;
aberk 0:83c0cb554099 90
aberk 0:83c0cb554099 91 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 3);
aberk 0:83c0cb554099 92 wait_ms(1);
aberk 0:83c0cb554099 93
aberk 0:83c0cb554099 94 }
aberk 0:83c0cb554099 95
aberk 0:83c0cb554099 96 int HMC6352::read(int EepromOrRam, int address) {
aberk 0:83c0cb554099 97
aberk 0:83c0cb554099 98 char tx[2];
aberk 0:83c0cb554099 99 char rx[1];
aberk 0:83c0cb554099 100
aberk 0:83c0cb554099 101 tx[0] = EepromOrRam;
aberk 0:83c0cb554099 102 tx[1] = address;
aberk 0:83c0cb554099 103
aberk 0:83c0cb554099 104 i2c_->write((HMC6352_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:83c0cb554099 105 wait_ms(1);
aberk 0:83c0cb554099 106 i2c_->read((HMC6352_I2C_ADDRESS << 1) | 0x01, rx, 1);
aberk 0:83c0cb554099 107 wait_ms(1);
aberk 0:83c0cb554099 108
aberk 0:83c0cb554099 109 return (rx[0]);
aberk 0:83c0cb554099 110
aberk 0:83c0cb554099 111 }