roboknight / libmpsse

Automatically exported from code.google.com/p/libmpsse
0 stars 0 forks source link

How to address i2c slaves #46

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
 It's not really a problem, but I'm rather perplexed as to how to talk to specific I2C slaves. I only saw the i2ceeprom example, which somehow doesn't seem like what I need.

 I basically have an I2C slave on address 0x48 (it's an A->D converter, but that doesn't really matter). Later on I'll also add another I2C slave on the same line, so I really need to specify the proper addresses to talk to them.

 So how could I do something like:

#define ADS1015_REG_POINTER_CONFIG      (0x01) 
#define ADS1015_REG_POINTER_CONVERT     (0x00)

 int Address=0x48;
 ioctl(i2cFile, I2C_SLAVE, Address);
 i2c_smbus_write_word_data(i2cFile,ADS1015_REG_POINTER_CONFIG,0x1122);
 i2c_smbus_read_word_data(i2cFile,ADS1015_REG_POINTER_CONVERT);

 with libmpsse?

Original issue reported on code.google.com by Rezodl...@gmail.com on 10 Mar 2014 at 8:51

GoogleCodeExporter commented 9 years ago
 Posting a solution if anyone else gets perplexed like me ...

 Basically, you have to start writing to I2C with the address of slave SHIFTED 1 bit to the left (last bit 0 for writes, or 1 for reads) so the above code would be something like:

//writing part
 char Data={"\0x90\0x01\x11\x22"};
 Start(context);
 Write (Context,Data,4);  //equals ioctl and i2c_smbus_write_word_data above
 Stop(context);

//reading part
 Start(Context);
 Data[1]=\0x00;           // ADS1015_REG_POINTER_CONVERT=0x00
 Write (Context,Data,2);  //set the register for read
 Stop(context);
 Start(Context);
 Data[0]=\0x91;
 Write (Context,Data,1);  //State you want to read from address 0x48 (0x48<<1)|1
 Read (Context,2);        //read the word (2 bytes) of data
 Stop(Context);

Original comment by Rezodl...@gmail.com on 19 Mar 2014 at 5:24