Netduino home hardware projects downloads community

Jump to content


The Netduino forums have been replaced by new forums at community.wildernesslabs.co. This site has been preserved for archival purposes only and the ability to make new accounts or posts has been turned off.
Photo

I2C on original netduino not reading multiple bytes

I2C LSM9DS0

Best Answer TheIceManProgrammeth, 21 February 2015 - 11:02 PM

I had the same issue. Try amending:

 

byte write = { AddressOfFirstRegisterIneed };

 

to

 

byte write = { AddressOfFirstRegisterIneed | (1 << 7) };

Go to the full post


  • Please log in to reply
3 replies to this topic

#1 h3mp

h3mp

    Member

  • Members
  • PipPip
  • 21 posts

Posted 17 February 2015 - 10:21 PM

I'm new to I2C so apologies in advance  :D

 

I'm trying to read multiple registers at once from a LSM9DS0 accelerometer/gyro/compass chip..

 

Each sensor has 6 registers in a row that return X/Y/Z high and low bytes.. so i should be able to use the I2C_ADDRESS of the chip's XM sensor, then point a 'read' at the first of the 6 registers then i was hoping that would return an array of that register plus the next 5..

 

I use code based on this following example i found on the web:


I2CDevice.Configuration config = new I2CDevice.Configuration(I2C_ADDRESS, I2C_CLOCK_RATE_KHZ);
I2CDevice i2c = new I2CDevice(config);

byte write = { AddressOfFirstRegisterIneed };
byte read = new byte[6]; //surely this should return the first and subsequent 5 registers?
// create I2C write and read transaction
I2CDevice.I2CTransaction i2cTx = new I2CDevice.I2CTransaction[2];
i2cTx[0] = I2CDevice.CreateWriteTransaction(write);
i2cTx[1] = I2CDevice.CreateReadTransaction(read);
// execution
i2c.Execute(i2cTx, I2C_TIMEOUT);

 

..what i get back is an array of bytes all containing the same value!? (there should be 6 distinct values returned).

 

if i do 6 separate transactions one after another reading just 1 byte, then i can return all 6 registers successfully..

 

but as they are all in a row should i not be able to do all this in one transaction?  :wacko:

 

(i'm doing this on my old Netduino 1 that is probably running 4.2.0 update1 as i didnt have any newer netduinos in my office today)

 

 

 



#2 CW2

CW2

    Advanced Member

  • Members
  • PipPipPip
  • 1592 posts
  • LocationCzech Republic

Posted 21 February 2015 - 07:58 PM

You'd need special I2C methods that support repeated-start condition, as described in http://forums.netdui...rt-bit-support/



#3 TheIceManProgrammeth

TheIceManProgrammeth

    New Member

  • Members
  • Pip
  • 9 posts

Posted 21 February 2015 - 11:02 PM   Best Answer

I had the same issue. Try amending:

 

byte write = { AddressOfFirstRegisterIneed };

 

to

 

byte write = { AddressOfFirstRegisterIneed | (1 << 7) };



#4 h3mp

h3mp

    Member

  • Members
  • PipPip
  • 21 posts

Posted 22 February 2015 - 01:38 PM

Thanks IceMan..

 

I had missed that in the datasheet.. it states:

 

 

The I2C embedded inside the LSM9DS0 behaves like a slave device and the following protocol must be adhered to. After the start condition (ST) a slave address is sent, once a slave acknowledge (SAK) has been returned, an 8-bit sub-address (SUB) will be transmitted: the 7 LSb represents the actual register address while the MSB enables the address auto increment. If the MSb of the SUB field is 1, the SUB (register address) will be automatically increased to allow multiple data read/writes.

 

so or'ing in the MSB 1 works great thanks  :D







0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

home    hardware    projects    downloads    community    where to buy    contact Copyright © 2016 Wilderness Labs Inc.  |  Legal   |   CC BY-SA
This webpage is licensed under a Creative Commons Attribution-ShareAlike License.