From: VaibhavGhadiok <vai...@gm...> - 2010-10-27 20:05:16
|
hi everyone While trying to debug communication issues with an I2C sensor using I2cSendBytes and combined read/write as talked about in one of the posts, I used the same commands on the robostix as well. I tried to verify the output of my program using the i2c utility provided on the gumstix. Results are below. As one can note I am always returned the address of the register instead of the value in it. root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x6F 0x6f root@gumstix-custom-verdex:~$ i2c 0x0B wb 0x6F 0x00 root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x6F 0x6f //I also tried (Note the output trend) root@gumstix-custom-verdex:~$ i2c 0x0B rb 0xABCDEF 0xef root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x11 0x11 root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x66 0x66 root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x88 0x88 root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x654 0x54 root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x7854 0x54 root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x8907854 0x54 root@gumstix-custom-verdex:~$ i2c 0x0B rb 0xABCD8907858 0xff root@gumstix-custom-verdex:~$ i2c 0x0B rb 0xABCD89078AA 0xff //The robostix address is 0x0B, Just trying a random address to see the effects root@gumstix-custom-verdex:~$ i2c 0x0A rb 0x6F ERROR: I2cTransfer: ioctl failed: Remote I/O error (121) ERROR: I2cReadByte failed: -1 I have a program that uses I2C_IO_GetADC like functions and works perfectly fine. I also generate PWM on the robostix using values sent from the gumstix. I set the robostix address to be 0x0B using SetSlave inside this program. Right now, i only have the Gumstix and robostix and nothing else attached to the I2C lines (nothing that I have attached externally) Thanks -- View this message in context: http://old.nabble.com/i2c-%27robostix-address%27--rb--%27regadd-%27returns-%27regadd%27-tp30070714p30070714.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2010-10-27 21:02:26
|
Hi, On Wed, Oct 27, 2010 at 1:05 PM, VaibhavGhadiok <vai...@gm...> wrote: > > hi everyone > > While trying to debug communication issues with an I2C sensor using > I2cSendBytes and combined read/write as talked about in one of the posts, I > used the same commands on the robostix as well. I tried to verify the output > of my program using the i2c utility provided on the gumstix. Results are > below. > > As one can note I am always returned the address of the register instead of > the value in it. > > root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x6F > 0x6f So, I'll assume that you're running the i2c-io program on the robostix? It wasn't designed to make it look like a normal i2c device. It was designed that you write a command, along with some optional arguments, and then read back the response. This is often called "block" mode in the smbus documentation. Try this: i2c --count=18 0x0B rb 0xB0 In this case it's writing down 0xB0 (the address) and then reading 18 bytes. 0xB0 corresponds to the BL_REG_GET_INFO command (from robostix/Shared/BootLoader.h) and it returns the BootLoaderInfo_t structure, which I think is 18 bytes. i2c-io was the program designed to work with the i2c-io program on the robostix. The i2c program was designed for working with more traditional i2c devices which have a very simple interface (more of a memory-register style layout, where i2c-io is more command/response). The i2c program doesn't really have any support for the command/response portion of the protocol (except for commands which are a single byte). -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: VaibhavGhadiok <vai...@gm...> - 2010-10-27 23:34:25
|
Thanks for your response. I want to communicate with an I2C sensor. This is my gumstix main program. //I open i2c-dev0: That works I2cSetSlaveAddress( i2cDev, 0x69, I2C_USE_CRC ); //The address of the sensor is 0x69 as according to the datasheet. We have the last bit pulled high. I2cReadRegisterITG3200(i2cDev, GyroAddress, RegisterAddress, GyroData, GyroDataLength); DatatoWrite[0] = 0x15; //Register Address DatatoWrite[1] = 0x1B; // Data to write to the I2cWriteRegisterITG3200 ( i2cDev, GyroAddress, &DatatoWrite, 2 ); ***************************************These are the functions have written to read and write from/to an I2C Sensor************************* /** * Write a register value on the ITG-3200 */ int I2cWriteRegisterITG3200 ( int i2cDev, ///< Handle to i2c-dev file uint16_t DeviceAddress, //Made this 16 bit since the structure uses a 16 bit value for address uint8_t *wrData, ///< Pointer to data (Register, Data) uint8_t wrLen ///< NUmber of bytes to write ) { struct i2c_rdwr_ioctl_data rdwr; struct i2c_msg msg; LogDebug( "----- I2cSendBytes wrLen = 0x%02x -----\n", wrLen ); msg.addr = DeviceAddress; msg.flags = 0; msg.len = wrLen; msg.buf = (char *)wrData; rdwr.msgs = &msg; rdwr.nmsgs = 1; // tell the driver we want the device at address b1101000 //This works if (ioctl(i2cDev, I2C_SLAVE, DeviceAddress)<0) printf("\nioctlwrite failed\n"); if (write(i2cDev, wrData, 2) < 0) printf("\nioctlwrite2 failed\n"); fflush(stdout); //if ( ioctl( i2cDev, I2C_RDWR, &rdwr ) < 0 ) //{ //LogError( "I2cWriteRegisterITG3200: ioctl failed: %s (%d)\n", strerror( errno ), errno ); //return -1; //} return 0; } //I2cWriteRegisterITG3200 We are unable to write. It just sparks an error: "octlwrite2 failed". As it is unable to write. And Howl error as it is unable to read. I have the pull-ups on the sensor installed. 10K. This seems ok as according to the Philips I2C documentation. My sensor works off 3.3 V so I have a Logic Converter to convert from the Robostix SDA, SCL pinout (which are at 5 V) to the Sensor SDA, SCL. Thanks Dave Hylands wrote: > > Hi, > > On Wed, Oct 27, 2010 at 1:05 PM, VaibhavGhadiok > <vai...@gm...> wrote: >> >> hi everyone >> >> While trying to debug communication issues with an I2C sensor using >> I2cSendBytes and combined read/write as talked about in one of the posts, >> I >> used the same commands on the robostix as well. I tried to verify the >> output >> of my program using the i2c utility provided on the gumstix. Results are >> below. >> >> As one can note I am always returned the address of the register instead >> of >> the value in it. >> >> root@gumstix-custom-verdex:~$ i2c 0x0B rb 0x6F >> 0x6f > > So, I'll assume that you're running the i2c-io program on the robostix? > It wasn't designed to make it look like a normal i2c device. > > It was designed that you write a command, along with some optional > arguments, and then read back the response. This is often called > "block" mode in the smbus documentation. > > Try this: > > i2c --count=18 0x0B rb 0xB0 > > In this case it's writing down 0xB0 (the address) and then reading 18 > bytes. 0xB0 corresponds to the BL_REG_GET_INFO command (from > robostix/Shared/BootLoader.h) and it returns the BootLoaderInfo_t > structure, which I think is 18 bytes. > > i2c-io was the program designed to work with the i2c-io program on the > robostix. The i2c program was designed for working with more > traditional i2c devices which have a very simple interface (more of a > memory-register style layout, where i2c-io is more command/response). > The i2c program doesn't really have any support for the > command/response portion of the protocol (except for commands which > are a single byte). > > -- > Dave Hylands > Shuswap, BC, Canada > http://www.DaveHylands.com/ > > ------------------------------------------------------------------------------ > Nokia and AT&T present the 2010 Calling All Innovators-North America > contest > Create new apps & games for the Nokia N8 for consumers in U.S. and Canada > $10 million total in prizes - $4M cash, 500 devices, nearly $6M in > marketing > Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store > http://p.sf.net/sfu/nokia-dev2dev > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > > -- View this message in context: http://old.nabble.com/i2c-%27robostix-address%27--rb--%27regadd-%27returns-%27regadd%27-tp30070714p30072246.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2010-10-28 00:02:26
|
Hi, On Wed, Oct 27, 2010 at 4:34 PM, VaibhavGhadiok <vai...@gm...> wrote: > > Thanks for your response. > > I want to communicate with an I2C sensor. This is my gumstix main program. > //I open i2c-dev0: That works > I2cSetSlaveAddress( i2cDev, 0x69, I2C_USE_CRC ); Unless you're communicating with an SMBUS protocol aware device, you probably don't want the I2C_USE_CRC option. > //The address of the sensor is 0x69 as according to the datasheet. We have > the last bit pulled high. > > I2cReadRegisterITG3200(i2cDev, GyroAddress, RegisterAddress, GyroData, > GyroDataLength); So is GyroAddress also set to 0x69? > DatatoWrite[0] = 0x15; //Register Address > DatatoWrite[1] = 0x1B; // Data to write to the > I2cWriteRegisterITG3200 ( i2cDev, GyroAddress, &DatatoWrite, 2 ); How is Datatowrite declared? > > > ***************************************These are the functions have written > to read and write from/to an I2C Sensor************************* > > > > /** > * Write a register value on the ITG-3200 > */ > > int I2cWriteRegisterITG3200 > ( > int i2cDev, ///< Handle to i2c-dev file > uint16_t DeviceAddress, //Made this 16 bit since the structure uses a 16 > bit value for address > uint8_t *wrData, ///< Pointer to data (Register, Data) > uint8_t wrLen ///< NUmber of bytes to write > ) > { > struct i2c_rdwr_ioctl_data rdwr; > struct i2c_msg msg; > > LogDebug( "----- I2cSendBytes wrLen = 0x%02x -----\n", wrLen ); > > msg.addr = DeviceAddress; > msg.flags = 0; > msg.len = wrLen; > msg.buf = (char *)wrData; > > rdwr.msgs = &msg; > rdwr.nmsgs = 1; > > > // tell the driver we want the device at address b1101000 > //This works > if (ioctl(i2cDev, I2C_SLAVE, DeviceAddress)<0) > printf("\nioctlwrite failed\n"); > > if (write(i2cDev, wrData, 2) < 0) > printf("\nioctlwrite2 failed\n"); > fflush(stdout); > //if ( ioctl( i2cDev, I2C_RDWR, &rdwr ) < 0 ) > //{ > //LogError( "I2cWriteRegisterITG3200: ioctl failed: %s (%d)\n", strerror( > errno ), errno ); > //return -1; > //} > > return 0; > > } //I2cWriteRegisterITG3200 I've never tried using the write API to do writes. You'll need to use the I2C_RDWR to do reads anyways, so you might as well use it to do the writes. > > We are unable to write. It just sparks an error: "octlwrite2 failed". As it > is unable to write. > And Howl error as it is unable to read. I have the pull-ups on the sensor > installed. 10K. This seems ok as according to the Philips I2C documentation. > My sensor works off 3.3 V so I have a Logic Converter to convert from the > Robostix SDA, SCL pinout (which are at 5 V) to the Sensor SDA, SCL. That's probably also part of the problem. There is already a voltage converter between the gumstix and the robostix, and chaining multiple voltage converters don't always work. I'd start by trying a different daughtercard which just exposes the SDA/SCL signals and see if that works. If it does, then you'll probably want to tap into the 3.3v versions of the SDA/SCL signals on the robostix. You should be able to do i2c 0x69 rb 0 and get back the identification register, which should contain 0x68 or 0x69 (not sure if the HW LSB bit is reflected in this register or not). and i2c 0x69 rb 0x15 should read back 0xff (if the register is at its power on reset value) -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: Dave H. <dhy...@gm...> - 2010-10-28 00:05:47
|
Hi, > i2c 0x69 rb 0x15 > > should read back 0xff (if the register is at its power on reset value) Sorry - the power on reset appears to be zero (from the datasheet) -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: VaibhavGhadiok <vai...@gm...> - 2010-10-28 00:50:04
|
>Unless you're communicating with an SMBUS protocol aware device, you >probably don't want the I2C_USE_CRC option. Should I just put a 0 instead. >So is GyroAddress also set to 0x69? Yes >How is Datatowrite declared? uint16_t GyroAddress = 0x69; char RegisterAddress = 0x00; // GYRO_XOUT_H; uint8_t GyroData[6]; uint8_t GyroDataLength = 2; uint8_t DatatoWrite[2] = {0x6F, 0x02}; I2cWriteRegisterITG3200 ( i2cDev, 0x0B, DatatoWrite, 2 ); >I've never tried using the write API to do writes. You'll need to use >the I2C_RDWR to do reads anyways, so you might as well use it to do >the writes. Sorry, since RDWR was not working I had tried a direct write. >i2c 0x69 rb 0 >and get back the identification register, which should contain 0x68 or >0x69 (not sure if the HW LSB bit is reflected in this register or >not). >and >i2c 0x69 rb 0x15 >should read back 0x00 (if the register is at its power on reset value) root@gumstix-custom-verdex:~$ i2c 0x69 rb 0x00 ERROR: I2cTransfer: ioctl failed: Remote I/O error (121) ERROR: I2cReadByte failed: -1 root@gumstix-custom-verdex:~$ i2c 0x69 rb 0x15 ERROR: I2cTransfer: ioctl failed: Remote I/O error (121) ERROR: I2cReadByte failed: -1 This seems to suggest that the address is wrong as according to the old i2c wiki (buildroot). I get the error almost immediately. Tried using address 0x68 as well. Just in case. Thanks. Vaibhav Dave Hylands wrote: > > Hi, > > On Wed, Oct 27, 2010 at 4:34 PM, VaibhavGhadiok > <vai...@gm...> wrote: >> >> Thanks for your response. >> >> I want to communicate with an I2C sensor. This is my gumstix main >> program. >> //I open i2c-dev0: That works >> I2cSetSlaveAddress( i2cDev, 0x69, I2C_USE_CRC ); > > > >> //The address of the sensor is 0x69 as according to the datasheet. We >> have >> the last bit pulled high. >> >> I2cReadRegisterITG3200(i2cDev, GyroAddress, RegisterAddress, GyroData, >> GyroDataLength); > > So is GyroAddress also set to 0x69? > >> DatatoWrite[0] = 0x15; //Register Address >> DatatoWrite[1] = 0x1B; // Data to write to the >> I2cWriteRegisterITG3200 ( i2cDev, GyroAddress, &DatatoWrite, 2 ); > > How is Datatowrite declared? > >> >> >> ***************************************These are the functions have >> written >> to read and write from/to an I2C Sensor************************* >> >> >> >> /** >> * Write a register value on the ITG-3200 >> */ >> >> int I2cWriteRegisterITG3200 >> ( >> int i2cDev, ///< Handle to i2c-dev file >> uint16_t DeviceAddress, //Made this 16 bit since the structure uses a >> 16 >> bit value for address >> uint8_t *wrData, ///< Pointer to data (Register, Data) >> uint8_t wrLen ///< NUmber of bytes to write >> ) >> { >> struct i2c_rdwr_ioctl_data rdwr; >> struct i2c_msg msg; >> >> LogDebug( "----- I2cSendBytes wrLen = 0x%02x -----\n", wrLen ); >> >> msg.addr = DeviceAddress; >> msg.flags = 0; >> msg.len = wrLen; >> msg.buf = (char *)wrData; >> >> rdwr.msgs = &msg; >> rdwr.nmsgs = 1; >> >> >> // tell the driver we want the device at address b1101000 >> //This works >> if (ioctl(i2cDev, I2C_SLAVE, DeviceAddress)<0) >> printf("\nioctlwrite failed\n"); >> >> if (write(i2cDev, wrData, 2) < 0) >> printf("\nioctlwrite2 failed\n"); >> fflush(stdout); >> //if ( ioctl( i2cDev, I2C_RDWR, &rdwr ) < 0 ) >> //{ >> //LogError( "I2cWriteRegisterITG3200: ioctl failed: %s (%d)\n", >> strerror( >> errno ), errno ); >> //return -1; >> //} >> >> return 0; >> >> } //I2cWriteRegisterITG3200 > > I've never tried using the write API to do writes. You'll need to use > the I2C_RDWR to do reads anyways, so you might as well use it to do > the writes. > >> >> We are unable to write. It just sparks an error: "octlwrite2 failed". As >> it >> is unable to write. >> And Howl error as it is unable to read. I have the pull-ups on the sensor >> installed. 10K. This seems ok as according to the Philips I2C >> documentation. >> My sensor works off 3.3 V so I have a Logic Converter to convert from the >> Robostix SDA, SCL pinout (which are at 5 V) to the Sensor SDA, SCL. > > That's probably also part of the problem. > > There is already a voltage converter between the gumstix and the > robostix, and chaining multiple voltage converters don't always work. > > I'd start by trying a different daughtercard which just exposes the > SDA/SCL signals and see if that works. If it does, then you'll > probably want to tap into the 3.3v versions of the SDA/SCL signals on > the robostix. > > You should be able to do > > i2c 0x69 rb 0 > > and get back the identification register, which should contain 0x68 or > 0x69 (not sure if the HW LSB bit is reflected in this register or > not). > > and > > i2c 0x69 rb 0x15 > > should read back 0xff (if the register is at its power on reset value) > > -- > Dave Hylands > Shuswap, BC, Canada > http://www.DaveHylands.com/ > > ------------------------------------------------------------------------------ > Nokia and AT&T present the 2010 Calling All Innovators-North America > contest > Create new apps & games for the Nokia N8 for consumers in U.S. and Canada > $10 million total in prizes - $4M cash, 500 devices, nearly $6M in > marketing > Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store > http://p.sf.net/sfu/nokia-dev2dev > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > > -- View this message in context: http://old.nabble.com/i2c-%27robostix-address%27--rb--%27regadd-%27returns-%27regadd%27-tp30070714p30072556.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: VaibhavGhadiok <vai...@gm...> - 2010-10-28 00:56:40
|
>Unless you're communicating with an SMBUS protocol aware device, you >probably don't want the I2C_USE_CRC option. Should I just put a 0 instead. >So is GyroAddress also set to 0x69? Yes >How is Datatowrite declared? uint16_t GyroAddress = 0x69; char RegisterAddress = 0x00; // GYRO_XOUT_H; uint8_t GyroData[6]; uint8_t GyroDataLength = 2; uint8_t DatatoWrite[2] = {0x6F, 0x02}; I2cWriteRegisterITG3200 ( i2cDev, 0x0B, DatatoWrite, 2 ); >I've never tried using the write API to do writes. You'll need to use >the I2C_RDWR to do reads anyways, so you might as well use it to do >the writes. Sorry, since RDWR was not working I had tried a direct write. >i2c 0x69 rb 0 >and get back the identification register, which should contain 0x68 or >0x69 (not sure if the HW LSB bit is reflected in this register or >not). >and >i2c 0x69 rb 0x15 >should read back 0x00 (if the register is at its power on reset value) root@gumstix-custom-verdex:~$ i2c 0x69 rb 0x00 ERROR: I2cTransfer: ioctl failed: Remote I/O error (121) ERROR: I2cReadByte failed: -1 root@gumstix-custom-verdex:~$ i2c 0x69 rb 0x15 ERROR: I2cTransfer: ioctl failed: Remote I/O error (121) ERROR: I2cReadByte failed: -1 This seems to suggest that the address is wrong as according to the old i2c wiki (buildroot). I get the error almost immediately. Tried using address 0x68 as well. Just in case. I am pretty sure I have not written to the 0x00 register. Thanks. Vaibhav Dave Hylands wrote: > > Hi, > > On Wed, Oct 27, 2010 at 4:34 PM, VaibhavGhadiok > <vai...@gm...> wrote: >> >> Thanks for your response. >> >> I want to communicate with an I2C sensor. This is my gumstix main >> program. >> //I open i2c-dev0: That works >> I2cSetSlaveAddress( i2cDev, 0x69, I2C_USE_CRC ); > > Unless you're communicating with an SMBUS protocol aware device, you > probably don't want the I2C_USE_CRC option. > >> //The address of the sensor is 0x69 as according to the datasheet. We >> have >> the last bit pulled high. >> >> I2cReadRegisterITG3200(i2cDev, GyroAddress, RegisterAddress, GyroData, >> GyroDataLength); > > So is GyroAddress also set to 0x69? > >> DatatoWrite[0] = 0x15; //Register Address >> DatatoWrite[1] = 0x1B; // Data to write to the >> I2cWriteRegisterITG3200 ( i2cDev, GyroAddress, &DatatoWrite, 2 ); > > How is Datatowrite declared? > >> >> >> ***************************************These are the functions have >> written >> to read and write from/to an I2C Sensor************************* >> >> >> >> /** >> * Write a register value on the ITG-3200 >> */ >> >> int I2cWriteRegisterITG3200 >> ( >> int i2cDev, ///< Handle to i2c-dev file >> uint16_t DeviceAddress, //Made this 16 bit since the structure uses a >> 16 >> bit value for address >> uint8_t *wrData, ///< Pointer to data (Register, Data) >> uint8_t wrLen ///< NUmber of bytes to write >> ) >> { >> struct i2c_rdwr_ioctl_data rdwr; >> struct i2c_msg msg; >> >> LogDebug( "----- I2cSendBytes wrLen = 0x%02x -----\n", wrLen ); >> >> msg.addr = DeviceAddress; >> msg.flags = 0; >> msg.len = wrLen; >> msg.buf = (char *)wrData; >> >> rdwr.msgs = &msg; >> rdwr.nmsgs = 1; >> >> >> // tell the driver we want the device at address b1101000 >> //This works >> if (ioctl(i2cDev, I2C_SLAVE, DeviceAddress)<0) >> printf("\nioctlwrite failed\n"); >> >> if (write(i2cDev, wrData, 2) < 0) >> printf("\nioctlwrite2 failed\n"); >> fflush(stdout); >> //if ( ioctl( i2cDev, I2C_RDWR, &rdwr ) < 0 ) >> //{ >> //LogError( "I2cWriteRegisterITG3200: ioctl failed: %s (%d)\n", >> strerror( >> errno ), errno ); >> //return -1; >> //} >> >> return 0; >> >> } //I2cWriteRegisterITG3200 > > I've never tried using the write API to do writes. You'll need to use > the I2C_RDWR to do reads anyways, so you might as well use it to do > the writes. > >> >> We are unable to write. It just sparks an error: "octlwrite2 failed". As >> it >> is unable to write. >> And Howl error as it is unable to read. I have the pull-ups on the sensor >> installed. 10K. This seems ok as according to the Philips I2C >> documentation. >> My sensor works off 3.3 V so I have a Logic Converter to convert from the >> Robostix SDA, SCL pinout (which are at 5 V) to the Sensor SDA, SCL. > > That's probably also part of the problem. > > There is already a voltage converter between the gumstix and the > robostix, and chaining multiple voltage converters don't always work. > > I'd start by trying a different daughtercard which just exposes the > SDA/SCL signals and see if that works. If it does, then you'll > probably want to tap into the 3.3v versions of the SDA/SCL signals on > the robostix. > > You should be able to do > > i2c 0x69 rb 0 > > and get back the identification register, which should contain 0x68 or > 0x69 (not sure if the HW LSB bit is reflected in this register or > not). > > and > > i2c 0x69 rb 0x15 > > should read back 0xff (if the register is at its power on reset value) > > -- > Dave Hylands > Shuswap, BC, Canada > http://www.DaveHylands.com/ > > ------------------------------------------------------------------------------ > Nokia and AT&T present the 2010 Calling All Innovators-North America > contest > Create new apps & games for the Nokia N8 for consumers in U.S. and Canada > $10 million total in prizes - $4M cash, 500 devices, nearly $6M in > marketing > Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store > http://p.sf.net/sfu/nokia-dev2dev > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > > -- View this message in context: http://old.nabble.com/i2c-%27robostix-address%27--rb--%27regadd-%27returns-%27regadd%27-tp30070714p30072585.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2010-10-28 06:20:16
|
Hi, >> And Howl error as it is unable to read. I have the pull-ups on the sensor >> installed. 10K. This seems ok as according to the Philips I2C documentation. >> My sensor works off 3.3 V so I have a Logic Converter to convert from the >> Robostix SDA, SCL pinout (which are at 5 V) to the Sensor SDA, SCL. > > That's probably also part of the problem. > > There is already a voltage converter between the gumstix and the > robostix, and chaining multiple voltage converters don't always work. > > I'd start by trying a different daughtercard which just exposes the > SDA/SCL signals and see if that works. If it does, then you'll > probably want to tap into the 3.3v versions of the SDA/SCL signals on > the robostix. I still think that this is the problem. I took a look at the datasheet, and 0x69 seems like the correct address. -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: VaibhavGhadiok <vai...@gm...> - 2010-10-29 05:43:16
|
Hi Dave, I tapped into the 3.3V SCL/SDA lines on the robostix and hooked those lines directly up to the sensor, but still no change in what happens. Haven't tried the logic analyzer yet, but from the oscilloscope, the SDA commands are correct. Sequence is on SDA: start high, then 0 for start, then 1101001 (0x69 address), then 0 (read), 1 (no ack) then 0, then back to high. I ran a shell script with the command "i2c 0x69 rb 0x00" to run multiple times and also to check multiple addresses. The SDA output is the same on the 5V robostix side as well as if I do go through the 3.3v logic converter, so it seems like there isn't any difference. I've attached pictures of the oscope output for the 5V (pic 905), 3.3v using logic converted (pic 906), 3.3v gumstix direct (pic 907). Also - made a mistake on the robostix pullups, they are 2Kohm, not 10Mohm. Removed them (robostix apparently has 10K pullups) but this didn't change anything - there are 10K pullups on the sensor. Seems like the sensor is just not responding - unlikely it came dead on arrival, but can't think of anything else. Anything we can try to test it out? Thanks, Dave Hylands wrote: > > Hi, > >>> And Howl error as it is unable to read. I have the pull-ups on the >>> sensor >>> installed. 10K. This seems ok as according to the Philips I2C >>> documentation. >>> My sensor works off 3.3 V so I have a Logic Converter to convert from >>> the >>> Robostix SDA, SCL pinout (which are at 5 V) to the Sensor SDA, SCL. >> >> That's probably also part of the problem. >> >> There is already a voltage converter between the gumstix and the >> robostix, and chaining multiple voltage converters don't always work. >> >> I'd start by trying a different daughtercard which just exposes the >> SDA/SCL signals and see if that works. If it does, then you'll >> probably want to tap into the 3.3v versions of the SDA/SCL signals on >> the robostix. > > I still think that this is the problem. > > I took a look at the datasheet, and 0x69 seems like the correct address. > > -- > Dave Hylands > Shuswap, BC, Canada > http://www.DaveHylands.com/ > > ------------------------------------------------------------------------------ > Nokia and AT&T present the 2010 Calling All Innovators-North America > contest > Create new apps & games for the Nokia N8 for consumers in U.S. and Canada > $10 million total in prizes - $4M cash, 500 devices, nearly $6M in > marketing > Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store > http://p.sf.net/sfu/nokia-dev2dev > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > > http://old.nabble.com/file/p30083075/DSC00905.JPG DSC00905.JPG http://old.nabble.com/file/p30083075/DSC00906.JPG DSC00906.JPG http://old.nabble.com/file/p30083075/DSC00907.JPG DSC00907.JPG -- View this message in context: http://old.nabble.com/i2c-%27robostix-address%27--rb--%27regadd-%27returns-%27regadd%27-tp30070714p30083075.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2010-10-29 06:03:44
|
Hi, On Thu, Oct 28, 2010 at 10:43 PM, VaibhavGhadiok <vai...@gm...> wrote: > > Hi Dave, > > I tapped into the 3.3V SCL/SDA lines on the robostix and hooked those lines > directly up to the sensor, but still no change in what happens. Haven't > tried the logic analyzer yet, but from the oscilloscope, the SDA commands > are correct. Sequence is on SDA: start high, then 0 for start, then 1101001 > (0x69 address), then 0 (read), 1 (no ack) then 0, then back to high. I ran a > shell script with the command "i2c 0x69 rb 0x00" to run multiple times and > also to check multiple addresses. The SDA output is the same on the 5V > robostix side as well as if I do go through the 3.3v logic converter, so it > seems like there isn't any difference. I've attached pictures of the oscope > output for the 5V (pic 905), 3.3v using logic converted (pic 906), 3.3v > gumstix direct (pic 907). > > Also - made a mistake on the robostix pullups, they are 2Kohm, not 10Mohm. > Removed them (robostix apparently has 10K pullups) but this didn't change > anything - there are 10K pullups on the sensor. > > Seems like the sensor is just not responding - unlikely it came dead on > arrival, but can't think of anything else. Anything we can try to test it > out? I'm assuming that you connected GND from the sensor to GND on the robostix? And you connected VLOGIC to VDD? You could try all 126 addresses (from 1 to 127) to see if anything responds. It's hard to tell if that trailing zero is an ACK or not without seeing the SCL signal that goes with the SDA signal. The device is allowed to stretch the clock, so you really can't assume where the clock edges are. -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: VaibhavGhadiok <vai...@gm...> - 2010-10-29 07:11:24
|
Dave Hylands wrote: > > Hi, > > On Thu, Oct 28, 2010 at 10:43 PM, VaibhavGhadiok > <vai...@gm...> wrote: >> >> Hi Dave, >> >> Seems like the sensor is just not responding - unlikely it came dead on >> arrival, but can't think of anything else. Anything we can try to test it >> out? > > I'm assuming that you connected GND from the sensor to GND on the > robostix? > And you connected VLOGIC to VDD? > Thank you VERY MUCH for asking the obvious - forgot about VLOGIC pin - it was floating. When I shorted it to VDD, it works. It's worth pointing out that it does work with the 3.3V logic converter in the chain. Problem was with implementing the datasheet requirements. :-O Also found out that different conversion sections need their own pullup resistors - the logic converter actually has 10k on both sides. Thanks a million for your attention to detail and fast responses. -- View this message in context: http://old.nabble.com/i2c-%27robostix-address%27--rb--%27regadd-%27returns-%27regadd%27-tp30070714p30083423.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: VaibhavGhadiok <vai...@gm...> - 2010-10-29 18:10:47
|
hi Dave, I had a another question.. In my program I Have: I2cSetSlaveAddress( i2cDev, Address, I2C_NO_CRC); SetI2CFastMode(); //What is the purpose of the next few lines? // If I am switching between 2 devices that I communicate with, would the code below need to be implemented. // I would certainly need to call I2cSetSlave so that the ioctl can be called telling the kernel (driver) what device I want to communicate with I2C_IO_RESET_FLAG( i2cDev); prevTime = time (NULL); while (time (NULL) == prevTime ) { ; } endTime = prevTime + 120; Thanks again Vaibhav VaibhavGhadiok wrote: > > > Dave Hylands wrote: >> >> Hi, >> >> On Thu, Oct 28, 2010 at 10:43 PM, VaibhavGhadiok >> <vai...@gm...> wrote: >>> >>> Hi Dave, >>> >>> Seems like the sensor is just not responding - unlikely it came dead on >>> arrival, but can't think of anything else. Anything we can try to test >>> it >>> out? >> >> I'm assuming that you connected GND from the sensor to GND on the >> robostix? >> And you connected VLOGIC to VDD? >> > > Thank you VERY MUCH for asking the obvious - forgot about VLOGIC pin - it > was floating. When I shorted it to VDD, it works. It's worth pointing out > that it does work with the 3.3V logic converter in the chain. Problem was > with implementing the datasheet requirements. :-O > > Also found out that different conversion sections need their own pullup > resistors - the logic converter actually has 10k on both sides. > > Thanks a million for your attention to detail and fast responses. > -- View this message in context: http://old.nabble.com/i2c-%27robostix-address%27--rb--%27regadd-%27returns-%27regadd%27-tp30070714p30088087.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2010-10-29 20:38:22
|
Hi Vaibhav, > In my program I Have: > > I2cSetSlaveAddress( i2cDev, Address, I2C_NO_CRC); > SetI2CFastMode(); > > //What is the purpose of the next few lines? > // If I am switching between 2 devices that I communicate with, would the > code below need to be implemented. > // I would certainly need to call I2cSetSlave so that the ioctl can be > called telling the kernel (driver) what device I want to communicate with So you need to call I2cSetSlaveAddress if you're going to use the I2c functions from robostix/gumstix/Common. If you're going to use the I2C_RDWR ioctl calls, then you can set the address directly in that call. > I2C_IO_RESET_FLAG( i2cDev); I have no idea what that does. It's not in any of my code. > prevTime = time (NULL); > while (time (NULL) == prevTime ) > { > ; > } > endTime = prevTime + 120; These lines look like they came from i2c-adc.c which was a test program to see how many adc requests could be issued in 10 seconds. The loop just makes sure that it's starting as close as it can to the transition from one second to the next. This gives more repeatable results (for timing purposes). This isn't need for normal programs. -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |