User | Revision | Line number | New contents of line |
mcm |
2:e02c2a91d2ea
|
1
|
/**
|
mcm |
2:e02c2a91d2ea
|
2
|
* @brief HMC5883L.h
|
mcm |
2:e02c2a91d2ea
|
3
|
* @details 3-Axis Digital Compass IC.
|
mcm |
2:e02c2a91d2ea
|
4
|
* Functions file.
|
mcm |
2:e02c2a91d2ea
|
5
|
*
|
mcm |
2:e02c2a91d2ea
|
6
|
*
|
mcm |
2:e02c2a91d2ea
|
7
|
* @return NA
|
mcm |
2:e02c2a91d2ea
|
8
|
*
|
mcm |
2:e02c2a91d2ea
|
9
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
10
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
11
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
12
|
* @pre NaN.
|
mcm |
2:e02c2a91d2ea
|
13
|
* @warning NaN
|
mcm |
2:e02c2a91d2ea
|
14
|
* @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
|
mcm |
2:e02c2a91d2ea
|
15
|
*/
|
mcm |
2:e02c2a91d2ea
|
16
|
|
mcm |
2:e02c2a91d2ea
|
17
|
#include "HMC5883L.h"
|
mcm |
2:e02c2a91d2ea
|
18
|
|
mcm |
2:e02c2a91d2ea
|
19
|
|
mcm |
2:e02c2a91d2ea
|
20
|
HMC5883L::HMC5883L ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
|
mcm |
2:e02c2a91d2ea
|
21
|
: _i2c ( sda, scl )
|
mcm |
2:e02c2a91d2ea
|
22
|
, _HMC5883L_Addr ( addr )
|
mcm |
2:e02c2a91d2ea
|
23
|
{
|
mcm |
2:e02c2a91d2ea
|
24
|
_i2c.frequency( freq );
|
mcm |
2:e02c2a91d2ea
|
25
|
}
|
mcm |
2:e02c2a91d2ea
|
26
|
|
mcm |
2:e02c2a91d2ea
|
27
|
|
mcm |
2:e02c2a91d2ea
|
28
|
HMC5883L::~HMC5883L()
|
mcm |
2:e02c2a91d2ea
|
29
|
{
|
mcm |
2:e02c2a91d2ea
|
30
|
}
|
mcm |
2:e02c2a91d2ea
|
31
|
|
mcm |
2:e02c2a91d2ea
|
32
|
|
mcm |
2:e02c2a91d2ea
|
33
|
|
mcm |
2:e02c2a91d2ea
|
34
|
/**
|
mcm |
2:e02c2a91d2ea
|
35
|
* @brief HMC5883L_Conf ( HMC5883L_register_list_t , HMC5883L_conf_reg_a_samples_t , HMC5883L_conf_reg_a_dor_t , HMC5883L_conf_reg_a_measurement_mode_t
|
mcm |
2:e02c2a91d2ea
|
36
|
* HMC5883L_conf_reg_b_gain_t , HMC5883L_mode_register_high_speed_t , HMC5883L_mode_register_operation_mode_t )
|
mcm |
2:e02c2a91d2ea
|
37
|
*
|
mcm |
2:e02c2a91d2ea
|
38
|
* @details It configures the device.
|
mcm |
2:e02c2a91d2ea
|
39
|
*
|
mcm |
2:e02c2a91d2ea
|
40
|
* @param[in] mySamples: Number of average samples.
|
mcm |
2:e02c2a91d2ea
|
41
|
* @param[in] myDataRate: Data output rate.
|
mcm |
2:e02c2a91d2ea
|
42
|
* @param[in] myMeasurementMode: Measurement mode.
|
mcm |
2:e02c2a91d2ea
|
43
|
* @param[in] myGain: Gain.
|
mcm |
2:e02c2a91d2ea
|
44
|
* @param[in] myI2CMode: I2C High Speed / Normal speed.
|
mcm |
2:e02c2a91d2ea
|
45
|
* @param[in] myOperationMode: Operation mode.
|
mcm |
2:e02c2a91d2ea
|
46
|
*
|
mcm |
2:e02c2a91d2ea
|
47
|
* @param[out] NaN.
|
mcm |
2:e02c2a91d2ea
|
48
|
*
|
mcm |
2:e02c2a91d2ea
|
49
|
*
|
mcm |
2:e02c2a91d2ea
|
50
|
* @return Status of HMC5883L_Conf.
|
mcm |
2:e02c2a91d2ea
|
51
|
*
|
mcm |
2:e02c2a91d2ea
|
52
|
*
|
mcm |
2:e02c2a91d2ea
|
53
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
54
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
55
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
56
|
* @pre NaN
|
mcm |
2:e02c2a91d2ea
|
57
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
58
|
*/
|
mcm |
2:e02c2a91d2ea
|
59
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_Conf ( HMC5883L_conf_reg_a_samples_t mySamples, HMC5883L_conf_reg_a_dor_t myDataRate, HMC5883L_conf_reg_a_measurement_mode_t myMeasurementMode,
|
mcm |
2:e02c2a91d2ea
|
60
|
HMC5883L_conf_reg_b_gain_t myGain, HMC5883L_mode_register_high_speed_t myI2CMode, HMC5883L_mode_register_operation_mode_t myOperationMode )
|
mcm |
2:e02c2a91d2ea
|
61
|
{
|
mcm |
2:e02c2a91d2ea
|
62
|
char cmd[] = { 0, 0 };
|
mcm |
2:e02c2a91d2ea
|
63
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
64
|
|
mcm |
2:e02c2a91d2ea
|
65
|
|
mcm |
2:e02c2a91d2ea
|
66
|
// CONFIGURATION REGISTER A
|
mcm |
2:e02c2a91d2ea
|
67
|
cmd[0] = HMC5883L_CONFIGURATION_REGISTER_A;
|
mcm |
2:e02c2a91d2ea
|
68
|
|
mcm |
2:e02c2a91d2ea
|
69
|
// Number of Samples Averaged
|
mcm |
2:e02c2a91d2ea
|
70
|
cmd[1] = mySamples;
|
mcm |
2:e02c2a91d2ea
|
71
|
|
mcm |
2:e02c2a91d2ea
|
72
|
// Data Output Rate Bits
|
mcm |
2:e02c2a91d2ea
|
73
|
cmd[1] |= myDataRate;
|
mcm |
2:e02c2a91d2ea
|
74
|
|
mcm |
2:e02c2a91d2ea
|
75
|
// Measurement Configuration Bits
|
mcm |
2:e02c2a91d2ea
|
76
|
cmd[1] |= myMeasurementMode;
|
mcm |
2:e02c2a91d2ea
|
77
|
|
mcm |
2:e02c2a91d2ea
|
78
|
|
mcm |
2:e02c2a91d2ea
|
79
|
// Write the command to Configuration Register A
|
mcm |
2:e02c2a91d2ea
|
80
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
|
mcm |
2:e02c2a91d2ea
|
81
|
|
mcm |
2:e02c2a91d2ea
|
82
|
|
mcm |
2:e02c2a91d2ea
|
83
|
|
mcm |
2:e02c2a91d2ea
|
84
|
// CONFIGURATION REGISTER A
|
mcm |
2:e02c2a91d2ea
|
85
|
cmd[0] = HMC5883L_CONFIGURATION_REGISTER_B;
|
mcm |
2:e02c2a91d2ea
|
86
|
|
mcm |
2:e02c2a91d2ea
|
87
|
// Gain Configuration Bits
|
mcm |
2:e02c2a91d2ea
|
88
|
cmd[1] = myGain;
|
mcm |
2:e02c2a91d2ea
|
89
|
|
mcm |
2:e02c2a91d2ea
|
90
|
// Write the command to Configuration Register B
|
mcm |
2:e02c2a91d2ea
|
91
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
|
mcm |
2:e02c2a91d2ea
|
92
|
|
mcm |
2:e02c2a91d2ea
|
93
|
|
mcm |
2:e02c2a91d2ea
|
94
|
|
mcm |
2:e02c2a91d2ea
|
95
|
// MODE REGISTER
|
mcm |
2:e02c2a91d2ea
|
96
|
cmd[0] = HMC5883L_MODE_REGISTER;
|
mcm |
2:e02c2a91d2ea
|
97
|
|
mcm |
2:e02c2a91d2ea
|
98
|
// High Speed I2C, 3400kHz
|
mcm |
2:e02c2a91d2ea
|
99
|
cmd[1] = myI2CMode;
|
mcm |
2:e02c2a91d2ea
|
100
|
|
mcm |
2:e02c2a91d2ea
|
101
|
// Mode Select Bits
|
mcm |
2:e02c2a91d2ea
|
102
|
cmd[1] |= myOperationMode;
|
mcm |
2:e02c2a91d2ea
|
103
|
|
mcm |
2:e02c2a91d2ea
|
104
|
|
mcm |
2:e02c2a91d2ea
|
105
|
// Write the command to Mode Register
|
mcm |
2:e02c2a91d2ea
|
106
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
|
mcm |
2:e02c2a91d2ea
|
107
|
|
mcm |
2:e02c2a91d2ea
|
108
|
|
mcm |
2:e02c2a91d2ea
|
109
|
|
mcm |
2:e02c2a91d2ea
|
110
|
|
mcm |
2:e02c2a91d2ea
|
111
|
|
mcm |
2:e02c2a91d2ea
|
112
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
113
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
114
|
else
|
mcm |
2:e02c2a91d2ea
|
115
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
116
|
}
|
mcm |
2:e02c2a91d2ea
|
117
|
|
mcm |
2:e02c2a91d2ea
|
118
|
|
mcm |
2:e02c2a91d2ea
|
119
|
|
mcm |
2:e02c2a91d2ea
|
120
|
/**
|
mcm |
2:e02c2a91d2ea
|
121
|
* @brief HMC5883L_GetIdentificationRegister ( HMC5883L_register_list_t , HMC5883L_vector_data_t* )
|
mcm |
2:e02c2a91d2ea
|
122
|
*
|
mcm |
2:e02c2a91d2ea
|
123
|
* @details It gets the identification register.
|
mcm |
2:e02c2a91d2ea
|
124
|
*
|
mcm |
2:e02c2a91d2ea
|
125
|
* @param[in] myID_reg: Identification register to be read.
|
mcm |
2:e02c2a91d2ea
|
126
|
*
|
mcm |
2:e02c2a91d2ea
|
127
|
* @param[out] myID: Identification register value.
|
mcm |
2:e02c2a91d2ea
|
128
|
*
|
mcm |
2:e02c2a91d2ea
|
129
|
*
|
mcm |
2:e02c2a91d2ea
|
130
|
* @return Status of HMC5883L_GetIdentificationRegister.
|
mcm |
2:e02c2a91d2ea
|
131
|
*
|
mcm |
2:e02c2a91d2ea
|
132
|
*
|
mcm |
2:e02c2a91d2ea
|
133
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
134
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
135
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
136
|
* @pre NaN
|
mcm |
2:e02c2a91d2ea
|
137
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
138
|
*/
|
mcm |
2:e02c2a91d2ea
|
139
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_GetIdentificationRegister ( HMC5883L_register_list_t myID_reg, HMC5883L_vector_data_t* myID )
|
mcm |
2:e02c2a91d2ea
|
140
|
{
|
mcm |
2:e02c2a91d2ea
|
141
|
char cmd = 0;
|
mcm |
2:e02c2a91d2ea
|
142
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
143
|
|
mcm |
2:e02c2a91d2ea
|
144
|
|
mcm |
2:e02c2a91d2ea
|
145
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
146
|
cmd = myID_reg;
|
mcm |
2:e02c2a91d2ea
|
147
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd, 1, true );
|
mcm |
2:e02c2a91d2ea
|
148
|
|
mcm |
2:e02c2a91d2ea
|
149
|
// Read the data
|
mcm |
2:e02c2a91d2ea
|
150
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd, 1 );
|
mcm |
2:e02c2a91d2ea
|
151
|
|
mcm |
2:e02c2a91d2ea
|
152
|
|
mcm |
2:e02c2a91d2ea
|
153
|
|
mcm |
2:e02c2a91d2ea
|
154
|
// Choose which ID was requested
|
mcm |
2:e02c2a91d2ea
|
155
|
switch ( myID_reg )
|
mcm |
2:e02c2a91d2ea
|
156
|
{
|
mcm |
2:e02c2a91d2ea
|
157
|
case HMC5883L_IDENTIFICATION_REGISTER_A:
|
mcm |
2:e02c2a91d2ea
|
158
|
myID->IdentificationRegisterA = cmd;
|
mcm |
2:e02c2a91d2ea
|
159
|
break;
|
mcm |
2:e02c2a91d2ea
|
160
|
|
mcm |
2:e02c2a91d2ea
|
161
|
case HMC5883L_IDENTIFICATION_REGISTER_B:
|
mcm |
2:e02c2a91d2ea
|
162
|
myID->IdentificationRegisterB = cmd;
|
mcm |
2:e02c2a91d2ea
|
163
|
break;
|
mcm |
2:e02c2a91d2ea
|
164
|
|
mcm |
2:e02c2a91d2ea
|
165
|
case HMC5883L_IDENTIFICATION_REGISTER_C:
|
mcm |
2:e02c2a91d2ea
|
166
|
myID->IdentificationRegisterC = cmd;
|
mcm |
2:e02c2a91d2ea
|
167
|
break;
|
mcm |
2:e02c2a91d2ea
|
168
|
|
mcm |
2:e02c2a91d2ea
|
169
|
default:
|
mcm |
2:e02c2a91d2ea
|
170
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
171
|
}
|
mcm |
2:e02c2a91d2ea
|
172
|
|
mcm |
2:e02c2a91d2ea
|
173
|
|
mcm |
2:e02c2a91d2ea
|
174
|
|
mcm |
2:e02c2a91d2ea
|
175
|
|
mcm |
2:e02c2a91d2ea
|
176
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
177
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
178
|
else
|
mcm |
2:e02c2a91d2ea
|
179
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
180
|
}
|
mcm |
2:e02c2a91d2ea
|
181
|
|
mcm |
2:e02c2a91d2ea
|
182
|
|
mcm |
2:e02c2a91d2ea
|
183
|
|
mcm |
2:e02c2a91d2ea
|
184
|
/**
|
mcm |
2:e02c2a91d2ea
|
185
|
* @brief HMC5883L_GetRawDataOutput ( HMC5883L_vector_data_t* )
|
mcm |
2:e02c2a91d2ea
|
186
|
*
|
mcm |
2:e02c2a91d2ea
|
187
|
* @details It gets X, Y and Z raw data output.
|
mcm |
2:e02c2a91d2ea
|
188
|
*
|
mcm |
2:e02c2a91d2ea
|
189
|
*
|
mcm |
2:e02c2a91d2ea
|
190
|
* @param[out] myData: X, Y and Z raw data output.
|
mcm |
2:e02c2a91d2ea
|
191
|
*
|
mcm |
2:e02c2a91d2ea
|
192
|
*
|
mcm |
2:e02c2a91d2ea
|
193
|
* @return Status of HMC5883L_GetRawDataOutput.
|
mcm |
2:e02c2a91d2ea
|
194
|
*
|
mcm |
2:e02c2a91d2ea
|
195
|
*
|
mcm |
2:e02c2a91d2ea
|
196
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
197
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
198
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
199
|
* @pre NaN
|
mcm |
2:e02c2a91d2ea
|
200
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
201
|
*/
|
mcm |
2:e02c2a91d2ea
|
202
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_GetRawDataOutput ( HMC5883L_vector_data_t* myData )
|
mcm |
2:e02c2a91d2ea
|
203
|
{
|
mcm |
2:e02c2a91d2ea
|
204
|
char cmd[] = { HMC5883L_DATA_OUTPUT_X_MSB, 0, 0, 0, 0, 0 };
|
mcm |
2:e02c2a91d2ea
|
205
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
206
|
|
mcm |
2:e02c2a91d2ea
|
207
|
|
mcm |
2:e02c2a91d2ea
|
208
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
209
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
|
mcm |
2:e02c2a91d2ea
|
210
|
|
mcm |
2:e02c2a91d2ea
|
211
|
// Read all data
|
mcm |
2:e02c2a91d2ea
|
212
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd[0], 6 );
|
mcm |
2:e02c2a91d2ea
|
213
|
|
mcm |
2:e02c2a91d2ea
|
214
|
|
mcm |
2:e02c2a91d2ea
|
215
|
// Parse the data
|
mcm |
2:e02c2a91d2ea
|
216
|
myData->DataOutput_X = ( ( int16_t )( cmd[0] << 8 ) | ( int16_t )cmd[1] );
|
mcm |
2:e02c2a91d2ea
|
217
|
myData->DataOutput_Y = ( ( int16_t )( cmd[2] << 8 ) | ( int16_t )cmd[3] );
|
mcm |
2:e02c2a91d2ea
|
218
|
myData->DataOutput_Z = ( ( int16_t )( cmd[4] << 8 ) | ( int16_t )cmd[5] );
|
mcm |
2:e02c2a91d2ea
|
219
|
|
mcm |
2:e02c2a91d2ea
|
220
|
|
mcm |
2:e02c2a91d2ea
|
221
|
|
mcm |
2:e02c2a91d2ea
|
222
|
|
mcm |
2:e02c2a91d2ea
|
223
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
224
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
225
|
else
|
mcm |
2:e02c2a91d2ea
|
226
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
227
|
}
|
mcm |
2:e02c2a91d2ea
|
228
|
|
mcm |
2:e02c2a91d2ea
|
229
|
|
mcm |
2:e02c2a91d2ea
|
230
|
|
mcm |
2:e02c2a91d2ea
|
231
|
/**
|
mcm |
2:e02c2a91d2ea
|
232
|
* @brief HMC5883L_GetCompensatedDataOutput ( HMC5883L_vector_data_t* , float , float , float )
|
mcm |
2:e02c2a91d2ea
|
233
|
*
|
mcm |
2:e02c2a91d2ea
|
234
|
* @details It gets X, Y and Z compensated data output.
|
mcm |
2:e02c2a91d2ea
|
235
|
*
|
mcm |
2:e02c2a91d2ea
|
236
|
* @param[in] myXOffset: X-axis Offset.
|
mcm |
2:e02c2a91d2ea
|
237
|
* @param[in] myYOffset: Y-axis Offset.
|
mcm |
2:e02c2a91d2ea
|
238
|
* @param[in] myZOffset: Z-axis Offset.
|
mcm |
2:e02c2a91d2ea
|
239
|
*
|
mcm |
2:e02c2a91d2ea
|
240
|
* @param[out] myData: X, Y and Z compensated data output.
|
mcm |
2:e02c2a91d2ea
|
241
|
*
|
mcm |
2:e02c2a91d2ea
|
242
|
*
|
mcm |
2:e02c2a91d2ea
|
243
|
* @return Status of HMC5883L_GetCompensatedDataOutput.
|
mcm |
2:e02c2a91d2ea
|
244
|
*
|
mcm |
2:e02c2a91d2ea
|
245
|
*
|
mcm |
2:e02c2a91d2ea
|
246
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
247
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
248
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
249
|
* @pre The offset MUST be calculated previously, this driver does NOT support that functionality yet.
|
mcm |
2:e02c2a91d2ea
|
250
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
251
|
*/
|
mcm |
2:e02c2a91d2ea
|
252
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_GetCompensatedDataOutput ( HMC5883L_vector_data_t* myData, float myXOffset, float myYOffset, float myZOffset )
|
mcm |
2:e02c2a91d2ea
|
253
|
{
|
mcm |
2:e02c2a91d2ea
|
254
|
char cmd[] = { 0, 0, 0, 0, 0, 0 };
|
mcm |
2:e02c2a91d2ea
|
255
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
256
|
float myGain = 0.0;
|
mcm |
2:e02c2a91d2ea
|
257
|
|
mcm |
2:e02c2a91d2ea
|
258
|
|
mcm |
2:e02c2a91d2ea
|
259
|
|
mcm |
2:e02c2a91d2ea
|
260
|
// GET THE CURRENT GAIN
|
mcm |
2:e02c2a91d2ea
|
261
|
cmd[0] = HMC5883L_CONFIGURATION_REGISTER_B;
|
mcm |
2:e02c2a91d2ea
|
262
|
|
mcm |
2:e02c2a91d2ea
|
263
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
264
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
|
mcm |
2:e02c2a91d2ea
|
265
|
|
mcm |
2:e02c2a91d2ea
|
266
|
// Read the register
|
mcm |
2:e02c2a91d2ea
|
267
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd[0], 1 );
|
mcm |
2:e02c2a91d2ea
|
268
|
|
mcm |
2:e02c2a91d2ea
|
269
|
|
mcm |
2:e02c2a91d2ea
|
270
|
// Check which gain is in use
|
mcm |
2:e02c2a91d2ea
|
271
|
switch ( ( cmd[0] & CONF_REG_B_GAIN_MASK ) )
|
mcm |
2:e02c2a91d2ea
|
272
|
{
|
mcm |
2:e02c2a91d2ea
|
273
|
case CONF_REG_B_GAIN_0_88_GA:
|
mcm |
2:e02c2a91d2ea
|
274
|
myGain = 0.73;
|
mcm |
2:e02c2a91d2ea
|
275
|
break;
|
mcm |
2:e02c2a91d2ea
|
276
|
|
mcm |
2:e02c2a91d2ea
|
277
|
case CONF_REG_B_GAIN_1_3_GA:
|
mcm |
2:e02c2a91d2ea
|
278
|
myGain = 0.92;
|
mcm |
2:e02c2a91d2ea
|
279
|
break;
|
mcm |
2:e02c2a91d2ea
|
280
|
|
mcm |
2:e02c2a91d2ea
|
281
|
case CONF_REG_B_GAIN_1_9_GA:
|
mcm |
2:e02c2a91d2ea
|
282
|
myGain = 1.22;
|
mcm |
2:e02c2a91d2ea
|
283
|
break;
|
mcm |
2:e02c2a91d2ea
|
284
|
|
mcm |
2:e02c2a91d2ea
|
285
|
case CONF_REG_B_GAIN_2_5_GA:
|
mcm |
2:e02c2a91d2ea
|
286
|
myGain = 1.52;
|
mcm |
2:e02c2a91d2ea
|
287
|
break;
|
mcm |
2:e02c2a91d2ea
|
288
|
|
mcm |
2:e02c2a91d2ea
|
289
|
case CONF_REG_B_GAIN_4_0_GA:
|
mcm |
2:e02c2a91d2ea
|
290
|
myGain = 2.27;
|
mcm |
2:e02c2a91d2ea
|
291
|
break;
|
mcm |
2:e02c2a91d2ea
|
292
|
|
mcm |
2:e02c2a91d2ea
|
293
|
case CONF_REG_B_GAIN_4_7_GA:
|
mcm |
2:e02c2a91d2ea
|
294
|
myGain = 2.56;
|
mcm |
2:e02c2a91d2ea
|
295
|
break;
|
mcm |
2:e02c2a91d2ea
|
296
|
|
mcm |
2:e02c2a91d2ea
|
297
|
case CONF_REG_B_GAIN_5_6_GA:
|
mcm |
2:e02c2a91d2ea
|
298
|
myGain = 3.03;
|
mcm |
2:e02c2a91d2ea
|
299
|
break;
|
mcm |
2:e02c2a91d2ea
|
300
|
|
mcm |
2:e02c2a91d2ea
|
301
|
case CONF_REG_B_GAIN_8_1_GA:
|
mcm |
2:e02c2a91d2ea
|
302
|
myGain = 4.35;
|
mcm |
2:e02c2a91d2ea
|
303
|
break;
|
mcm |
2:e02c2a91d2ea
|
304
|
|
mcm |
2:e02c2a91d2ea
|
305
|
default:
|
mcm |
2:e02c2a91d2ea
|
306
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
307
|
}
|
mcm |
2:e02c2a91d2ea
|
308
|
|
mcm |
2:e02c2a91d2ea
|
309
|
|
mcm |
2:e02c2a91d2ea
|
310
|
// READ THE ACTUAL DATA OUTPUT
|
mcm |
2:e02c2a91d2ea
|
311
|
cmd[0] = HMC5883L_DATA_OUTPUT_X_MSB;
|
mcm |
2:e02c2a91d2ea
|
312
|
|
mcm |
2:e02c2a91d2ea
|
313
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
314
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
|
mcm |
2:e02c2a91d2ea
|
315
|
|
mcm |
2:e02c2a91d2ea
|
316
|
// Read all data
|
mcm |
2:e02c2a91d2ea
|
317
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd[0], 6 );
|
mcm |
2:e02c2a91d2ea
|
318
|
|
mcm |
2:e02c2a91d2ea
|
319
|
|
mcm |
2:e02c2a91d2ea
|
320
|
// Parse the data
|
mcm |
2:e02c2a91d2ea
|
321
|
myData->DataOutput_X = ( ( ( int16_t )( cmd[0] << 8 ) | ( int16_t )cmd[1] ) * myGain ) - myXOffset;
|
mcm |
2:e02c2a91d2ea
|
322
|
myData->DataOutput_Y = ( ( ( int16_t )( cmd[2] << 8 ) | ( int16_t )cmd[3] ) * myGain ) - myYOffset;
|
mcm |
2:e02c2a91d2ea
|
323
|
myData->DataOutput_Z = ( ( ( int16_t )( cmd[4] << 8 ) | ( int16_t )cmd[5] ) * myGain ) - myZOffset;
|
mcm |
2:e02c2a91d2ea
|
324
|
|
mcm |
2:e02c2a91d2ea
|
325
|
|
mcm |
2:e02c2a91d2ea
|
326
|
|
mcm |
2:e02c2a91d2ea
|
327
|
|
mcm |
2:e02c2a91d2ea
|
328
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
329
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
330
|
else
|
mcm |
2:e02c2a91d2ea
|
331
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
332
|
}
|
mcm |
2:e02c2a91d2ea
|
333
|
|
mcm |
2:e02c2a91d2ea
|
334
|
|
mcm |
2:e02c2a91d2ea
|
335
|
|
mcm |
2:e02c2a91d2ea
|
336
|
/**
|
mcm |
2:e02c2a91d2ea
|
337
|
* @brief HMC5883L_GetStatus ( HMC5883L_vector_data_t* )
|
mcm |
2:e02c2a91d2ea
|
338
|
*
|
mcm |
2:e02c2a91d2ea
|
339
|
* @details It reads the status register.
|
mcm |
2:e02c2a91d2ea
|
340
|
*
|
mcm |
2:e02c2a91d2ea
|
341
|
* @param[in] NaN
|
mcm |
2:e02c2a91d2ea
|
342
|
*
|
mcm |
2:e02c2a91d2ea
|
343
|
* @param[out] myStatus: Current status of the device.
|
mcm |
2:e02c2a91d2ea
|
344
|
*
|
mcm |
2:e02c2a91d2ea
|
345
|
*
|
mcm |
2:e02c2a91d2ea
|
346
|
* @return Status of HMC5883L_GetStatus.
|
mcm |
2:e02c2a91d2ea
|
347
|
*
|
mcm |
2:e02c2a91d2ea
|
348
|
*
|
mcm |
2:e02c2a91d2ea
|
349
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
350
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
351
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
352
|
* @pre NaN
|
mcm |
2:e02c2a91d2ea
|
353
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
354
|
*/
|
mcm |
2:e02c2a91d2ea
|
355
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_GetStatus ( HMC5883L_vector_data_t* myStatus )
|
mcm |
2:e02c2a91d2ea
|
356
|
{
|
mcm |
2:e02c2a91d2ea
|
357
|
char cmd = HMC5883L_STATUS_REGISTER;
|
mcm |
2:e02c2a91d2ea
|
358
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
359
|
|
mcm |
2:e02c2a91d2ea
|
360
|
|
mcm |
2:e02c2a91d2ea
|
361
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
362
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd, 1, true );
|
mcm |
2:e02c2a91d2ea
|
363
|
|
mcm |
2:e02c2a91d2ea
|
364
|
// Read the status register
|
mcm |
2:e02c2a91d2ea
|
365
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd, 1 );
|
mcm |
2:e02c2a91d2ea
|
366
|
|
mcm |
2:e02c2a91d2ea
|
367
|
|
mcm |
2:e02c2a91d2ea
|
368
|
// Update the value
|
mcm |
2:e02c2a91d2ea
|
369
|
myStatus->Status = cmd;
|
mcm |
2:e02c2a91d2ea
|
370
|
|
mcm |
2:e02c2a91d2ea
|
371
|
|
mcm |
2:e02c2a91d2ea
|
372
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
373
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
374
|
else
|
mcm |
2:e02c2a91d2ea
|
375
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
376
|
}
|
mcm |
2:e02c2a91d2ea
|
377
|
|
mcm |
2:e02c2a91d2ea
|
378
|
|
mcm |
2:e02c2a91d2ea
|
379
|
|
mcm |
2:e02c2a91d2ea
|
380
|
/**
|
mcm |
2:e02c2a91d2ea
|
381
|
* @brief HMC5883L_ReadRegister ( HMC5883L_register_list_t , uint8_t* )
|
mcm |
2:e02c2a91d2ea
|
382
|
*
|
mcm |
2:e02c2a91d2ea
|
383
|
* @details It reads a register.
|
mcm |
2:e02c2a91d2ea
|
384
|
*
|
mcm |
2:e02c2a91d2ea
|
385
|
* @param[in] myRegister: The register to be read.
|
mcm |
2:e02c2a91d2ea
|
386
|
*
|
mcm |
2:e02c2a91d2ea
|
387
|
* @param[out] myRegisterData: The value of the register.
|
mcm |
2:e02c2a91d2ea
|
388
|
*
|
mcm |
2:e02c2a91d2ea
|
389
|
*
|
mcm |
2:e02c2a91d2ea
|
390
|
* @return Status of HMC5883L_ReadRegister.
|
mcm |
2:e02c2a91d2ea
|
391
|
*
|
mcm |
2:e02c2a91d2ea
|
392
|
*
|
mcm |
2:e02c2a91d2ea
|
393
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
394
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
395
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
396
|
* @pre This function neither reads the OUTPUTs nor the Status register.
|
mcm |
2:e02c2a91d2ea
|
397
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
398
|
*/
|
mcm |
2:e02c2a91d2ea
|
399
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_ReadRegister ( HMC5883L_register_list_t myRegister, uint8_t* myRegisterData )
|
mcm |
2:e02c2a91d2ea
|
400
|
{
|
mcm |
2:e02c2a91d2ea
|
401
|
char cmd = 0;
|
mcm |
2:e02c2a91d2ea
|
402
|
uint8_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
403
|
|
mcm |
2:e02c2a91d2ea
|
404
|
|
mcm |
2:e02c2a91d2ea
|
405
|
// Only three register can be read: Configuration Register A, Configuration Register B and Mode Register
|
mcm |
2:e02c2a91d2ea
|
406
|
// NOTE: This function neither reads the OUTPUTs nor the Status register
|
mcm |
2:e02c2a91d2ea
|
407
|
if ( myRegister > HMC5883L_MODE_REGISTER )
|
mcm |
2:e02c2a91d2ea
|
408
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
409
|
|
mcm |
2:e02c2a91d2ea
|
410
|
|
mcm |
2:e02c2a91d2ea
|
411
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
412
|
cmd = *myRegisterData;
|
mcm |
2:e02c2a91d2ea
|
413
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd, 1, true );
|
mcm |
2:e02c2a91d2ea
|
414
|
|
mcm |
2:e02c2a91d2ea
|
415
|
// Read the register
|
mcm |
2:e02c2a91d2ea
|
416
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd, 1 );
|
mcm |
2:e02c2a91d2ea
|
417
|
|
mcm |
2:e02c2a91d2ea
|
418
|
|
mcm |
2:e02c2a91d2ea
|
419
|
// Update the value
|
mcm |
2:e02c2a91d2ea
|
420
|
*myRegisterData = cmd;
|
mcm |
2:e02c2a91d2ea
|
421
|
|
mcm |
2:e02c2a91d2ea
|
422
|
|
mcm |
2:e02c2a91d2ea
|
423
|
|
mcm |
2:e02c2a91d2ea
|
424
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
425
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
426
|
else
|
mcm |
2:e02c2a91d2ea
|
427
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
428
|
}
|
mcm |
2:e02c2a91d2ea
|
429
|
|
mcm |
2:e02c2a91d2ea
|
430
|
|
mcm |
2:e02c2a91d2ea
|
431
|
|
mcm |
2:e02c2a91d2ea
|
432
|
/**
|
mcm |
2:e02c2a91d2ea
|
433
|
* @brief HMC5883L_SetNumSample ( HMC5883L_conf_reg_a_samples_t )
|
mcm |
2:e02c2a91d2ea
|
434
|
*
|
mcm |
2:e02c2a91d2ea
|
435
|
* @details It configures the number of samples averaged.
|
mcm |
2:e02c2a91d2ea
|
436
|
*
|
mcm |
2:e02c2a91d2ea
|
437
|
* @param[in] mySamples: New Number of samples averaged.
|
mcm |
2:e02c2a91d2ea
|
438
|
*
|
mcm |
2:e02c2a91d2ea
|
439
|
* @param[out] NaN.
|
mcm |
2:e02c2a91d2ea
|
440
|
*
|
mcm |
2:e02c2a91d2ea
|
441
|
*
|
mcm |
2:e02c2a91d2ea
|
442
|
* @return Status of HMC5883L_SetNumSample.
|
mcm |
2:e02c2a91d2ea
|
443
|
*
|
mcm |
2:e02c2a91d2ea
|
444
|
*
|
mcm |
2:e02c2a91d2ea
|
445
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
446
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
447
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
448
|
* @pre NaN.
|
mcm |
2:e02c2a91d2ea
|
449
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
450
|
*/
|
mcm |
2:e02c2a91d2ea
|
451
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetNumSample ( HMC5883L_conf_reg_a_samples_t mySamples )
|
mcm |
2:e02c2a91d2ea
|
452
|
{
|
mcm |
2:e02c2a91d2ea
|
453
|
char cmd[] = { HMC5883L_CONFIGURATION_REGISTER_A, 0 };
|
mcm |
2:e02c2a91d2ea
|
454
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
455
|
|
mcm |
2:e02c2a91d2ea
|
456
|
|
mcm |
2:e02c2a91d2ea
|
457
|
|
mcm |
2:e02c2a91d2ea
|
458
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
459
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
|
mcm |
2:e02c2a91d2ea
|
460
|
|
mcm |
2:e02c2a91d2ea
|
461
|
// Read the configuration register A
|
mcm |
2:e02c2a91d2ea
|
462
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
|
mcm |
2:e02c2a91d2ea
|
463
|
|
mcm |
2:e02c2a91d2ea
|
464
|
|
mcm |
2:e02c2a91d2ea
|
465
|
// Check if they are different, if so, update the value
|
mcm |
2:e02c2a91d2ea
|
466
|
if ( ( cmd[1] & CONF_REG_A_SAMPLE_MASK ) != mySamples )
|
mcm |
2:e02c2a91d2ea
|
467
|
{
|
mcm |
2:e02c2a91d2ea
|
468
|
cmd[0] = HMC5883L_CONFIGURATION_REGISTER_A;
|
mcm |
2:e02c2a91d2ea
|
469
|
|
mcm |
2:e02c2a91d2ea
|
470
|
// Mask [ MA1 to MA0 ] Number of Samples
|
mcm |
2:e02c2a91d2ea
|
471
|
cmd[1] &= ~CONF_REG_A_SAMPLE_MASK;
|
mcm |
2:e02c2a91d2ea
|
472
|
|
mcm |
2:e02c2a91d2ea
|
473
|
// Update number of samples
|
mcm |
2:e02c2a91d2ea
|
474
|
cmd[1] |= mySamples;
|
mcm |
2:e02c2a91d2ea
|
475
|
|
mcm |
2:e02c2a91d2ea
|
476
|
// Write the new value
|
mcm |
2:e02c2a91d2ea
|
477
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
|
mcm |
2:e02c2a91d2ea
|
478
|
}
|
mcm |
2:e02c2a91d2ea
|
479
|
|
mcm |
2:e02c2a91d2ea
|
480
|
|
mcm |
2:e02c2a91d2ea
|
481
|
|
mcm |
2:e02c2a91d2ea
|
482
|
|
mcm |
2:e02c2a91d2ea
|
483
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
484
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
485
|
else
|
mcm |
2:e02c2a91d2ea
|
486
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
487
|
}
|
mcm |
2:e02c2a91d2ea
|
488
|
|
mcm |
2:e02c2a91d2ea
|
489
|
|
mcm |
2:e02c2a91d2ea
|
490
|
|
mcm |
2:e02c2a91d2ea
|
491
|
/**
|
mcm |
2:e02c2a91d2ea
|
492
|
* @brief HMC5883L_SetDataRate ( HMC5883L_conf_reg_a_dor_t )
|
mcm |
2:e02c2a91d2ea
|
493
|
*
|
mcm |
2:e02c2a91d2ea
|
494
|
* @details It configures the data rate.
|
mcm |
2:e02c2a91d2ea
|
495
|
*
|
mcm |
2:e02c2a91d2ea
|
496
|
* @param[in] myDataRate: New data rate.
|
mcm |
2:e02c2a91d2ea
|
497
|
*
|
mcm |
2:e02c2a91d2ea
|
498
|
* @param[out] NaN.
|
mcm |
2:e02c2a91d2ea
|
499
|
*
|
mcm |
2:e02c2a91d2ea
|
500
|
*
|
mcm |
2:e02c2a91d2ea
|
501
|
* @return Status of HMC5883L_SetDataRate.
|
mcm |
2:e02c2a91d2ea
|
502
|
*
|
mcm |
2:e02c2a91d2ea
|
503
|
*
|
mcm |
2:e02c2a91d2ea
|
504
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
505
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
506
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
507
|
* @pre NaN.
|
mcm |
2:e02c2a91d2ea
|
508
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
509
|
*/
|
mcm |
2:e02c2a91d2ea
|
510
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetDataRate ( HMC5883L_conf_reg_a_dor_t myDataRate )
|
mcm |
2:e02c2a91d2ea
|
511
|
{
|
mcm |
2:e02c2a91d2ea
|
512
|
char cmd[] = { HMC5883L_CONFIGURATION_REGISTER_A, 0 };
|
mcm |
2:e02c2a91d2ea
|
513
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
514
|
|
mcm |
2:e02c2a91d2ea
|
515
|
|
mcm |
2:e02c2a91d2ea
|
516
|
|
mcm |
2:e02c2a91d2ea
|
517
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
518
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
|
mcm |
2:e02c2a91d2ea
|
519
|
|
mcm |
2:e02c2a91d2ea
|
520
|
// Read the configuration register A
|
mcm |
2:e02c2a91d2ea
|
521
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
|
mcm |
2:e02c2a91d2ea
|
522
|
|
mcm |
2:e02c2a91d2ea
|
523
|
|
mcm |
2:e02c2a91d2ea
|
524
|
// Check if they are different, if so, update the value
|
mcm |
2:e02c2a91d2ea
|
525
|
if ( ( cmd[1] & CONF_REG_A_DATARATE_MASK ) != myDataRate )
|
mcm |
2:e02c2a91d2ea
|
526
|
{
|
mcm |
2:e02c2a91d2ea
|
527
|
cmd[0] = HMC5883L_CONFIGURATION_REGISTER_A;
|
mcm |
2:e02c2a91d2ea
|
528
|
|
mcm |
2:e02c2a91d2ea
|
529
|
// Mask [ DO2 to DO0 ] Data Output Rate Bits
|
mcm |
2:e02c2a91d2ea
|
530
|
cmd[1] &= ~CONF_REG_A_DATARATE_MASK;
|
mcm |
2:e02c2a91d2ea
|
531
|
|
mcm |
2:e02c2a91d2ea
|
532
|
// Update Data Output Rate Bits
|
mcm |
2:e02c2a91d2ea
|
533
|
cmd[1] |= myDataRate;
|
mcm |
2:e02c2a91d2ea
|
534
|
|
mcm |
2:e02c2a91d2ea
|
535
|
// Write the new value
|
mcm |
2:e02c2a91d2ea
|
536
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
|
mcm |
2:e02c2a91d2ea
|
537
|
}
|
mcm |
2:e02c2a91d2ea
|
538
|
|
mcm |
2:e02c2a91d2ea
|
539
|
|
mcm |
2:e02c2a91d2ea
|
540
|
|
mcm |
2:e02c2a91d2ea
|
541
|
|
mcm |
2:e02c2a91d2ea
|
542
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
543
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
544
|
else
|
mcm |
2:e02c2a91d2ea
|
545
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
546
|
}
|
mcm |
2:e02c2a91d2ea
|
547
|
|
mcm |
2:e02c2a91d2ea
|
548
|
|
mcm |
2:e02c2a91d2ea
|
549
|
|
mcm |
2:e02c2a91d2ea
|
550
|
/**
|
mcm |
2:e02c2a91d2ea
|
551
|
* @brief HMC5883L_SetMeasurementConf ( HMC5883L_conf_reg_a_measurement_mode_t )
|
mcm |
2:e02c2a91d2ea
|
552
|
*
|
mcm |
2:e02c2a91d2ea
|
553
|
* @details It configures the measurement configuration bits.
|
mcm |
2:e02c2a91d2ea
|
554
|
*
|
mcm |
2:e02c2a91d2ea
|
555
|
* @param[in] myMeasurementMode: New measurement mode.
|
mcm |
2:e02c2a91d2ea
|
556
|
*
|
mcm |
2:e02c2a91d2ea
|
557
|
* @param[out] NaN.
|
mcm |
2:e02c2a91d2ea
|
558
|
*
|
mcm |
2:e02c2a91d2ea
|
559
|
*
|
mcm |
2:e02c2a91d2ea
|
560
|
* @return Status of HMC5883L_SetMeasurementConf.
|
mcm |
2:e02c2a91d2ea
|
561
|
*
|
mcm |
2:e02c2a91d2ea
|
562
|
*
|
mcm |
2:e02c2a91d2ea
|
563
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
564
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
565
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
566
|
* @pre NaN.
|
mcm |
2:e02c2a91d2ea
|
567
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
568
|
*/
|
mcm |
2:e02c2a91d2ea
|
569
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetMeasurementConf ( HMC5883L_conf_reg_a_measurement_mode_t myMeasurementMode )
|
mcm |
2:e02c2a91d2ea
|
570
|
{
|
mcm |
2:e02c2a91d2ea
|
571
|
char cmd[] = { HMC5883L_CONFIGURATION_REGISTER_A, 0 };
|
mcm |
2:e02c2a91d2ea
|
572
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
573
|
|
mcm |
2:e02c2a91d2ea
|
574
|
|
mcm |
2:e02c2a91d2ea
|
575
|
|
mcm |
2:e02c2a91d2ea
|
576
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
577
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
|
mcm |
2:e02c2a91d2ea
|
578
|
|
mcm |
2:e02c2a91d2ea
|
579
|
// Read the configuration register A
|
mcm |
2:e02c2a91d2ea
|
580
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
|
mcm |
2:e02c2a91d2ea
|
581
|
|
mcm |
2:e02c2a91d2ea
|
582
|
|
mcm |
2:e02c2a91d2ea
|
583
|
// Check if they are different, if so, update the value
|
mcm |
2:e02c2a91d2ea
|
584
|
if ( ( cmd[1] & CONF_REG_A_MODE_MASK ) != myMeasurementMode )
|
mcm |
2:e02c2a91d2ea
|
585
|
{
|
mcm |
2:e02c2a91d2ea
|
586
|
cmd[0] = HMC5883L_CONFIGURATION_REGISTER_A;
|
mcm |
2:e02c2a91d2ea
|
587
|
|
mcm |
2:e02c2a91d2ea
|
588
|
// Mask [ MS1 to MS0 ] Measurement Configuration Bits
|
mcm |
2:e02c2a91d2ea
|
589
|
cmd[1] &= ~CONF_REG_A_MODE_MASK;
|
mcm |
2:e02c2a91d2ea
|
590
|
|
mcm |
2:e02c2a91d2ea
|
591
|
// Update Measurement Configuration Bits
|
mcm |
2:e02c2a91d2ea
|
592
|
cmd[1] |= myMeasurementMode;
|
mcm |
2:e02c2a91d2ea
|
593
|
|
mcm |
2:e02c2a91d2ea
|
594
|
// Write the new value
|
mcm |
2:e02c2a91d2ea
|
595
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
|
mcm |
2:e02c2a91d2ea
|
596
|
}
|
mcm |
2:e02c2a91d2ea
|
597
|
|
mcm |
2:e02c2a91d2ea
|
598
|
|
mcm |
2:e02c2a91d2ea
|
599
|
|
mcm |
2:e02c2a91d2ea
|
600
|
|
mcm |
2:e02c2a91d2ea
|
601
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
602
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
603
|
else
|
mcm |
2:e02c2a91d2ea
|
604
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
605
|
}
|
mcm |
2:e02c2a91d2ea
|
606
|
|
mcm |
2:e02c2a91d2ea
|
607
|
|
mcm |
2:e02c2a91d2ea
|
608
|
|
mcm |
2:e02c2a91d2ea
|
609
|
/**
|
mcm |
2:e02c2a91d2ea
|
610
|
* @brief HMC5883L_SetGain ( HMC5883L_conf_reg_b_gain_t )
|
mcm |
2:e02c2a91d2ea
|
611
|
*
|
mcm |
2:e02c2a91d2ea
|
612
|
* @details It configures the gain/resolution.
|
mcm |
2:e02c2a91d2ea
|
613
|
*
|
mcm |
2:e02c2a91d2ea
|
614
|
* @param[in] myGain: New gain/resolution.
|
mcm |
2:e02c2a91d2ea
|
615
|
*
|
mcm |
2:e02c2a91d2ea
|
616
|
* @param[out] NaN.
|
mcm |
2:e02c2a91d2ea
|
617
|
*
|
mcm |
2:e02c2a91d2ea
|
618
|
*
|
mcm |
2:e02c2a91d2ea
|
619
|
* @return Status of HMC5883L_SetGain.
|
mcm |
2:e02c2a91d2ea
|
620
|
*
|
mcm |
2:e02c2a91d2ea
|
621
|
*
|
mcm |
2:e02c2a91d2ea
|
622
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
623
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
624
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
625
|
* @pre NaN.
|
mcm |
2:e02c2a91d2ea
|
626
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
627
|
*/
|
mcm |
2:e02c2a91d2ea
|
628
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetGain ( HMC5883L_conf_reg_b_gain_t myGain )
|
mcm |
2:e02c2a91d2ea
|
629
|
{
|
mcm |
2:e02c2a91d2ea
|
630
|
char cmd[] = { HMC5883L_CONFIGURATION_REGISTER_B , 0 };
|
mcm |
2:e02c2a91d2ea
|
631
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
632
|
|
mcm |
2:e02c2a91d2ea
|
633
|
|
mcm |
2:e02c2a91d2ea
|
634
|
|
mcm |
2:e02c2a91d2ea
|
635
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
636
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
|
mcm |
2:e02c2a91d2ea
|
637
|
|
mcm |
2:e02c2a91d2ea
|
638
|
// Read the configuration register B
|
mcm |
2:e02c2a91d2ea
|
639
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
|
mcm |
2:e02c2a91d2ea
|
640
|
|
mcm |
2:e02c2a91d2ea
|
641
|
|
mcm |
2:e02c2a91d2ea
|
642
|
// Check if they are different, if so, update the value
|
mcm |
2:e02c2a91d2ea
|
643
|
if ( ( cmd[1] & CONF_REG_B_GAIN_MASK ) != myGain )
|
mcm |
2:e02c2a91d2ea
|
644
|
{
|
mcm |
2:e02c2a91d2ea
|
645
|
cmd[0] = HMC5883L_CONFIGURATION_REGISTER_B;
|
mcm |
2:e02c2a91d2ea
|
646
|
|
mcm |
2:e02c2a91d2ea
|
647
|
// Mask [ GN2 to GN0 ] Gain Configuration Bits
|
mcm |
2:e02c2a91d2ea
|
648
|
cmd[1] &= ~CONF_REG_B_GAIN_MASK;
|
mcm |
2:e02c2a91d2ea
|
649
|
|
mcm |
2:e02c2a91d2ea
|
650
|
// Update Gain Configuration Bits
|
mcm |
2:e02c2a91d2ea
|
651
|
cmd[1] |= myGain;
|
mcm |
2:e02c2a91d2ea
|
652
|
|
mcm |
2:e02c2a91d2ea
|
653
|
// Write the new value
|
mcm |
2:e02c2a91d2ea
|
654
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
|
mcm |
2:e02c2a91d2ea
|
655
|
}
|
mcm |
2:e02c2a91d2ea
|
656
|
|
mcm |
2:e02c2a91d2ea
|
657
|
|
mcm |
2:e02c2a91d2ea
|
658
|
|
mcm |
2:e02c2a91d2ea
|
659
|
|
mcm |
2:e02c2a91d2ea
|
660
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
661
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
662
|
else
|
mcm |
2:e02c2a91d2ea
|
663
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
664
|
}
|
mcm |
2:e02c2a91d2ea
|
665
|
|
mcm |
2:e02c2a91d2ea
|
666
|
|
mcm |
2:e02c2a91d2ea
|
667
|
|
mcm |
2:e02c2a91d2ea
|
668
|
/**
|
mcm |
2:e02c2a91d2ea
|
669
|
* @brief HMC5883L_SetMode ( HMC5883L_mode_register_operation_mode_t )
|
mcm |
2:e02c2a91d2ea
|
670
|
*
|
mcm |
2:e02c2a91d2ea
|
671
|
* @details It configures the operation mode.
|
mcm |
2:e02c2a91d2ea
|
672
|
*
|
mcm |
2:e02c2a91d2ea
|
673
|
* @param[in] myOperationMode: New operation mode.
|
mcm |
2:e02c2a91d2ea
|
674
|
*
|
mcm |
2:e02c2a91d2ea
|
675
|
* @param[out] NaN.
|
mcm |
2:e02c2a91d2ea
|
676
|
*
|
mcm |
2:e02c2a91d2ea
|
677
|
*
|
mcm |
2:e02c2a91d2ea
|
678
|
* @return Status of HMC5883L_SetMode.
|
mcm |
2:e02c2a91d2ea
|
679
|
*
|
mcm |
2:e02c2a91d2ea
|
680
|
*
|
mcm |
2:e02c2a91d2ea
|
681
|
* @author Manuel Caballero
|
mcm |
2:e02c2a91d2ea
|
682
|
* @date 13/October/2017
|
mcm |
2:e02c2a91d2ea
|
683
|
* @version 13/October/2017 The ORIGIN
|
mcm |
2:e02c2a91d2ea
|
684
|
* @pre NaN.
|
mcm |
2:e02c2a91d2ea
|
685
|
* @warning NaN.
|
mcm |
2:e02c2a91d2ea
|
686
|
*/
|
mcm |
2:e02c2a91d2ea
|
687
|
HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetMode ( HMC5883L_mode_register_operation_mode_t myOperationMode )
|
mcm |
2:e02c2a91d2ea
|
688
|
{
|
mcm |
2:e02c2a91d2ea
|
689
|
char cmd[] = { HMC5883L_MODE_REGISTER, 0 };
|
mcm |
2:e02c2a91d2ea
|
690
|
uint32_t aux = 0;
|
mcm |
2:e02c2a91d2ea
|
691
|
|
mcm |
2:e02c2a91d2ea
|
692
|
|
mcm |
2:e02c2a91d2ea
|
693
|
|
mcm |
2:e02c2a91d2ea
|
694
|
// Write the command
|
mcm |
2:e02c2a91d2ea
|
695
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
|
mcm |
2:e02c2a91d2ea
|
696
|
|
mcm |
2:e02c2a91d2ea
|
697
|
// Read the Mode register bit
|
mcm |
2:e02c2a91d2ea
|
698
|
aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
|
mcm |
2:e02c2a91d2ea
|
699
|
|
mcm |
2:e02c2a91d2ea
|
700
|
|
mcm |
2:e02c2a91d2ea
|
701
|
// Check if they are different, if so, update the value
|
mcm |
2:e02c2a91d2ea
|
702
|
if ( ( cmd[1] & MODE_REG_MODE_MASK ) != myOperationMode )
|
mcm |
2:e02c2a91d2ea
|
703
|
{
|
mcm |
2:e02c2a91d2ea
|
704
|
cmd[0] = HMC5883L_MODE_REGISTER;
|
mcm |
2:e02c2a91d2ea
|
705
|
|
mcm |
2:e02c2a91d2ea
|
706
|
// Mask [ MD1 to MD0 ] Mode Select Bits
|
mcm |
2:e02c2a91d2ea
|
707
|
cmd[1] &= ~MODE_REG_MODE_MASK;
|
mcm |
2:e02c2a91d2ea
|
708
|
|
mcm |
2:e02c2a91d2ea
|
709
|
// Update Mode Select Bits
|
mcm |
2:e02c2a91d2ea
|
710
|
cmd[1] |= myOperationMode;
|
mcm |
2:e02c2a91d2ea
|
711
|
|
mcm |
2:e02c2a91d2ea
|
712
|
// Write the new value
|
mcm |
2:e02c2a91d2ea
|
713
|
aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
|
mcm |
2:e02c2a91d2ea
|
714
|
}
|
mcm |
2:e02c2a91d2ea
|
715
|
|
mcm |
2:e02c2a91d2ea
|
716
|
|
mcm |
2:e02c2a91d2ea
|
717
|
|
mcm |
2:e02c2a91d2ea
|
718
|
|
mcm |
2:e02c2a91d2ea
|
719
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:e02c2a91d2ea
|
720
|
return HMC5883L_SUCCESS;
|
mcm |
2:e02c2a91d2ea
|
721
|
else
|
mcm |
2:e02c2a91d2ea
|
722
|
return HMC5883L_FAILURE;
|
mcm |
2:e02c2a91d2ea
|
723
|
}
|