12static void AIS3624DQ_readRegisters(
AIS3624DQ_t *, uint8_t, uint8_t, uint8_t *);
13static uint8_t AIS3624DQ_readRegister(
AIS3624DQ_t *, uint8_t);
14static void AIS3624DQ_writeRegister(
AIS3624DQ_t *, uint8_t, uint8_t);
48 memcpy(accel->
base.
axes, axes, AIS3624DQ_DATA_COUNT);
49 memcpy(accel->
base.
sign, sign, AIS3624DQ_DATA_COUNT);
54 FS = AIS3624DQ_CTRL_REG4_FS(24);
55 accel->
base.sensitivity = AIS3624DQ_SENSITIVITY(24);
56 }
else if (scale == 12) {
58 FS = AIS3624DQ_CTRL_REG4_FS(12);
59 accel->
base.sensitivity = AIS3624DQ_SENSITIVITY(12);
60 }
else if (scale == 6) {
62 FS = AIS3624DQ_CTRL_REG4_FS(6);
63 accel->
base.sensitivity = AIS3624DQ_SENSITIVITY(6);
66 AIS3624DQ_writeRegister(
69 (AIS3624DQ_CTRL_REG1_DR_1000
70 | AIS3624DQ_CTRL_REG1_PM_NORMAL
71 | AIS3624DQ_CTRL_REG1_XEN
72 | AIS3624DQ_CTRL_REG1_YEN
73 | AIS3624DQ_CTRL_REG1_ZEN)
77 AIS3624DQ_writeRegister(accel, AIS3624DQ_CTRL_REG4, FS | AIS3624DQ_CTRL_REG4_BDU);
123 out[0] = accel->
sign[0] * accel->sensitivity * (int16_t)(((uint16_t)bytes[0] << 8) | bytes[1]);
124 out[1] = accel->
sign[1] * accel->sensitivity * (int16_t)(((uint16_t)bytes[2] << 8) | bytes[3]);
125 out[2] = accel->
sign[2] * accel->sensitivity * (int16_t)(((uint16_t)bytes[4] << 8) | bytes[5]);
139#define INDEX_AXES(index, byte) 2 * accel->axes[index] + byte
140 uint8_t tmp[AIS3624DQ_DATA_TOTAL];
141 AIS3624DQ_readRegisters((
AIS3624DQ_t *)accel, AIS3624DQ_XOUT_L, AIS3624DQ_DATA_TOTAL, tmp);
142 out[INDEX_AXES(0, 1)] = tmp[0];
143 out[INDEX_AXES(0, 0)] = tmp[1];
144 out[INDEX_AXES(1, 1)] = tmp[2];
145 out[INDEX_AXES(1, 0)] = tmp[3];
146 out[INDEX_AXES(2, 1)] = tmp[4];
147 out[INDEX_AXES(2, 0)] = tmp[5];
153void AIS3624DQ_writeRegister(
AIS3624DQ_t *accel, uint8_t address, uint8_t data) {
161 uint8_t payload = address & 0x7F;
169uint8_t AIS3624DQ_readRegister(
AIS3624DQ_t *accel, uint8_t address) {
170 uint8_t response = 0;
178 uint8_t payload = address | 0x80;
179 response = spi->
transmit(spi, payload);
180 response = spi->
transmit(spi, 0xFF);
188void AIS3624DQ_readRegisters(
AIS3624DQ_t *accel, uint8_t address, uint8_t count, uint8_t *out) {
196 uint8_t payload = address | 0xC0;
200 for (uint8_t i = 0; i < count; i++) {
AIS3624DQ_t AIS3624DQ_init(AIS3624DQ_t *accel, SPI_t *spi, GPIOpin_t cs, uint8_t scale, const uint8_t *axes, const int8_t *sign)
Initialiser for a AIS3624DQ accelerometer.
void AIS3624DQ_readRawBytes(Accel_t *, uint8_t *)
Read raw 3-axis data.
void AIS3624DQ_processRawBytes(Accel_t *, uint8_t *, float *)
Process raw 3-axis data to floating point accelerations.
void AIS3624DQ_update(Accel_t *)
Updates internally stored acceleration readings.
void AIS3624DQ_readAccel(Accel_t *, float *)
Read 3-axis floating point accelerations.
void(* processRawBytes)(struct Accel *accel, uint8_t *bytes, float *out)
Pointer to processRawBytes method.
uint8_t * rawAccelData
Pointer to driver defined raw data array.
void(* update)(struct Accel *accel)
Pointer to update method.
void(* readAccel)(struct Accel *accel, float *out)
Pointer to readAccel method.
float * accelData
Pointer to driver defined data array.
uint8_t * axes
Pointer to driver defined axes.
int8_t * sign
Pointer to driver defined signs.
void(* readRawBytes)(struct Accel *accel, uint8_t *out)
Pointer to readRawBytes method.
uint8_t dataSize
Total data size.
void(* set)(struct GPIOpin *)
void(* reset)(struct GPIOpin *)
Struct definition for a GPIO pin.
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...
uint8_t rawAccelData[AIS3624DQ_DATA_TOTAL]
Raw accelerations array.
uint8_t axes[AIS3624DQ_DATA_COUNT]
Array defining axes of mounting.
GPIOpin_t cs
Chip select GPIO.
float accelData[AIS3624DQ_DATA_COUNT]
Processed accelerations array.
Accel_t base
Base accelerometer API.
int8_t sign[AIS3624DQ_DATA_COUNT]
Array defining sign of axes.
SPI_t * spi
Parent SPI interface.