# I2C Problem

**URL:** <https://forum.sierrawireless.com/t/i2c-problem/3874>\
**Category:** General wireless topics\
**Created:** [November 18, 2009, 11:18am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874 "2009-11-18T11:18:54Z")\
**Posts on this page:** 19\
**Page:** 1

<div class="post-metadata">

**Author:** ![raffaele](https://avatars.discourse-cdn.com/v4/letter/r/90db22/32.png) [@raffaele](https://forum.sierrawireless.com/u/raffaele)\
**Post date:** [November 18, 2009, 11:18am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/1 "2009-11-18T11:18:54Z")

</div>

Hello to all,  
I’m having problem reading data from a PCA9534A via I2C. I’m actually using a Q2686 with R72 firmware and I always get a ADL\_RET\_ERR\_PARAM, I can’t understand where is the error. The same circuit works fine with Q2686 - 6.63 FW .  
Here the testing code:

```auto
u8 string[50];
s32 ret;
u32 addr_len;
u8 i2c_read_buffer[5];
s32 i2c_handle;
adl_busI2CSettings_t i2c_config;
adl_busAccess_t i2c_access_config;

i2c_config.AddrLength = ADL_BUS_I2C_ADDR_7_BITS;
i2c_config.ChipAddress = (0x7a>>1);
i2c_config.Clk_Speed = ADL_BUS_I2C_CLK_STD;
i2c_config.MasterMode = ADL_BUS_I2C_MASTER_MODE;

i2c_handle = adl_busSubscribe(ADL_BUS_I2C, 1, &i2c_config);

wm_sprintf(string,"[I2C_HANDLE] %d \r\n",i2c_handle);
adl_atSendResponse ( ADL_AT_UNS, string);

addr_len = ADL_BUS_I2C_CAP_ADD_SIZE_8;

ret = adl_busIOCtl(i2c_handle, ADL_BUS_CMD_SET_ADD_SIZE, &addr_len);
wm_sprintf(string,"[I2C_ADDR_LEN] SET %d \r\n",ret);
adl_atSendResponse ( ADL_AT_UNS, string);

i2c_access_config.Address = 0;
i2c_access_config.Opcode = 0;

ret = adl_busRead(i2c_handle, &i2c_access_config, 1,i2c_read_buffer);

wm_sprintf(string,"[I2C_READ] %x ERROR %d\r\n",i2c_read_buffer[0],ret);
adl_atSendResponse ( ADL_AT_UNS, string);

adl_busUnsubscribe(i2c_handle );
```

Thank you for you help,

Raffaele

---

<div class="post-metadata">

**Author:** ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)\
**Post date:** [November 18, 2009, 11:41am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/2 "2009-11-18T11:41:01Z")

</div>

