11#include "kx134_1211.h"
27 char name[DEVICE_NAME_LENGTH],
39 memcpy(accel->
axes, axes, KX134_1211_DATA_COUNT);
40 memcpy(accel->
sign, sign, KX134_1211_DATA_COUNT);
45 GSEL = KX134_1211_CNTL1_GSEL(32);
47 }
else if (scale == 16) {
48 GSEL = KX134_1211_CNTL1_GSEL(16);
53 KX134_1211_writeRegister(accel, 0x7F, 0x00);
54 KX134_1211_writeRegister(accel, 0x1C, 0x00);
55 KX134_1211_writeRegister(accel, 0x1C, 0x80);
57 const uint32_t superDelay = 0xFFFF;
58 volatile uint8_t counter = 0;
61 for (uint32_t i = 0; i < superDelay; i++) {
65 uint8_t chipID = KX134_1211_readRegister(accel, 0x13);
66 uint8_t cotr = KX134_1211_readRegister(accel, 0x12);
69 KX134_1211_writeRegister(accel, KX134_1211_CNTL1, KX134_1211_CNTL1_RES | GSEL);
70 uint8_t ODCNTL = KX134_1211_readRegister(accel, KX134_1211_ODCNTL);
71 KX134_1211_writeRegister(accel, KX134_1211_ODCNTL, (KX134_1211_ODCNTL_RESERVED & ODCNTL) | 0x2A);
72 KX134_1211_writeRegister(accel, KX134_1211_CNTL1, KX134_1211_CNTL1_PC1 | KX134_1211_CNTL1_RES | GSEL);
75 strcpy(handle.name, name);
76 handle.device = accel;
120 out[0] = accel->
sign[0] * accel->
sensitivity * (int16_t)(((uint16_t)bytes[0] << 8) | bytes[1]);
121 out[1] = accel->
sign[1] * accel->
sensitivity * (int16_t)(((uint16_t)bytes[2] << 8) | bytes[3]);
122 out[2] = accel->
sign[2] * accel->
sensitivity * (int16_t)(((uint16_t)bytes[4] << 8) | bytes[5]);
136#define INDEX_AXES(index, byte) 2 * accel->axes[index] + byte
137 uint8_t tmp[KX134_1211_DATA_TOTAL];
138 KX134_1211_readRegisters(accel, KX134_1211_XOUT_L, KX134_1211_DATA_TOTAL, tmp);
139 out[INDEX_AXES(0, 1)] = tmp[0];
140 out[INDEX_AXES(0, 0)] = tmp[1];
141 out[INDEX_AXES(1, 1)] = tmp[2];
142 out[INDEX_AXES(1, 0)] = tmp[3];
143 out[INDEX_AXES(2, 1)] = tmp[4];
144 out[INDEX_AXES(2, 0)] = tmp[5];
150void KX134_1211_writeRegister(
KX134_1211 *accel, uint8_t address, uint8_t data) {
153 spi.
port->ODR &= ~spi.cs;
155 while ((spi.
interface->SR & SPI_SR_TXE) == 0);
157 while ((spi.
interface->SR & SPI_SR_RXNE) == 0);
159 while ((spi.
interface->SR & SPI_SR_TXE) == 0);
161 while ((spi.
interface->SR & SPI_SR_RXNE) == 0);
163 while ((spi.
interface->SR & SPI_SR_BSY) == SPI_SR_BSY);
168uint8_t KX134_1211_readRegister(
KX134_1211 *accel, uint8_t address) {
169 uint8_t response = 0;
172 spi.
port->ODR &= ~spi.cs;
175 uint8_t payload = address | 0x80;
176 response = spi.
transmit(&spi, payload);
177 response = spi.
transmit(&spi, 0xFF);
184void KX134_1211_readRegisters(
KX134_1211 *accel, uint8_t address, uint8_t count, uint8_t *out) {
187 spi.
port->ODR &= ~spi.cs;
189 while ((spi.
interface->SR & SPI_SR_TXE) == 0);
191 while ((spi.
interface->SR & SPI_SR_RXNE) == 0);
194 for (
int i = 0; i < count; i++) {
195 while ((spi.
interface->SR & SPI_SR_TXE) == 0);
197 while ((spi.
interface->SR & SPI_SR_RXNE) == 0);
201 while ((spi.
interface->SR & SPI_SR_BSY) == SPI_SR_BSY);
void KX134_1211_readAccel(KX134_1211 *, float *)
Read 3-axis floating point accelerations.
void KX134_1211_processRawBytes(KX134_1211 *, uint8_t *, float *)
Process raw 3-axis data to floating point accelerations.
void KX134_1211_readRawBytes(KX134_1211 *, uint8_t *)
Read raw 3-axis data.
void KX134_1211_update(KX134_1211 *)
Updates internally stored acceleration readings.
DeviceHandle_t KX134_1211_init(KX134_1211 *accel, char name[DEVICE_NAME_LENGTH], GPIO_TypeDef *port, unsigned long cs, uint8_t scale, const uint8_t *axes, const int8_t *sign)
Initialiser for a KX134-1211 accelerometer.
void SPI_init(SPI *, DeviceType, SPI_TypeDef *, DataFormat, GPIO_TypeDef *, unsigned long)
Initialiser for an SPI device interface.
@ SENSOR_ACCEL
Accelerometer.
uint8_t axes[KX134_1211_DATA_COUNT]
Array defining axes of mounting.
void(* update)(struct KX134_1211 *)
Accel update method.
SPI base
Parent SPI interface.
void(* processRawBytes)(struct KX134_1211 *, uint8_t *, float *)
Process raw accel method.
void(* readRawBytes)(struct KX134_1211 *, uint8_t *)
Raw accel read method.
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.
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
GPIO_TypeDef * port
Pointer to GPIO port struct.
unsigned long cs
Device chip select address.
SPI_TypeDef * interface
Pointer to SPI interface struct.