Subversion Repositories NaviCtrl

Rev

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)