In my design, I use opencore i2c ip for my i2c interface. This core provides the drivers which includes I2C_init, I2C_start, I2C_read, I2C_write.
The writing operation is straightforward but sometimes i2c reading operation is confused. In this case, the I2C_read function is :
/************************************************** **************
int I2C_read
assumes that any addressing and start
has already been done.
reads one byte of data from the slave. on the last read
we don't acknowldge and set the stop bit.
inputs
base = the base address of the component
last = on the last read there must not be a ack
return value
byte read back.
15-OCT-07 initial release
************************************************** ***************/
alt_u32 I2C_read(alt_u32 base,alt_u32 last)
so this read function doesn't have an argument for the i2c slave address. So my understanding is I need a writing operation before read to write to the i2c slave for the initial inner address. Since before the read or write, it requests a start, what I think the general procedure is :
i2c_start(); // configure for write
i2c_write(base, slave_inner_address, last);
i2c_start(); // configure for read
i2c_read();
Currently I don't have a hardware for testing, if anyone has experience about opencore i2c ip driver, I would appreciate if you can have a look to see whether my understanding about reading operation is correct.
Thanks in advance.
The writing operation is straightforward but sometimes i2c reading operation is confused. In this case, the I2C_read function is :
/************************************************** **************
int I2C_read
assumes that any addressing and start
has already been done.
reads one byte of data from the slave. on the last read
we don't acknowldge and set the stop bit.
inputs
base = the base address of the component
last = on the last read there must not be a ack
return value
byte read back.
15-OCT-07 initial release
************************************************** ***************/
alt_u32 I2C_read(alt_u32 base,alt_u32 last)
so this read function doesn't have an argument for the i2c slave address. So my understanding is I need a writing operation before read to write to the i2c slave for the initial inner address. Since before the read or write, it requests a start, what I think the general procedure is :
i2c_start(); // configure for write
i2c_write(base, slave_inner_address, last);
i2c_start(); // configure for read
i2c_read();
Currently I don't have a hardware for testing, if anyone has experience about opencore i2c ip driver, I would appreciate if you can have a look to see whether my understanding about reading operation is correct.
Thanks in advance.