@@ -49,14 +49,29 @@ bool QwDevKX13X::initialize(uint8_t settings)
49
49
if (!enableAccel (true ))
50
50
return false ;
51
51
52
+ sfe_kx13x_cntl1_bitfield_t cntl1;
53
+ cntl1.all = 0 ; // Reset Value
54
+
52
55
if (settings == DEFAULT_SETTINGS)
56
+ {
53
57
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
+ }
54
64
55
65
if (settings == INT_SETTINGS)
56
66
{
57
67
enablePhysInterrupt ();
58
68
routeHardwareInterrupt (0x10 );
59
69
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
+ }
60
75
}
61
76
62
77
if (settings == BUFFER_SETTINGS)
@@ -66,6 +81,11 @@ bool QwDevKX13X::initialize(uint8_t settings)
66
81
enableSampleBuffer (); // Enable buffer
67
82
setBufferOperationMode (0x00 ); // FIFO
68
83
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
+ }
69
89
}
70
90
71
91
if (retVal != 0 )
@@ -79,9 +99,10 @@ bool QwDevKX13X::initialize(uint8_t settings)
79
99
//
80
100
// Resets the accelerometer
81
101
//
102
+ // To change the value of the SRST bit, the PC1 bit in CNTL1 register must first be set to 0.
103
+ //
82
104
bool QwDevKX13X::softwareReset ()
83
105
{
84
-
85
106
sfe_kx13x_cntl2_bitfield_t cntl2;
86
107
cntl2.all = 0 ;
87
108
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)
125
146
sfe_kx13x_cntl1_bitfield_t cntl1;
126
147
cntl1.all = tempVal;
127
148
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
128
150
tempVal = cntl1.all ;
129
151
130
152
retVal = writeRegisterByte (SFE_KX13X_CNTL1, tempVal);
@@ -154,6 +176,7 @@ int8_t QwDevKX13X::getOperatingMode()
154
176
155
177
sfe_kx13x_cntl1_bitfield_t cntl1;
156
178
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
157
180
158
181
return (cntl1.bits .pc1 ); // Return the operating mode bit
159
182
}
@@ -192,6 +215,8 @@ bool QwDevKX13X::setRange(uint8_t range)
192
215
if (retVal != 0 )
193
216
return false ;
194
217
218
+ _range = range; // Update our local copy
219
+
195
220
return true ;
196
221
}
197
222
@@ -216,6 +241,7 @@ bool QwDevKX13X::enableDataEngine(bool enable)
216
241
sfe_kx13x_cntl1_bitfield_t cntl1;
217
242
cntl1.all = tempVal;
218
243
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
219
245
tempVal = cntl1.all ;
220
246
221
247
retVal = writeRegisterByte (SFE_KX13X_CNTL1, tempVal);
@@ -247,6 +273,7 @@ bool QwDevKX13X::enableTapEngine(bool enable)
247
273
sfe_kx13x_cntl1_bitfield_t cntl1;
248
274
cntl1.all = tempVal;
249
275
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
250
277
tempVal = cntl1.all ;
251
278
252
279
retVal = writeRegisterByte (SFE_KX13X_CNTL1, tempVal);
@@ -278,6 +305,7 @@ bool QwDevKX13X::enableTiltEngine(bool enable)
278
305
sfe_kx13x_cntl1_bitfield_t cntl1;
279
306
cntl1.all = tempVal;
280
307
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
281
309
tempVal = cntl1.all ;
282
310
283
311
retVal = writeRegisterByte (SFE_KX13X_CNTL1, tempVal);
@@ -1621,21 +1649,23 @@ bool QwDevKX132::getAccelData(outputData *userData)
1621
1649
//
1622
1650
bool QwDevKX132::convAccelData (outputData *userAccel, rawOutputData *rawAccelData)
1623
1651
{
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;
1627
1656
1628
- retVal = readRegisterRegion (SFE_KX13X_CNTL1, ®Val, 1 );
1657
+ retVal = readRegisterRegion (SFE_KX13X_CNTL1, ®Val, 1 );
1629
1658
1630
- if (retVal != 0 )
1631
- return false ;
1659
+ if (retVal != 0 )
1660
+ return false ;
1632
1661
1633
- sfe_kx13x_cntl1_bitfield_t cntl1;
1634
- cntl1.all = regVal;
1662
+ sfe_kx13x_cntl1_bitfield_t cntl1;
1663
+ cntl1.all = regVal;
1635
1664
1636
- range = cntl1.bits .gsel ;
1665
+ _range = cntl1.bits .gsel ; // Record the range
1666
+ }
1637
1667
1638
- switch (range )
1668
+ switch (_range )
1639
1669
{
1640
1670
case SFE_KX132_RANGE2G:
1641
1671
userAccel->xData = (float )rawAccelData->xData * convRange2G;
@@ -1720,21 +1750,23 @@ bool QwDevKX134::getAccelData(outputData *userData)
1720
1750
//
1721
1751
bool QwDevKX134::convAccelData (outputData *userAccel, rawOutputData *rawAccelData)
1722
1752
{
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;
1726
1757
1727
- retVal = readRegisterRegion (SFE_KX13X_CNTL1, ®Val, 1 );
1758
+ retVal = readRegisterRegion (SFE_KX13X_CNTL1, ®Val, 1 );
1728
1759
1729
- if (retVal != 0 )
1730
- return false ;
1760
+ if (retVal != 0 )
1761
+ return false ;
1731
1762
1732
- sfe_kx13x_cntl1_bitfield_t cntl1;
1733
- cntl1.all = regVal;
1763
+ sfe_kx13x_cntl1_bitfield_t cntl1;
1764
+ cntl1.all = regVal;
1734
1765
1735
- range = cntl1.bits .gsel ;
1766
+ _range = cntl1.bits .gsel ; // Record the range
1767
+ }
1736
1768
1737
- switch (range )
1769
+ switch (_range )
1738
1770
{
1739
1771
case SFE_KX134_RANGE8G:
1740
1772
userAccel->xData = (float )rawAccelData->xData * convRange8G;
0 commit comments