1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#include "adxl375.hpp"
void ADXL375::initialize() {
//Configure power mode and ODR
buffer[0] = R_ADXL375_BW_RATE;
bw_rate.fields.LOW_POWER = B_ADXL375_BW_RATE_NORMAL_POWER_MODE;
bw_rate.fields.RATE = B_ADXL375_ODR_800_HZ;
buffer[1] = bw_rate.data;
i2c_write_blocking(i2c, addr, buffer, 2, false);
//Configure data output format
buffer[0] = R_ADXL375_DATA_FORMAT;
i2c_write_blocking(i2c, addr, buffer, 1, true);
i2c_read_blocking(i2c, addr, buffer, 1, false);
//Some reserved fields are set to 1, read byte and *then* set desired bits
data_format.data = buffer[0];
buffer[0] = R_ADXL375_DATA_FORMAT;
data_format.fields.JUSTIFY = B_ADXL375_DATA_FORMAT_JUSTIFY_RIGHT;
data_format.fields.INT_INVERT = B_ADXL375_DATA_FORMAT_INTERRUPT_ACTIVE_HIGH;
buffer[1] = data_format.data;
i2c_write_blocking(i2c, addr, buffer, 2, false);
//Set to measurement mode
buffer[0] = R_ADXL375_POWER_CTL;
power_ctl.fields.MEASURE = true;
buffer[1] = power_ctl.data;
i2c_write_blocking(i2c, addr, buffer, 2, false);
}
void ADXL375::sample() {
//Read DATAX0 - DATAZ1 as a block
buffer[0] = R_ADXL375_DATAX0;
i2c_write_blocking(i2c, addr, buffer, 1, true);
i2c_read_blocking(i2c, addr, buffer, 6, false);
//Split buffer into individual fields
ax = ((int16_t) buffer[0]) | ((int16_t) buffer[1] << 8);
ay = ((int16_t) buffer[2]) | ((int16_t) buffer[3] << 8);
az = ((int16_t) buffer[4]) | ((int16_t) buffer[5] << 8);
}
#if (USE_FREERTOS == 1)
void ADXL375::update_adxl375_task(void* pvParameters) {
TickType_t xLastWakeTime;
const TickType_t xFrequency = pdMS_TO_TICKS(1000 / ADXL375_SAMPLE_RATE_HZ);
xLastWakeTime = xTaskGetTickCount();
while (1) {
vTaskDelayUntil(&xLastWakeTime, xFrequency);
taskENTER_CRITICAL();
ADXL375* adxl375 = (ADXL375 *) pvParameters;
adxl375->sample();
taskEXIT_CRITICAL();
if ((xLastWakeTime + xFrequency) < xTaskGetTickCount()) {
xLastWakeTime = xTaskGetTickCount();
}
}
}
#endif
|