@@ -80,7 +80,7 @@ bool Adafruit_LSM9DS0::begin()
80
80
}
81
81
82
82
uint8_t id = read8 (XMTYPE, LSM9DS0_REGISTER_WHO_AM_I_XM);
83
- // Serial.print ("XM whoami: 0x");
83
+ // Serial.print ("XM whoami: 0x");
84
84
// Serial.println(id, HEX);
85
85
if (id != LSM9DS0_XM_ID)
86
86
return false ;
@@ -123,98 +123,83 @@ bool Adafruit_LSM9DS0::begin()
123
123
***************************************************************************/
124
124
void Adafruit_LSM9DS0::read ()
125
125
{
126
- if (_i2c) {
127
- // Read the accelerometer
128
- Wire.beginTransmission ((byte)LSM9DS0_ADDRESS_ACCELMAG);
129
- Wire.write (0x80 | LSM9DS0_REGISTER_OUT_X_L_A);
130
- Wire.endTransmission ();
131
- Wire.requestFrom ((byte)LSM9DS0_ADDRESS_ACCELMAG, (byte)6 );
132
-
133
- // Wait around until enough data is available
134
- while (Wire.available () < 6 );
135
-
136
- uint8_t xlo = Wire.read ();
137
- int16_t xhi = Wire.read ();
138
- uint8_t ylo = Wire.read ();
139
- int16_t yhi = Wire.read ();
140
- uint8_t zlo = Wire.read ();
141
- int16_t zhi = Wire.read ();
142
-
143
- // Shift values to create properly formed integer (low byte first)
144
- xhi <<= 8 ; xhi |= xlo;
145
- yhi <<= 8 ; yhi |= ylo;
146
- zhi <<= 8 ; zhi |= zlo;
147
- accelData.x = xhi;
148
- accelData.y = yhi;
149
- accelData.z = zhi;
150
-
151
- // Read the magnetometer
152
- Wire.beginTransmission ((byte)LSM9DS0_ADDRESS_ACCELMAG);
153
- Wire.write (0x80 | LSM9DS0_REGISTER_OUT_X_L_M);
154
- Wire.endTransmission ();
155
- Wire.requestFrom ((byte)LSM9DS0_ADDRESS_ACCELMAG, (byte)6 );
156
-
157
- // Wait around until enough data is available
158
- while (Wire.available () < 6 );
159
-
160
- // Note high before low (different than accel)
161
- xlo = Wire.read ();
162
- xhi = Wire.read ();
163
- ylo = Wire.read ();
164
- yhi = Wire.read ();
165
- zlo = Wire.read ();
166
- zhi = Wire.read ();
167
-
168
- // Shift values to create properly formed integer (low byte first)
169
- xhi <<= 8 ; xhi |= xlo;
170
- yhi <<= 8 ; yhi |= ylo;
171
- zhi <<= 8 ; zhi |= zlo;
172
- magData.x = xhi;
173
- magData.y = yhi;
174
- magData.z = zhi;
175
-
176
- // Read gyro
177
- Wire.beginTransmission ((byte)LSM9DS0_ADDRESS_GYRO);
178
- Wire.write (0x80 | LSM9DS0_REGISTER_OUT_X_L_G);
179
- Wire.endTransmission ();
180
- Wire.requestFrom ((byte)LSM9DS0_ADDRESS_GYRO, (byte)6 );
181
-
182
- // Wait around until enough data is available
183
- while (Wire.available () < 6 );
184
-
185
- xlo = Wire.read ();
186
- xhi = Wire.read ();
187
- ylo = Wire.read ();
188
- yhi = Wire.read ();
189
- zlo = Wire.read ();
190
- zhi = Wire.read ();
191
- // Shift values to create properly formed integer (low byte first)
192
- xhi <<= 8 ; xhi |= xlo;
193
- yhi <<= 8 ; yhi |= ylo;
194
- zhi <<= 8 ; zhi |= zlo;
195
-
196
- gyroData.x = xhi;
197
- gyroData.y = yhi;
198
- gyroData.z = zhi;
199
-
200
- // Read temp sensor
201
- Wire.beginTransmission ((byte)LSM9DS0_ADDRESS_ACCELMAG);
202
- Wire.write (0x80 | LSM9DS0_REGISTER_TEMP_OUT_L_XM);
203
- Wire.endTransmission ();
204
- Wire.requestFrom ((byte)LSM9DS0_ADDRESS_ACCELMAG, (byte)2 );
205
-
206
- // Wait around until enough data is available
207
- while (Wire.available () < 2 );
208
-
209
- xlo = Wire.read ();
210
- xhi = Wire.read ();
126
+ byte buffer[6 ];
211
127
212
- xhi <<= 8 ; xhi |= xlo;
213
-
214
- // Shift values to create properly formed integer (low byte first)
215
- temperature = xhi;
216
- }
128
+ // Read the accelerometer
129
+ readBuffer (XMTYPE,
130
+ 0x80 | LSM9DS0_REGISTER_OUT_X_L_A,
131
+ 6 , buffer);
132
+
133
+ uint8_t xlo = buffer[0 ];
134
+ int16_t xhi = buffer[1 ];
135
+ uint8_t ylo = buffer[2 ];
136
+ int16_t yhi = buffer[3 ];
137
+ uint8_t zlo = buffer[4 ];
138
+ int16_t zhi = buffer[5 ];
139
+
140
+ // Shift values to create properly formed integer (low byte first)
141
+ xhi <<= 8 ; xhi |= xlo;
142
+ yhi <<= 8 ; yhi |= ylo;
143
+ zhi <<= 8 ; zhi |= zlo;
144
+ accelData.x = xhi;
145
+ accelData.y = yhi;
146
+ accelData.z = zhi;
147
+
148
+
149
+ // Read the magnetometer
150
+ readBuffer (XMTYPE,
151
+ 0x80 | LSM9DS0_REGISTER_OUT_X_L_M,
152
+ 6 , buffer);
153
+
154
+ xlo = buffer[0 ];
155
+ xhi = buffer[1 ];
156
+ ylo = buffer[2 ];
157
+ yhi = buffer[3 ];
158
+ zlo = buffer[4 ];
159
+ zhi = buffer[5 ];
160
+
161
+ // Shift values to create properly formed integer (low byte first)
162
+ xhi <<= 8 ; xhi |= xlo;
163
+ yhi <<= 8 ; yhi |= ylo;
164
+ zhi <<= 8 ; zhi |= zlo;
165
+ magData.x = xhi;
166
+ magData.y = yhi;
167
+ magData.z = zhi;
168
+
169
+ // Read gyro
170
+ readBuffer (GYROTYPE,
171
+ 0x80 | LSM9DS0_REGISTER_OUT_X_L_G,
172
+ 6 , buffer);
173
+
174
+ xlo = buffer[0 ];
175
+ xhi = buffer[1 ];
176
+ ylo = buffer[2 ];
177
+ yhi = buffer[3 ];
178
+ zlo = buffer[4 ];
179
+ zhi = buffer[5 ];
180
+
181
+ // Shift values to create properly formed integer (low byte first)
182
+ xhi <<= 8 ; xhi |= xlo;
183
+ yhi <<= 8 ; yhi |= ylo;
184
+ zhi <<= 8 ; zhi |= zlo;
185
+
186
+ gyroData.x = xhi;
187
+ gyroData.y = yhi;
188
+ gyroData.z = zhi;
189
+
190
+ // Read temp sensor
191
+ readBuffer (XMTYPE,
192
+ 0x80 | LSM9DS0_REGISTER_TEMP_OUT_L_XM,
193
+ 2 , buffer);
194
+ xlo = buffer[0 ];
195
+ xhi = buffer[1 ];
196
+
197
+ xhi <<= 8 ; xhi |= xlo;
198
+
199
+ // Shift values to create properly formed integer (low byte first)
200
+ temperature = xhi;
217
201
202
+
218
203
}
219
204
220
205
@@ -460,9 +445,17 @@ void Adafruit_LSM9DS0::write8(boolean type, byte reg, byte value)
460
445
}
461
446
462
447
byte Adafruit_LSM9DS0::read8 (boolean type, byte reg)
448
+ {
449
+ uint8_t value;
450
+
451
+ readBuffer (type, reg, 1 , &value);
452
+
453
+ return value;
454
+ }
455
+
456
+ byte Adafruit_LSM9DS0::readBuffer (boolean type, byte reg, byte len, uint8_t *buffer)
463
457
{
464
458
byte address, _cs;
465
- byte value;
466
459
467
460
if (type == GYROTYPE) {
468
461
address = LSM9DS0_ADDRESS_GYRO;
@@ -471,12 +464,19 @@ byte Adafruit_LSM9DS0::read8(boolean type, byte reg)
471
464
address = LSM9DS0_ADDRESS_ACCELMAG;
472
465
_cs = _csxm;
473
466
}
467
+
474
468
if (_i2c) {
475
469
Wire.beginTransmission (address);
476
470
Wire.write (reg);
477
471
Wire.endTransmission ();
478
- Wire.requestFrom (address, (byte)1 );
479
- value = Wire.read ();
472
+ Wire.requestFrom (address, (byte)len);
473
+
474
+ // Wait around until enough data is available
475
+ while (Wire.available () < len);
476
+
477
+ for (uint8_t i=0 ; i<len; i++) {
478
+ buffer[i] = Wire.read ();
479
+ }
480
480
Wire.endTransmission ();
481
481
} else {
482
482
if (_clk == -1 ) {
@@ -486,14 +486,16 @@ byte Adafruit_LSM9DS0::read8(boolean type, byte reg)
486
486
digitalWrite (_cs, LOW);
487
487
// set address
488
488
spixfer (reg | 0x80 | 0x40 ); // read multiple
489
- value = spixfer (0 );
489
+ for (uint8_t i=0 ; i<len; i++) {
490
+ buffer[i] = spixfer (0 );
491
+ }
490
492
digitalWrite (_cs, HIGH);
491
493
if (_clk == -1 ) {
492
494
SPCR = SPCRback;
493
495
}
494
496
}
495
497
496
- return value ;
498
+ return len ;
497
499
}
498
500
499
501
uint8_t Adafruit_LSM9DS0::spixfer (uint8_t data) {
0 commit comments