@@ -42,13 +42,14 @@ int8_t lsm303_setup(lsm303_dev *dev, lsm303_init_param lsm303_params) {
42
42
dev -> acc_axes_config = lsm303_params .acc_axes_config ;
43
43
dev -> acc_scale = lsm303_params .acc_scale ;
44
44
dev -> acc_resolution = lsm303_params .acc_resolution ;
45
- // dev->i2c0_dev = DEVICE_DT_GET(i2c0_master);
45
+
46
+ #ifdef PLATFORM_ZEPHYR
46
47
dev -> i2c0_dev = (struct device * )DEVICE_DT_GET (i2c0_master );
47
48
48
49
if (!device_is_ready (dev -> i2c0_dev )) {
49
- printk ("I2C bus is not ready!\n\r" );
50
50
return LSM303_STATUS_API_ERR ;
51
51
}
52
+ #endif
52
53
53
54
ret |= lsm303_set_power_mode (dev , dev -> acc_power_mode );
54
55
ret |= lsm303_acc_enable_axes (dev , dev -> acc_axes_config );
@@ -122,10 +123,11 @@ int8_t lsm303_acc_enable_axes(lsm303_dev *device, lsm303_acc_axes_config axes) {
122
123
}
123
124
124
125
val &= ~0x07 ;
125
- val = val | axes .acc_axes << ACC_AXES_MASK ;
126
- axes .enable .z = (val & (1 << 2 )) >> 2 ;
127
- axes .enable .y = (val & (1 << 1 )) >> 1 ;
128
- axes .enable .x = (val & 1 );
126
+ val = val | axes .acc_axes << ACC_AXES_MASK ;
127
+ axes .enable .z = (val & (1 << 2 )) >> 2 ;
128
+ axes .enable .y = (val & (1 << 1 )) >> 1 ;
129
+ axes .enable .x = (val & 1 );
130
+
129
131
device -> acc_axes_config = axes ;
130
132
131
133
uint8_t data_buffer [] = {CTRL_REG1_A , val };
@@ -153,8 +155,20 @@ int8_t lsm303_acc_set_odr(lsm303_dev *device, enum lsm303_acc_odr odr) {
153
155
return LSM303_STATUS_API_ERR ;
154
156
}
155
157
158
+ if (odr == ACC_ODR_1K620HZ || odr == ACC_ODR_5K376HZ ) {
159
+ if (device -> acc_power_mode != ACC_LOW_POWER ) {
160
+ printk ("ODR only works in low-power mode\r\n" );
161
+ return LSM303_STATUS_INPUT_ERR ;
162
+ }
163
+ }
164
+
156
165
val &= ~0xF0 ;
157
- val = val | odr << ACC_ODR_MASK ;
166
+ if (odr == ACC_ODR_5K376HZ ) {
167
+ val = val | (odr - 1 ) << ACC_ODR_MASK ;
168
+ } else {
169
+ val = val | odr << ACC_ODR_MASK ;
170
+ }
171
+
158
172
device -> acc_odr = odr ;
159
173
160
174
uint8_t data_buffer [] = {CTRL_REG1_A , val };
@@ -184,7 +198,8 @@ int8_t lsm303_acc_set_scale(lsm303_dev *device,
184
198
}
185
199
186
200
val &= ~0x30 ;
187
- val = val | scale << ACC_SCALE_MASK ;
201
+ val = val | scale << ACC_SCALE_MASK ;
202
+
188
203
device -> acc_scale = scale ;
189
204
190
205
uint8_t data_buffer [] = {CTRL_REG4_A , val };
@@ -214,7 +229,8 @@ int8_t lsm303_acc_set_resolution(lsm303_dev *device,
214
229
}
215
230
216
231
val &= ~0x08 ;
217
- val = val | resolution << ACC_RESOLUTION_MASK ;
232
+ val = val | resolution << ACC_RESOLUTION_MASK ;
233
+
218
234
device -> acc_resolution = resolution ;
219
235
220
236
uint8_t data_buffer [] = {CTRL_REG4_A , val };
@@ -370,7 +386,21 @@ int8_t lsm303_get_z_raw_data(lsm303_dev *device, lsm303_axes_data *accel_data) {
370
386
return LSM303_STATUS_SUCCESS ;
371
387
}
372
388
373
- float convert_raw_to_g (lsm303_dev * device , int16_t raw_value ) {
389
+ /**
390
+ * @brief Converts raw accelerometer data to acceleration in g units.
391
+ *
392
+ * This function converts a raw accelerometer value from the LSM303 device
393
+ * to acceleration in g units, considering the device's sensitivity
394
+ * and configuration settings.
395
+ *
396
+ * @param device Pointer to the LSM303 device structure containing
397
+ * configuration details such as sensitivity.
398
+ * @param raw_value The raw accelerometer data to be converted.
399
+ *
400
+ * @return
401
+ * The acceleration value in g units as a float.
402
+ */
403
+ float lsm303_convert_raw_to_g (lsm303_dev * device , int16_t raw_value ) {
374
404
float sensitivity = 0.0 ;
375
405
376
406
if (device -> acc_resolution == ACC_RESOLUTION_LOW ) {
@@ -443,7 +473,7 @@ float convert_raw_to_g(lsm303_dev *device, int16_t raw_value) {
443
473
}
444
474
}
445
475
446
- return (float )raw_value * sensitivity / 1000.0 ;
476
+ return (float )raw_value * sensitivity / ( float ) 1000.0 ;
447
477
}
448
478
449
479
/**
0 commit comments