Skip to content

Commit af1f26c

Browse files
committed
fix SPI reads
1 parent d379d50 commit af1f26c

File tree

3 files changed

+128
-99
lines changed

3 files changed

+128
-99
lines changed

Adafruit_LSM9DS0.cpp

Lines changed: 98 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ bool Adafruit_LSM9DS0::begin()
8080
}
8181

8282
uint8_t id = read8(XMTYPE, LSM9DS0_REGISTER_WHO_AM_I_XM);
83-
// Serial.print ("XM whoami: 0x");
83+
//Serial.print ("XM whoami: 0x");
8484
// Serial.println(id, HEX);
8585
if (id != LSM9DS0_XM_ID)
8686
return false;
@@ -123,98 +123,83 @@ bool Adafruit_LSM9DS0::begin()
123123
***************************************************************************/
124124
void Adafruit_LSM9DS0::read()
125125
{
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];
211127

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;
217201

202+
218203
}
219204

220205

@@ -460,9 +445,17 @@ void Adafruit_LSM9DS0::write8(boolean type, byte reg, byte value)
460445
}
461446

462447
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)
463457
{
464458
byte address, _cs;
465-
byte value;
466459

467460
if (type == GYROTYPE) {
468461
address = LSM9DS0_ADDRESS_GYRO;
@@ -471,12 +464,19 @@ byte Adafruit_LSM9DS0::read8(boolean type, byte reg)
471464
address = LSM9DS0_ADDRESS_ACCELMAG;
472465
_cs = _csxm;
473466
}
467+
474468
if (_i2c) {
475469
Wire.beginTransmission(address);
476470
Wire.write(reg);
477471
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+
}
480480
Wire.endTransmission();
481481
} else {
482482
if (_clk == -1) {
@@ -486,14 +486,16 @@ byte Adafruit_LSM9DS0::read8(boolean type, byte reg)
486486
digitalWrite(_cs, LOW);
487487
// set address
488488
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+
}
490492
digitalWrite(_cs, HIGH);
491493
if (_clk == -1) {
492494
SPCR = SPCRback;
493495
}
494496
}
495497

496-
return value;
498+
return len;
497499
}
498500

499501
uint8_t Adafruit_LSM9DS0::spixfer(uint8_t data) {

Adafruit_LSM9DS0.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ class Adafruit_LSM9DS0
169169
void setupMag ( lsm9ds0MagGain_t gain );
170170
void setupGyro ( lsm9ds0GyroScale_t scale );
171171
void write8 ( boolean type, byte reg, byte value );
172-
byte read8 ( boolean type, byte reg );
172+
byte read8 ( boolean type, byte reg);
173+
byte readBuffer ( boolean type, byte reg, byte len, uint8_t *buffer);
173174
uint8_t spixfer ( uint8_t data );
174175

175176
/* Adafruit Unified Sensor Functions (not standard yet ... the current base class only */

examples/sensorapi/sensorapi.ino

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
provide an appropriate value in the constructor below (12345
1616
is used by default in this example).
1717
18-
Connections
18+
Connections (For default I2C)
1919
===========
2020
Connect SCL to analog 5
2121
Connect SDA to analog 4
@@ -28,7 +28,31 @@
2828
*/
2929

3030
/* Assign a unique base ID for this sensor */
31-
Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0(1000);
31+
Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0(1000); // Use I2C, ID #1000
32+
33+
34+
/* Or, use Hardware SPI:
35+
SCK -> SPI CLK
36+
SDA -> SPI MOSI
37+
G_SDO + XM_SDO -> tied together to SPI MISO
38+
then select any two pins for the two CS lines:
39+
*/
40+
41+
#define LSM9DS0_XM_CS 10
42+
#define LSM9DS0_GYRO_CS 9
43+
//Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0(LSM9DS0_XM_CS, LSM9DS0_GYRO_CS, 1000);
44+
45+
/* Or, use Software SPI:
46+
G_SDO + XM_SDO -> tied together to the MISO pin!
47+
then select any pins for the SPI lines, and the two CS pins above
48+
*/
49+
50+
#define LSM9DS0_SCLK 13
51+
#define LSM9DS0_MISO 12
52+
#define LSM9DS0_MOSI 11
53+
54+
//Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0(LSM9DS0_SCLK, LSM9DS0_MISO, LSM9DS0_MOSI, LSM9DS0_XM_CS, LSM9DS0_GYRO_CS, 1000);
55+
3256

3357
/**************************************************************************/
3458
/*
@@ -118,6 +142,8 @@ void configureSensor(void)
118142
/**************************************************************************/
119143
void setup(void)
120144
{
145+
while (!Serial); // wait for flora/leonardo
146+
121147
Serial.begin(9600);
122148
Serial.println(F("LSM9DS0 9DOF Sensor Test")); Serial.println("");
123149

0 commit comments

Comments
 (0)