11#include "kx134_1211.h"
41 memcpy(accel->
axes, axes, KX134_1211_DATA_COUNT);
42 memcpy(accel->
sign, sign, KX134_1211_DATA_COUNT);
47 GSEL = KX134_1211_CNTL1_GSEL(32);
49 }
else if (scale == 16) {
50 GSEL = KX134_1211_CNTL1_GSEL(16);
55 KX134_1211_writeRegister(accel, 0x7F, 0x00);
56 KX134_1211_writeRegister(accel, 0x1C, 0x00);
57 KX134_1211_writeRegister(accel, 0x1C, 0x80);
60 for (uint32_t i = 0; i < 0xFFFF; i++);
64 uint8_t chipID = KX134_1211_readRegister(accel, 0x13);
65 uint8_t cotr = KX134_1211_readRegister(accel, 0x12);
68 KX134_1211_writeRegister(accel, KX134_1211_CNTL1, KX134_1211_CNTL1_RES | GSEL);
69 uint8_t ODCNTL = KX134_1211_readRegister(accel, KX134_1211_ODCNTL);
70 KX134_1211_writeRegister(accel, KX134_1211_ODCNTL, (KX134_1211_ODCNTL_RESERVED & ODCNTL) | 0x2A);
71 KX134_1211_writeRegister(accel, KX134_1211_CNTL1, KX134_1211_CNTL1_PC1 | KX134_1211_CNTL1_RES | GSEL);
116 out[0] = accel->
sign[0] * accel->
sensitivity * (int16_t)(((uint16_t)bytes[0] << 8) | bytes[1]);
117 out[1] = accel->
sign[1] * accel->
sensitivity * (int16_t)(((uint16_t)bytes[2] << 8) | bytes[3]);
118 out[2] = accel->
sign[2] * accel->
sensitivity * (int16_t)(((uint16_t)bytes[4] << 8) | bytes[5]);
132#define INDEX_AXES(index, byte) 2 * accel->axes[index] + byte
133 uint8_t tmp[KX134_1211_DATA_TOTAL];
134 KX134_1211_readRegisters(accel, KX134_1211_XOUT_L, KX134_1211_DATA_TOTAL, tmp);
135 out[INDEX_AXES(0, 1)] = tmp[0];
136 out[INDEX_AXES(0, 0)] = tmp[1];
137 out[INDEX_AXES(1, 1)] = tmp[2];
138 out[INDEX_AXES(1, 0)] = tmp[3];
139 out[INDEX_AXES(2, 1)] = tmp[4];
140 out[INDEX_AXES(2, 0)] = tmp[5];
146void KX134_1211_writeRegister(
KX134_1211_t *accel, uint8_t address, uint8_t data) {
154 uint8_t payload = address & 0x7F;
162uint8_t KX134_1211_readRegister(
KX134_1211_t *accel, uint8_t address) {
163 uint8_t response = 0;
171 uint8_t payload = address | 0x80;
172 response = spi->
transmit(spi, payload);
173 response = spi->
transmit(spi, 0xFF);
181void KX134_1211_readRegisters(
KX134_1211_t *accel, uint8_t address, uint8_t count, uint8_t *out) {
189 uint8_t payload = address | 0x80;
193 for (uint8_t i = 0; i < count; i++) {
void(* set)(struct GPIOpin *)
void(* reset)(struct GPIOpin *)
Struct definition for a GPIO pin.
void KX134_1211_processRawBytes(KX134_1211_t *, uint8_t *, float *)
Process raw 3-axis data to floating point accelerations.
void KX134_1211_readAccel(KX134_1211_t *, float *)
Read 3-axis floating point accelerations.
void KX134_1211_update(KX134_1211_t *)
Updates internally stored acceleration readings.
void KX134_1211_readRawBytes(KX134_1211_t *, uint8_t *)
Read raw 3-axis data.
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.
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 axes[KX134_1211_DATA_COUNT]
Array defining axes of mounting.
void(* update)(struct KX134_1211 *)
Accel update method.
GPIOpin_t cs
Chip select GPIO.
void(* processRawBytes)(struct KX134_1211 *, uint8_t *, float *)
Process raw accel method.
void(* readRawBytes)(struct KX134_1211 *, uint8_t *)
Raw accel read method.
SPI_t * base
Parent SPI interface.
float accelData[KX134_1211_DATA_COUNT]
Processed accelerations array.
uint8_t rawAccelData[KX134_1211_DATA_TOTAL]
Raw accelerations array.
int8_t sign[KX134_1211_DATA_COUNT]
Array defining sign of axes.
float sensitivity
Accelerometer sensitivity.
void(* readAccel)(struct KX134_1211 *, float *)
Accel read method.