46 memcpy(&accel->
axes, axes, KX134_1211_DATA_COUNT);
47 memcpy(&accel->
sign, sign, KX134_1211_DATA_COUNT);
52 GSEL = KX134_1211_CNTL1_GSEL(32);
53 accel->
base.sensitivity = KX134_1211_SENSITIVITY(32);
54 }
else if (scale == 16) {
55 GSEL = KX134_1211_CNTL1_GSEL(16);
56 accel->
base.sensitivity = KX134_1211_SENSITIVITY(16);
60 KX134_1211_writeRegister(accel, 0x7F, 0x00);
61 KX134_1211_writeRegister(accel, 0x1C, 0x00);
62 KX134_1211_writeRegister(accel, 0x1C, 0x80);
65 for (uint32_t i = 0; i < 0xFFFF; i++);
69 uint8_t chipID = KX134_1211_readRegister(accel, 0x13);
70 uint8_t cotr = KX134_1211_readRegister(accel, 0x12);
73 KX134_1211_writeRegister(accel, KX134_1211_CNTL1, KX134_1211_CNTL1_RES | GSEL);
74 uint8_t ODCNTL = KX134_1211_readRegister(accel, KX134_1211_ODCNTL);
75 KX134_1211_writeRegister(accel, KX134_1211_ODCNTL, (KX134_1211_ODCNTL_RESERVED & ODCNTL) | 0x2A);
76 KX134_1211_writeRegister(accel, KX134_1211_CNTL1, KX134_1211_CNTL1_PC1 | KX134_1211_CNTL1_RES | GSEL);
122 out[0] = accel->
sign[0] * accel->sensitivity * (int16_t)(((uint16_t)bytes[0] << 8) | bytes[1]);
123 out[1] = accel->
sign[1] * accel->sensitivity * (int16_t)(((uint16_t)bytes[2] << 8) | bytes[3]);
124 out[2] = accel->
sign[2] * accel->sensitivity * (int16_t)(((uint16_t)bytes[4] << 8) | bytes[5]);
138#define INDEX_AXES(index, byte) 2 * accel->axes[index] + byte
139 uint8_t tmp[KX134_1211_DATA_TOTAL];
140 KX134_1211_readRegisters((
KX134_1211_t *)accel, KX134_1211_XOUT_L, KX134_1211_DATA_TOTAL, tmp);
141 out[INDEX_AXES(0, 1)] = tmp[0];
142 out[INDEX_AXES(0, 0)] = tmp[1];
143 out[INDEX_AXES(1, 1)] = tmp[2];
144 out[INDEX_AXES(1, 0)] = tmp[3];
145 out[INDEX_AXES(2, 1)] = tmp[4];
146 out[INDEX_AXES(2, 0)] = tmp[5];
152void KX134_1211_writeRegister(
KX134_1211_t *accel, uint8_t address, uint8_t data) {
160 uint8_t payload = address & 0x7F;
168uint8_t KX134_1211_readRegister(
KX134_1211_t *accel, uint8_t address) {
169 uint8_t response = 0;
177 uint8_t payload = address | 0x80;
178 response = spi->
transmit(spi, payload);
179 response = spi->
transmit(spi, 0xFF);
187void KX134_1211_readRegisters(
KX134_1211_t *accel, uint8_t address, uint8_t count, uint8_t *out) {
195 uint8_t payload = address | 0x80;
199 for (uint8_t i = 0; i < count; i++) {
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.
uint8_t axes[KX134_1211_DATA_COUNT]
Array defining axes of mounting.
GPIOpin_t cs
Chip select GPIO.
float accelData[KX134_1211_DATA_COUNT]
Processed accelerations array.
Accel_t base
Base accelerometer API.
uint8_t rawAccelData[KX134_1211_DATA_TOTAL]
Raw accelerations array.
int8_t sign[KX134_1211_DATA_COUNT]
Array defining sign of axes.
SPI_t * spi
Parent SPI interface.
void KX134_1211_processRawBytes(Accel_t *, uint8_t *, float *)
Process raw 3-axis data to floating point accelerations.
void KX134_1211_update(Accel_t *)
Update internally stored acceleration readings.
void KX134_1211_readAccel(Accel_t *, float *)
Read 3-axis floating point accelerations.
KX134_1211_t KX134_1211_init(KX134_1211_t *accel, SPI_t *spi, GPIOpin_t cs, uint8_t scale, const uint8_t *axes, const int8_t *sign)
Initialiser for a KX134-1211 accelerometer.
void KX134_1211_readRawBytes(Accel_t *, uint8_t *)
Read raw 3-axis data.
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...