LSM303D_driver_part.c


1
// typedef for the accelerometer data rate
2
typedef enum lsm303d_aodr_e
3
{
4
  LSM303D_AODR_PWR_DOWN  = 0x00,
5
  LSM303D_AODR_3_125HZ  = 0x10,
6
  LSM303D_AODR_6_25HZ    = 0x20,
7
  LSM303D_AODR_12_5HZ    = 0x30,
8
  LSM303D_AODR_25HZ    = 0x40,
9
  LSM303D_AODR_50HZ    = 0x50,
10
  LSM303D_AODR_100HZ    = 0x60,
11
  LSM303D_AODR_200HZ    = 0x70,
12
  LSM303D_AODR_400HZ    = 0x80,
13
  LSM303D_AODR_800HZ    = 0x90,
14
  LSM303D_AODR_1600HZ    = 0xA0
15
}lsm303d_aodr_t;
16
17
// typedef to select the axis
18
typedef enum lsm303d_axis_sel_e
19
{
20
  LSM303D_AXIS_SEL_X    = 0x01,
21
  LSM303D_AXIS_SEL_Y    = 0x02,
22
  LSM303D_AXIS_SEL_Z    = 0x04,
23
  LSM303D_AXIS_SEL_XY    = 0x03,
24
  LSM303D_AXIS_SEL_XZ    = 0x05,
25
  LSM303D_AXIS_SEL_YZ    = 0x06,
26
  LSM303D_AXIS_SEL_XYZ  = 0x07
27
}lsm303d_axis_sel_t;
28
29
30
31
/*******************************************************************
32
  function  -  lsm303d_chg_ctrl1
33
34
  description:  Function to read or write the control register 1.
35
36
  parameter:  
37
    register_data  -  the data to write to the register or 
38
              read from it
39
    reg_add      -  the register address
40
    
41
  return:  
42
    OK          -  successful
43
    LSM303D_ERR_W_REGISTER  -  write register failed
44
    LSM303D_ERR_R_REGISTER  -  read register failed
45
46
********************************************************************/
47
int lsm303d_chg_ctrl1(uint8_t* register_data, bool write)
48
{
49
  // error variable
50
  int error;
51
  
52
  // temporary buffer to receive the answer or send data
53
  uint8_t lsm_data[2] = {(CTRL1 & NOT_USE_AUTO_INC), 0x00};
54
  
55
  // decide whether read or write
56
  if(write == true) // write
57
  {
58
    // set data and send them
59
    lsm_data[1] = register_data;
60
    error = twi_mast_o_send_data_bl(SENS_TWI, LSM303D_TWI_ADD,
61
                      lsm_data, 2);
62
    if(error != OK)
63
    {
64
      // return error if the writing fails
65
      return LSM303D_ERR_W_REGISTER;
66
    }
67
  }
68
  else // read
69
  {
70
    error = twi_mast_o_recv_data_w_add_bl(SENS_TWI, LSM303D_TWI_ADD, 
71
                        lsm_data+1, 1, lsm_data, 1);
72
    if(error != OK)
73
    {
74
      // return error if reading fails
75
      return LSM303D_ERR_R_REGISTER;
76
    }
77
78
    // get information from received data
79
    *register_data = lsm_data[1];
80
  }
81
82
  return OK;
83
}
84
85
86
/*******************************************************************
87
  function  -  lsm303d_chg_ctrl1
88
89
  description:  Function to read or write the control register 1.
90
91
  parameter:  
92
    aodr  -  accelerometer data rate
93
    axen  -  accelerometer axis enable
94
    bdu    -  block data update enable
95
    
96
  return:  
97
    OK          -  successful
98
    LSM303D_ERR_W_REGISTER  -  write register failed
99
    LSM303D_ERR_R_REGISTER  -  read register failed
100
101
********************************************************************/
102
int lsm303d_chg_ctrl1(lsm303d_aodr_t* aodr, lsm303d_axis_sel_t* axen, 
103
            bool* bdu, bool write)
104
{
105
  // error variable
106
  int error;
107
108
  // temporary buffer to receive the answer or send data
109
  uint8_t lsm_data[2] = {(CTRL1 & NOT_USE_AUTO_INC), 0x00};
110
111
  if(write == true)
112
  {
113
    // set data and send them
114
    lsm_data[1] = 0x00 | *aodr | *axen;
115
    if(*bdu == true){lsm_data[1] |= BDU_bm;}
116
    error = twi_mast_o_send_data_bl(SENS_TWI, LSM303D_TWI_ADD,
117
                      lsm_data, 2);
118
    if(error != OK)
119
    {
120
      // return error if the writing fails
121
      return LSM303D_ERR_W_REGISTER;
122
    }
123
  }
124
  else // read
125
  {
126
    error = twi_mast_o_recv_data_w_add_bl(SENS_TWI, LSM303D_TWI_ADD, 
127
                        lsm_data+1, 1, lsm_data, 1);
128
    if(error != OK)
129
    {
130
      // return error if reading fails
131
      return LSM303D_ERR_R_REGISTER;
132
    }
133
134
    // get information from received data
135
    *aodr = AODR_gm & lsm_data[1];
136
    *axen = AEN_gm & lsm_data[1];
137
    *bdu = ((lsm_data[1] & BDU_bm) != 0);
138
  }
139
140
  return OK;
141
}