Rev 243 | Rev 250 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 243 | Rev 248 | ||
---|---|---|---|
Line 163... | Line 163... | ||
163 | 163 | ||
Line 164... | Line 164... | ||
164 | // ---------------------------------------------------------------------------------------- |
164 | // ---------------------------------------------------------------------------------------- |
165 | 165 | ||
166 | void HMC5843_GetIdentification(void) |
166 | void HMC5843_GetIdentification(void) |
167 | { |
167 | { |
168 | if(I2C_State == I2C_STATE_IDLE) |
168 | if(I2C_LockBuffer(100)) |
169 | { |
169 | { |
- | 170 | u16 TxBytes = 0; |
|
- | 171 | HMC5843_Identification.A = 0xFF; |
|
170 | I2C_TxBufferSize = 0; |
172 | HMC5843_Identification.B = 0xFF; |
171 | // set register pointer |
173 | HMC5843_Identification.C = 0xFF; |
172 | I2C_TxBuffer[I2C_TxBufferSize++] = REGISTER_IDA; |
174 | I2C_Buffer[TxBytes++] = REGISTER_IDA; |
- | 175 | // initiate transmission |
|
- | 176 | if(I2C_Transmission(HMC5843_SLAVE_ADDRESS, TxBytes, &HMC5843_UpdateIdentification, sizeof(HMC5843_Identification))) |
|
- | 177 | { |
|
173 | // initiate transmission |
178 | I2C_WaitForEndOfTransmission(100); |
174 | I2C_Transmission(HMC5843_SLAVE_ADDRESS, &HMC5843_UpdateIdentification, sizeof(HMC5843_Identification)); |
179 | } |
Line 175... | Line 180... | ||
175 | } |
180 | } |
176 | } |
181 | } |
177 | 182 | ||
178 | // ---------------------------------------------------------------------------------------- |
183 | // ---------------------------------------------------------------------------------------- |
179 | u8 HMC5843_SetConfiguration(u8 cra, u8 crb, u8 mode) |
- | |
180 | { |
184 | u8 HMC5843_SetConfiguration(u8 cra, u8 crb, u8 mode) |
181 | u32 timeout = SetDelay(100); |
185 | { |
182 | // wait for free I2C bus |
- | |
183 | while(I2C_State != I2C_STATE_IDLE) |
- | |
184 | { |
186 | u8 retval = 0; |
185 | if(CheckDelay(timeout)) return 0; |
187 | if(I2C_LockBuffer(100)) |
186 | } |
188 | { |
187 | I2C_TxBufferSize = 0; |
189 | u16 TxBytes = 0; |
188 | I2C_TxBuffer[I2C_TxBufferSize++] = REGISTER_CRA; |
190 | I2C_Buffer[TxBytes++] = REGISTER_CRA; |
189 | I2C_TxBuffer[I2C_TxBufferSize++] = cra; |
191 | I2C_Buffer[TxBytes++] = cra; |
190 | I2C_TxBuffer[I2C_TxBufferSize++] = crb; |
192 | I2C_Buffer[TxBytes++] = crb; |
- | 193 | I2C_Buffer[TxBytes++] = mode; |
|
- | 194 | // initiate transmission |
|
- | 195 | if(I2C_Transmission(HMC5843_SLAVE_ADDRESS, TxBytes, NULL, 0)) |
|
- | 196 | { |
|
191 | I2C_TxBuffer[I2C_TxBufferSize++] = mode; |
197 | retval = I2C_WaitForEndOfTransmission(50); |
192 | // initiate transmission |
198 | } |
Line 193... | Line 199... | ||
193 | I2C_Transmission(HMC5843_SLAVE_ADDRESS, NULL, 0); |
199 | } |
194 | return 1; |
200 | return(retval); |
195 | } |
201 | } |
196 | 202 | ||
197 | //---------------------------------------------------------------- |
203 | //---------------------------------------------------------------- |
198 | void HMC5843_GetMagVector(void) |
204 | void HMC5843_GetMagVector(void) |
199 | { |
205 | { |
200 | if(I2C_State == I2C_STATE_IDLE) |
206 | if(I2C_LockBuffer(100)) |
201 | { |
207 | { |
202 | I2C_TxBufferSize = 0; |
208 | u16 TxBytes = 0; |
203 | // set register pointer |
209 | // set register pointer |
204 | I2C_TxBuffer[I2C_TxBufferSize++] = REGISTER_DATAX_MSB; |
210 | I2C_Buffer[TxBytes++] = REGISTER_DATAX_MSB; |
Line 205... | Line 211... | ||
205 | // initiate transmission |
211 | // initiate transmission |
206 | I2C_Transmission(HMC5843_SLAVE_ADDRESS, &HMC5843_UpdateMagVector, sizeof(MagVector)); |
212 | I2C_Transmission(HMC5843_SLAVE_ADDRESS, TxBytes, &HMC5843_UpdateMagVector, sizeof(MagVector)); |
Line 238... | Line 244... | ||
238 | s32 scale, scale_min, scale_max; |
244 | s32 scale, scale_min, scale_max; |
239 | u8 i = 0; |
245 | u8 i = 0; |
Line 240... | Line 246... | ||
240 | 246 | ||
241 | // activate positive bias field of 0.55 gauss |
247 | // activate positive bias field of 0.55 gauss |
242 | HMC5843_SetConfiguration(HMC5843_CRA_RATE_50HZ|HMC5843_CRA_MODE_POSBIAS, HMC5843_CRB_GAIN_10GA, HMC5843_MODE_CONTINUOUS); |
- | |
243 | // wait a while |
- | |
244 | time = SetDelay(55); |
- | |
245 | while(!CheckDelay(time)); |
248 | HMC5843_SetConfiguration(HMC5843_CRA_RATE_50HZ|HMC5843_CRA_MODE_POSBIAS, HMC5843_CRB_GAIN_10GA, HMC5843_MODE_CONTINUOUS); |
246 | // averaging |
249 | // averaging |
247 | for(i = 0; i<20; i++) |
250 | for(i = 0; i<20; i++) |
248 | { |
251 | { |
249 | HMC5843_GetMagVector(); |
252 | HMC5843_GetMagVector(); |
Line 253... | Line 256... | ||
253 | YMax += MagVector.Y; |
256 | YMax += MagVector.Y; |
254 | ZMax += MagVector.Z; |
257 | ZMax += MagVector.Z; |
255 | } |
258 | } |
256 | // activate negative bias field of 0.55 gauss |
259 | // activate negative bias field of 0.55 gauss |
257 | HMC5843_SetConfiguration(HMC5843_CRA_RATE_50HZ|HMC5843_CRA_MODE_NEGBIAS, HMC5843_CRB_GAIN_10GA, HMC5843_MODE_CONTINUOUS); |
260 | HMC5843_SetConfiguration(HMC5843_CRA_RATE_50HZ|HMC5843_CRA_MODE_NEGBIAS, HMC5843_CRB_GAIN_10GA, HMC5843_MODE_CONTINUOUS); |
258 | // wait a while |
- | |
259 | time = SetDelay(55); |
- | |
260 | while(!CheckDelay(time)); |
261 | while(!CheckDelay(time)); |
261 | // averaging |
262 | // averaging |
262 | for(i = 0; i < 20; i++) |
263 | for(i = 0; i < 20; i++) |
263 | { |
264 | { |
264 | HMC5843_GetMagVector(); |
265 | HMC5843_GetMagVector(); |
Line 270... | Line 271... | ||
270 | } |
271 | } |
271 | // setup final configuration |
272 | // setup final configuration |
272 | HMC5843_SetConfiguration(HMC5843_CRA_RATE_50HZ|HMC5843_CRA_MODE_NORMAL, HMC5843_CRB_GAIN_10GA, HMC5843_MODE_CONTINUOUS); |
273 | HMC5843_SetConfiguration(HMC5843_CRA_RATE_50HZ|HMC5843_CRA_MODE_NORMAL, HMC5843_CRB_GAIN_10GA, HMC5843_MODE_CONTINUOUS); |
273 | // prepare scale limits |
274 | // prepare scale limits |
274 | scale = 715; // 1300 counts/Gauss * 0.55 Gauss = 715 counts |
275 | scale = 715; // 1300 counts/Gauss * 0.55 Gauss = 715 counts |
275 | scale_min = (scale * 90)/100; |
276 | scale_min = (scale * 90)/100; |
276 | scale_max = (scale * 110)/100; |
277 | scale_max = (scale * 110)/100; |
277 | // check scale for all axes |
278 | // check scale for all axes |
278 | scale = (XMax - XMin)/40; |
279 | scale = (XMax - XMin)/40; |
279 | if((scale > scale_max) && (scale < scale_min)) return 0; |
280 | if((scale > scale_max) && (scale < scale_min)) return 0; |
280 | scale = (YMax + YMin)/40; |
281 | scale = (YMax + YMin)/40; |
Line 288... | Line 289... | ||
288 | //---------------------------------------------------------------- |
289 | //---------------------------------------------------------------- |
289 | u8 HMC5843_Init(void) |
290 | u8 HMC5843_Init(void) |
290 | { |
291 | { |
291 | u8 msg[64]; |
292 | u8 msg[64]; |
292 | u8 repeat; |
293 | u8 repeat; |
293 | u32 timeout; |
- | |
Line 294... | Line 294... | ||
294 | 294 | ||
Line 295... | Line 295... | ||
295 | HMC5843_Present = 0; |
295 | HMC5843_Present = 0; |
296 | 296 | ||
Line 301... | Line 301... | ||
301 | // polling of identification |
301 | // polling of identification |
302 | repeat = 0; |
302 | repeat = 0; |
303 | do |
303 | do |
304 | { |
304 | { |
305 | HMC5843_GetIdentification(); |
305 | HMC5843_GetIdentification(); |
306 | timeout = SetDelay(250); |
- | |
307 | do |
- | |
308 | { |
- | |
309 | if (HMC5843_Identification.A != 0xFF) break; // break loop on success |
306 | if (HMC5843_Identification.A != 0xFF) break; // break loop on success |
310 | }while (!CheckDelay(timeout)); |
- | |
311 | UART1_PutString("."); |
307 | UART1_PutString("."); |
312 | repeat++; |
308 | repeat++; |
313 | }while ((HMC5843_Identification.A == 0xFF) && (repeat < 12)); // 12*250ms=3s |
309 | }while ((HMC5843_Identification.A == 0xFF) && (repeat < 12)); // 12*250ms=3s |
314 | // if we got it |
310 | // if we got it |
315 | if(HMC5843_Identification.A != 0xFF) |
311 | if(HMC5843_Identification.A != 0xFF) |