I2C SPI USB CAN eSPI Cable Testing View All Quick Start Guides User Manuals Software Downloads Knowledge Base Videos Case Studies App Notes White Papers Sales Support About Us
Products Blog Sales Support Contact Search
How Do I Read/Write to a I2C EEPROM with 16-bit Data?
Rena Ayeras

Question from the Customer:

I am using the Aardvark I2C/SPI Host Adapter and Aardvark Software API to program and read an I2C EEPROM device, the AT24C32. This I2C device has a 2-byte address and uses 2-byte data. Is there a way to use your API functions for that? Your API functions are designed for 8-bit data, but this device has a  16-bit address. The programming language I am using is C.

Response from Technical Support:

Thanks for your question! The API functions are designed for 8-bit data, but you can easily use them to read/write with 16-bit data. The API functions and an example are described below.

Using API Functions for 16-bit Data

The aa_i2c_write() and aa_i2c_read() functions have the u16 data type for 16-bit addresses.

Reading from the I2C slave device:

int aa_i2c_read (Aardvark            aardvark,

aa_u16              slave_addr,

AardvarkI2cFlags    flags,

aa_u16              num_bytes,

aa_u08 *            data_in);

Arguments

aardvark              handle of an Aardvark adapter

slave_addr          the slave from which to read

flags                     special operations

num_bytes         the number of bytes to read (maximum 65535)

data_in                pointer to data

Writing to the I2C slave device:

int aa_i2c_write (Aardvark         aardvark,

aa_u16           slave_addr,

AardvarkI2cFlags flags,

aa_u16           num_bytes,

const aa_u08 *   data_out);

Arguments

aardvark              handle of an Aardvark adapter

slave_addr          the slave from which to read

flags                      special operations

num_bytes         the number of bytes to write (maximum 65535)

data_out             pointer to data

These functions are designed for 8-bit data. However, 16-bit data can be sent byte-by-byte as 2 separate bytes.

Example to Read/Write 16-bit Data

Here is an example for using those commands to read/write 16-data data. Please note, this example is pseudo-code, not an actual program.

u08 addr[2];

int addr_byte = 1;

if (addr_t > 255) {

addr[0] = (addr_t >> 8) & 0xff;  // upper byte

addr[1] =(addr_t >> 0) & 0xff; // lower byte

addr_byte = 2;

}

else {

addr[0]= addr_t && 0xff;

addr[1] = 0;

addr_byte = 1;

}

aa_i2c_write(handle, device, AA_I2C_NO_STOP, addr_byte, addr);

For more information about API functions, including the special functions of the "flags", please refer to the subsection I2C Interface of the Aardvark I2C/SPI Host Adapter User Manual

We hope this answers your questions. Additional resources that you may find helpful include the following:

If you want more information, feel free to contact us with your questions, or request a demo that applies to your application.

Request a Demo