Skip to content

Commit c8bc3e1

Browse files
committed
Add _range to improve convAccelData
1 parent cd5db07 commit c8bc3e1

File tree

2 files changed

+56
-23
lines changed

2 files changed

+56
-23
lines changed

src/SparkFun_Qwiic_KX13X.cpp

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,29 @@ bool QwDevKX13X::initialize(uint8_t settings)
4949
if (!enableAccel(true))
5050
return false;
5151

52+
sfe_kx13x_cntl1_bitfield_t cntl1;
53+
cntl1.all = 0; // Reset Value
54+
5255
if (settings == DEFAULT_SETTINGS)
56+
{
5357
retVal = writeRegisterByte(SFE_KX13X_CNTL1, DEFAULT_SETTINGS);
58+
if (retVal == 0) // Check the write was successful
59+
{
60+
cntl1.all = DEFAULT_SETTINGS;
61+
_range = cntl1.bits.gsel; // Record the G-range
62+
}
63+
}
5464

5565
if (settings == INT_SETTINGS)
5666
{
5767
enablePhysInterrupt();
5868
routeHardwareInterrupt(0x10);
5969
retVal = writeRegisterByte(SFE_KX13X_CNTL1, INT_SETTINGS);
70+
if (retVal == 0) // Check the write was successful
71+
{
72+
cntl1.all = INT_SETTINGS;
73+
_range = cntl1.bits.gsel; // Record the G-range
74+
}
6075
}
6176

6277
if (settings == BUFFER_SETTINGS)
@@ -66,6 +81,11 @@ bool QwDevKX13X::initialize(uint8_t settings)
6681
enableSampleBuffer(); // Enable buffer
6782
setBufferOperationMode(0x00); // FIFO
6883
retVal = writeRegisterByte(SFE_KX13X_CNTL1, INT_SETTINGS);
84+
if (retVal == 0) // Check the write was successful
85+
{
86+
cntl1.all = INT_SETTINGS;
87+
_range = cntl1.bits.gsel; // Record the G-range
88+
}
6989
}
7090

7191
if (retVal != 0)
@@ -79,9 +99,10 @@ bool QwDevKX13X::initialize(uint8_t settings)
7999
//
80100
// Resets the accelerometer
81101
//
102+
// To change the value of the SRST bit, the PC1 bit in CNTL1 register must first be set to 0.
103+
//
82104
bool QwDevKX13X::softwareReset()
83105
{
84-
85106
sfe_kx13x_cntl2_bitfield_t cntl2;
86107
cntl2.all = 0;
87108
cntl2.bits.srst = 1; // This is a long winded, but definitive way of setting the software reset bit
@@ -125,6 +146,7 @@ bool QwDevKX13X::enableAccel(bool enable)
125146
sfe_kx13x_cntl1_bitfield_t cntl1;
126147
cntl1.all = tempVal;
127148
cntl1.bits.pc1 = enable; // This is a long winded but definitive way of setting/clearing the operating mode bit
149+
_range = cntl1.bits.gsel; // Update the G-range
128150
tempVal = cntl1.all;
129151

130152
retVal = writeRegisterByte(SFE_KX13X_CNTL1, tempVal);
@@ -154,6 +176,7 @@ int8_t QwDevKX13X::getOperatingMode()
154176

155177
sfe_kx13x_cntl1_bitfield_t cntl1;
156178
cntl1.all = tempVal; // This is a long winded but definitive way of getting the operating mode bit
179+
_range = cntl1.bits.gsel; // Update the G-range
157180

158181
return (cntl1.bits.pc1); // Return the operating mode bit
159182
}
@@ -192,6 +215,8 @@ bool QwDevKX13X::setRange(uint8_t range)
192215
if (retVal != 0)
193216
return false;
194217

218+
_range = range; // Update our local copy
219+
195220
return true;
196221
}
197222

@@ -216,6 +241,7 @@ bool QwDevKX13X::enableDataEngine(bool enable)
216241
sfe_kx13x_cntl1_bitfield_t cntl1;
217242
cntl1.all = tempVal;
218243
cntl1.bits.drdye = enable; // This is a long winded but definitive way of setting/clearing the data ready engine bit
244+
_range = cntl1.bits.gsel; // Update the G-range
219245
tempVal = cntl1.all;
220246

221247
retVal = writeRegisterByte(SFE_KX13X_CNTL1, tempVal);
@@ -247,6 +273,7 @@ bool QwDevKX13X::enableTapEngine(bool enable)
247273
sfe_kx13x_cntl1_bitfield_t cntl1;
248274
cntl1.all = tempVal;
249275
cntl1.bits.tdte = enable; // This is a long winded but definitive way of setting/clearing the tap engine bit
276+
_range = cntl1.bits.gsel; // Update the G-range
250277
tempVal = cntl1.all;
251278