> [@raffaele](#):
>
> … with R72 firmware and I always get a ADL\_RET\_ERR\_PARAM … works fine with Q2686 - 6.63 FW

Have you checked carefully that the APIs are identical in R7.2 and R6.63 ❓

Wavecom have made some significant changes to the API over time - and attempting to use the wrong form would certainly account for a “Parameter” error…

---

<div class="post-metadata">

**Author:** ![raffaele](https://avatars.discourse-cdn.com/v4/letter/r/90db22/32.png) [@raffaele](https://forum.sierrawireless.com/u/raffaele)\
**Post date:** [November 19, 2009, 8:31am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/3 "2009-11-19T08:31:05Z")

</div>

Yeah, I know that I2C library is completely different from R72 to 6.63. I’ve posted the code for R72, it’s very similar to the example in ADL manual, and with I have no problem reading a I2C EEPROM 24Cxx. Just I’m wondering why so simple code doesn’t work.

---

<div class="post-metadata">

**Author:** ![Madouc](https://avatars.discourse-cdn.com/v4/letter/m/b782af/32.png) [@Madouc](https://forum.sierrawireless.com/u/Madouc)\
**Post date:** [November 19, 2009, 9:56am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/4 "2009-11-19T09:56:04Z")

</div>

wich command gives you ADL\_RET\_ERR\_PARAM?

---

<div class="post-metadata">

**Author:** ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)\
**Post date:** [November 19, 2009, 10:10am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/5 "2009-11-19T10:10:47Z")

</div>

> [@raffaele](#):
>
> Just I’m wondering why so simple code doesn’t work.

Just because code appears “simple” is no reason to beleive that it can’t contain errors!

---

<div class="post-metadata">

**Author:** ![raffaele](https://avatars.discourse-cdn.com/v4/letter/r/90db22/32.png) [@raffaele](https://forum.sierrawireless.com/u/raffaele)\
**Post date:** [November 19, 2009, 10:27am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/6 "2009-11-19T10:27:36Z")

</div>

> [@Madouc](#):
>
> wich command gives you ADL\_RET\_ERR\_PARAM?

adl\_busRead

---

<div class="post-metadata">

**Author:** ![raffaele](https://avatars.discourse-cdn.com/v4/letter/r/90db22/32.png) [@raffaele](https://forum.sierrawireless.com/u/raffaele)\
**Post date:** [November 19, 2009, 10:31am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/7 "2009-11-19T10:31:53Z")

</div>

> [@awneil](#):
>
> Just because code appears “simple” is no reason to beleive that it can’t contain errors!

Thank you for the wise sentence, but if you know how to find the error I’ll appreciate

---

<div class="post-metadata">

**Author:** ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)\
**Post date:** [November 19, 2009, 10:34am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/8 "2009-11-19T10:34:51Z")

</div>

As you know that it’s adl\_busRead that’s giving the error, look carefully at the parameters that you are supplying and carefully check that they match the specification of adl\_busRead

---

<div class="post-metadata">

**Author:** ![Madouc](https://avatars.discourse-cdn.com/v4/letter/m/b782af/32.png) [@Madouc](https://forum.sierrawireless.com/u/Madouc)\
**Post date:** [November 19, 2009, 10:48am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/9 "2009-11-19T10:48:48Z")

</div>

you might want to change

```auto
ret = adl_busRead(i2c_handle, &i2c_access_config, 1,i2c_read_buffer);
```

to

```auto
ret = adl_busRead(i2c_handle, &i2c_access_config, 1,&i2c_read_buffer);
```

---

<div class="post-metadata">

**Author:** ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)\
**Post date:** [November 19, 2009, 11:02am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/10 "2009-11-19T11:02:42Z")

</div>

That shouldn’t matter, as i2c\_read\_buffer is declared as an array - so using just its name does give the address of its 1st element…?

---

<div class="post-metadata">

**Author:** ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)\
**Post date:** [November 19, 2009, 11:04am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/11 "2009-11-19T11:04:22Z")

</div>

Are you sure adl\_busSubscribe is giving you a valid handle?

---

<div class="post-metadata">

**Author:** ![raffaele](https://avatars.discourse-cdn.com/v4/letter/r/90db22/32.png) [@raffaele](https://forum.sierrawireless.com/u/raffaele)\
**Post date:** [November 19, 2009, 11:28am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/12 "2009-11-19T11:28:47Z")

</div>

> [@Madouc](#):
>
> you might want to change
> 
> ```auto
> ret = adl_busRead(i2c_handle, &i2c_access_config, 1,i2c_read_buffer);
> ```
> 
> to
> 
> ```auto
> ret = adl_busRead(i2c_handle, &i2c_access_config, 1,&i2c_read_buffer);
> ```

I knew that, and it doesn’t work too.

---

<div class="post-metadata">

**Author:** ![raffaele](https://avatars.discourse-cdn.com/v4/letter/r/90db22/32.png) [@raffaele](https://forum.sierrawireless.com/u/raffaele)\
**Post date:** [November 19, 2009, 11:34am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/13 "2009-11-19T11:34:14Z")

</div>

> [@awneil](#):
>
> Are you sure adl\_busSubscribe is giving you a valid handle?

1. adl\_busSubscribe gives a valid handle (it’s 403449256)
2. adl\_busIOCtl returns OK

I’ve tried also to set a delay time between every function but the same result.

---

<div class="post-metadata">

**Author:** ![Madouc](https://avatars.discourse-cdn.com/v4/letter/m/b782af/32.png) [@Madouc](https://forum.sierrawireless.com/u/Madouc)\
**Post date:** [November 19, 2009, 11:34am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/14 "2009-11-19T11:34:33Z")

</div>

Aren’t you required to give an address when you read from I2C?

```auto
i2c_access_config.Address = 0;
i2c_access_config.Opcode = 0;
```

-edit-  
never mind my reply  
sorry, i’m confusing some things here

---

<div class="post-metadata">

**Author:** ![raffaele](https://avatars.discourse-cdn.com/v4/letter/r/90db22/32.png) [@raffaele](https://forum.sierrawireless.com/u/raffaele)\
**Post date:** [November 19, 2009, 11:40am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/15 "2009-11-19T11:40:14Z")

</div>

[quote=“Madouc”]  
Aren’t you required to give an address when you read from I2C?

```auto
i2c_access_config.Address = 0;
i2c_access_config.Opcode = 0;
```

I want to read IC register 0

---

<div class="post-metadata">

**Author:** ![Madouc](https://avatars.discourse-cdn.com/v4/letter/m/b782af/32.png) [@Madouc](https://forum.sierrawireless.com/u/Madouc)\
**Post date:** [November 19, 2009, 11:46am UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/16 "2009-11-19T11:46:05Z")

</div>

hmm… this is my (working) code.

I’m using FW. 7.4a (OS 6.31)

```auto
/**	@brief Led driver I2C configuration settings.
 */
const adl_busI2CSettings_t LedI2CConfig[2] = {
	{
		0x12, ///< Chip address to write to (not shifted)
		ADL_BUS_I2C_CLK_FAST, ///< Chip uses the I2C fast clock speed
		ADL_BUS_I2C_ADDR_7_BITS, ///< 7 bits address length
	},
	{
		0x62, ///< Chip address to write to (not shifted)
		ADL_BUS_I2C_CLK_FAST, ///< Chip uses the I2C fast clock speed
		ADL_BUS_I2C_ADDR_7_BITS, ///< 7 bits address length
	}
};

/// opcode/address used on current Bus access.
adl_busAccess_t i2cLedBusAcces = {0, 0};

/// I2C address size
u32 AddSize=8;

/// BUS Handles
s32 LedI2CHandle[2]={0,0};
```

```auto

    s32 handle = adl_busSubscribe ( ADL_BUS_ID_I2C, 1, (void *)&MyI2CConfig );

    adl_busAccess_t i2cBusAcces = {0, 0};

    adl_busIOCtl ( handle, ADL_BUS_CMD_SET_ADD_SIZE, &AddSize );
    adl_busIOCtl ( handle, ADL_BUS_CMD_SET_ASYNC_MODE, NULL );
    s32 dataSize = 8;
    adl_busIOCtl ( handle, ADL_BUS_CMD_SET_DATA_SIZE, &dataSize );
    i2cBusAcces.Address = (0x11)<<24;
    u8 dat[14];
    ret = adl_busRead ( handle, &i2cBusAcces, 1, &dat);
```

---

<div class="post-metadata">

**Author:** ![raffaele](https://avatars.discourse-cdn.com/v4/letter/r/90db22/32.png) [@raffaele](https://forum.sierrawireless.com/u/raffaele)\
**Post date:** [November 19, 2009, 12:26pm UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/17 "2009-11-19T12:26:45Z")

</div>

Thank you very much, it works just adding

```auto
adl_busIOCtl ( handle, ADL_BUS_CMD_SET_ASYNC_MODE, NULL );
```

regarding address size,

```auto
/// I2C address size
u32 AddSize=8;
```

are you sure you don’t need to use a value indicated in adl\_busI2CCap\_e?  
for 8 bit address is ADL\_BUS\_I2C\_CAP\_ADD\_SIZE\_8 and not simply 8.

Anyway i’ll do some experiments and I’ll let you know, thank again for the advise.

---

<div class="post-metadata">

**Author:** ![Madouc](https://avatars.discourse-cdn.com/v4/letter/m/b782af/32.png) [@Madouc](https://forum.sierrawireless.com/u/Madouc)\
**Post date:** [November 19, 2009, 12:53pm UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/18 "2009-11-19T12:53:12Z")

</div>

> [@raffaele](#):
>
> Thank you very much, it works just adding
> 
> ```auto
> adl_busIOCtl ( handle, ADL_BUS_CMD_SET_ASYNC_MODE, NULL );
> ```
> 
> regarding address size,
> 
> ```auto
> /// I2C address size
> u32 AddSize=8;
> ```
> 
> are you sure you don’t need to use a value indicated in adl\_busI2CCap\_e?  
> for 8 bit address is ADL\_BUS\_I2C\_CAP\_ADD\_SIZE\_8 and not simply 8.
> 
> Anyway i’ll do some experiments and I’ll let you know, thank again for the advise.

ok, i hadn’t noticed that…  
tried to change it, but now my I2C isn’t working anymore…

---

<div class="post-metadata">

**Author:** ![Madouc](https://avatars.discourse-cdn.com/v4/letter/m/b782af/32.png) [@Madouc](https://forum.sierrawireless.com/u/Madouc)\
**Post date:** [November 19, 2009, 1:18pm UTC](https://forum.sierrawireless.com/t/i2c-problem/3874/19 "2009-11-19T13:18:30Z")

</div>

the examples given by Wavecom are also using numbers:

```auto
u32 drv_I2C_E2P_M24CXX_Init ( void )
{
    u32 length = 16;
    
    adl_busI2CSettings_t I2CSettings =
    {
        0x50, // ChipAddress
        ADL_BUS_I2C_CLK_STD // Clk_Speed 
    };
```

(475 - 483 of extstorage\_iic.c)

the chip used in the example has a 16-bits address.
