为什么read的时候要使用两个i2c_msg,而读只需要一个?
这与时序图有关
一 、指定地址读的时序图
设备地址为0x50的eeprom,要读取它里面存储地址为0x10的两个字节为例
1.设置内部地址
第一个i2c_msg是一个写操作,用于设置EEPROM内部地址指针,指向你要读取的地址0x10。这个消息会包含设备地址(0x50)和要写入的内部地址(0x10)。
2.读取数据
第二个i2c_msg是一个读操作,用于从EEPROM中读取数据。此时,EEPROM已经知道了要读取的地址(因为刚才设置了内部地址指针),所以这个消息会包含设备地址(0x50)和用于存储读取数据的缓冲区。
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
int read_eeprom(struct i2c_client *client, u8 addr, u8 *data, size_t len) {
int ret;
struct i2c_msg msgs[2];
u8 buf[1];
// 第一个消息:设置内部地址指针