252279
retVal = writeRegisterByte(SFE_KX13X_CNTL1, tempVal);
@@ -278,6 +305,7 @@ bool QwDevKX13X::enableTiltEngine(bool enable)
278305
sfe_kx13x_cntl1_bitfield_t cntl1;
279306
cntl1.all = tempVal;
280307
cntl1.bits.tpe = enable; // This is a long winded but definitive way of setting/clearing the tilt engine bit
308+
_range = cntl1.bits.gsel; // Update the G-range
281309
tempVal = cntl1.all;
282310

283311
retVal = writeRegisterByte(SFE_KX13X_CNTL1, tempVal);
@@ -1621,21 +1649,23 @@ bool QwDevKX132::getAccelData(outputData *userData)
16211649
//
16221650
bool QwDevKX132::convAccelData(outputData *userAccel, rawOutputData *rawAccelData)
16231651
{
1624-
uint8_t regVal;
1625-
uint8_t range;
1626-
int retVal;
1652+
if (_range < 0) // If the G-range is unknown, read it
1653+
{
1654+
uint8_t regVal;
1655+
int retVal;
16271656

1628-
retVal = readRegisterRegion(SFE_KX13X_CNTL1, &regVal, 1);
1657+
retVal = readRegisterRegion(SFE_KX13X_CNTL1, &regVal, 1);
16291658

1630-
if (retVal != 0)
1631-
return false;
1659+
if (retVal != 0)
1660+
return false;
16321661

1633-
sfe_kx13x_cntl1_bitfield_t cntl1;
1634-
cntl1.all = regVal;
1662+
sfe_kx13x_cntl1_bitfield_t cntl1;
1663+
cntl1.all = regVal;
16351664

1636-
range = cntl1.bits.gsel;
1665+
_range = cntl1.bits.gsel; // Record the range
1666+
}
16371667

1638-
switch (range)
1668+
switch (_range)
16391669
{
16401670
case SFE_KX132_RANGE2G:
16411671
userAccel->xData = (float)rawAccelData->xData * convRange2G;
@@ -1720,21 +1750,23 @@ bool QwDevKX134::getAccelData(outputData *userData)
17201750
//
17211751
bool QwDevKX134::convAccelData(outputData *userAccel, rawOutputData *rawAccelData)
17221752
{
1723-
uint8_t regVal;
1724-
uint8_t range;
1725-
int retVal;
1753+
if (_range < 0) // If the G-range is unknown, read it
1754+
{
1755+
uint8_t regVal;
1756+
int retVal;
17261757

1727-
retVal = readRegisterRegion(SFE_KX13X_CNTL1, &regVal, 1);
1758+
retVal = readRegisterRegion(SFE_KX13X_CNTL1, &regVal, 1);
17281759

1729-
if (retVal != 0)
1730-
return false;
1760+
if (retVal != 0)
1761+
return false;
17311762

1732-
sfe_kx13x_cntl1_bitfield_t cntl1;
1733-
cntl1.all = regVal;
1763+
sfe_kx13x_cntl1_bitfield_t cntl1;
1764+
cntl1.all = regVal;
17341765

1735-
range = cntl1.bits.gsel;
1766+
_range = cntl1.bits.gsel; // Record the range
1767+
}
17361768

1737-
switch (range)
1769+
switch (_range)
17381770
{
17391771
case SFE_KX134_RANGE8G:
17401772
userAccel->xData = (float)rawAccelData->xData * convRange8G;

src/SparkFun_Qwiic_KX13X.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@
7979

8080
#define SPI_READ 0x80 // OR'ed at most sig BIT with register address
8181

82-
#define DEFAULT_SETTINGS 0xC0
83-
#define INT_SETTINGS 0xE0
82+
#define DEFAULT_SETTINGS 0xC0 // CNTL1: Hi-Performance mode; Data-Ready disabled; minimum G-range; Tap & Tilt disabled
83+
#define INT_SETTINGS 0xE0 // CNTL1: Hi-Performance mode; Data-Ready enabled; minimum G-range; Tap & Tilt disabled
8484
#define SOFT_INT_SETTINGS 0xE1
8585
#define BUFFER_SETTINGS 0xE2
8686
#define TILT_SETTINGS 0xE3
@@ -179,6 +179,7 @@ class QwDevKX13X
179179
sfe_KX13X::QwIDeviceBus *_sfeBus;
180180
uint8_t _i2cAddress;
181181
uint8_t _cs;
182+
int _range = -1; // Keep a local copy of the range. Default to "unknown" (-1).
182183
};
183184

184185
class QwDevKX132 : public QwDevKX13X

0 commit comments

Comments
 (0)