Subversion Repositories Code-Repo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
223 Kevin 1
#include <xc.h>
2
#include "main.h"
3
#include "LSM303.h"
4
#include "I2C.h"
5
 
6
void LSM303_Init(void) {
7
    // Enable accelerometer, normal power mode, all axes enabled (100Hz)
8
    char c[2] = {LSM303_CTRL_REG1_A, 0x57};
9
    I2C_Master_Send(ADDRESS_ACCL, &c, 2);
10
    while (!I2C_Get_Status());
11
 
12
    // Enable high resolution mode, +- 2G
13
    char d[2] = {LSM303_CTRL_REG4_A, 0x08};
14
    I2C_Master_Send(ADDRESS_ACCL, &d, 2);
15
    while (!I2C_Get_Status());
16
 
17
    // Enable magnetometer, continuous conversion mode
18
    char e[2] = {LSM303_MR_REG_M, 0x00};
19
    I2C_Master_Send(ADDRESS_MAGN, &e, 2);
20
    while (!I2C_Get_Status());
21
 
22
    char f[2] = {LSM303_CRA_REG_M, 0x18}; // (75Hz)
23
    I2C_Master_Send(ADDRESS_MAGN, &f, 2);
24
    while (!I2C_Get_Status());
25
 
26
//    LSM303_Set_Mag_Gain(magGain_40);
27
}
28
 
29
void LSM303_Set_Mag_Gain(magGain value) {
30
    char c[2];
31
    c[0] = LSM303_CRB_REG_M;
32
    c[1] = (char)value;
33
    I2C_Master_Send(ADDRESS_MAGN, &c, 2);
34
    while (!I2C_Get_Status());
35
}
36
 
37
void LSM303_Read_Accl(char *x_L, char *x_H, char *y_L, char *y_H, char *z_L, char *z_H) {
38
    char result, length, buffer[10] = {0};
39
 
40
    // Assert the MSB to autoincrement address
41
    char c = LSM303_OUT_X_L_A | 0x80;
42
 
43
    I2C_Master_Restart(ADDRESS_ACCL, c, 6);
44
    do {
45
        result = I2C_Get_Status();
46
    } while (!result);
47
 
48
    // Read received data
49
    length = I2C_Read_Buffer(buffer);
50
 
51
    // Data is received in low-high byte order
52
    *x_L = buffer[0];
53
    *x_H = buffer[1];
54
    *y_L = buffer[2];
55
    *y_H = buffer[3];
56
    *z_L = buffer[4];
57
    *z_H = buffer[5];
58
}
59
 
60
void LSM303_Read_Magn(char *x_L, char *x_H, char *y_L, char *y_H, char *z_L, char *z_H) {
61
    char result, length, buffer[10];
62
 
63
    // Assert the MSB to autoincrement address
64
    char c = LSM303_OUT_X_H_M;
65
 
66
    I2C_Master_Restart(ADDRESS_MAGN, c, 6);
67
    do {
68
        result = I2C_Get_Status();
69
    } while (!result);
70
 
71
    // Read received data
72
    length = I2C_Read_Buffer(buffer);
73
 
74
    // Data is received in high-low byte order
75
    *x_H = buffer[0];
76
    *x_L = buffer[1];
77
    *z_H = buffer[2];
78
    *z_L = buffer[3];
79
    *y_H = buffer[4];
80
    *y_L = buffer[5];
81
}