Linux驱动——为什么驱动read的时候要使用两个i2c_msg

为什么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];

    // 第一个消息:设置内部地址指针
### RV1103 I2C 数据读取方法 对于RV1103芯片而言,其I2C接口遵循标准的I2C协议。为了实现数据读取功能,在Linux环境下开发时需先完成`i2c_driver`结构体定义并将其注册至内核中[^1]。 一旦设备成功匹配上对应的驱动程序,则会触发该驱动中的`probe()`函数调用。此阶段主要负责初始化工作以及设置好后续用于访问硬件资源所需的各种参数配置。针对具体的I2C设备操作,比如向目标器件发送命令或者获取传感器返回的数据包等内容,则依赖于`i2c_transfer()`所提供的API来达成目的;它允许应用程序层通过传递消息队列的方式与底层硬件交互,从而简化了编程模型的设计复杂度。 下面给出一段基于上述原理编而成的例子代码片段: ```c static int rv1103_i2c_read(struct i2c_client *client, u8 reg_addr, u8 *data, int length) { struct i2c_msg msgs[2]; char buf[1]; /* Write register address */ buf[0] = reg_addr; msgs[0].addr = client->addr; // Slave device address msgs[0].flags = 0; // Write flag msgs[0].len = sizeof(buf); // Length of data to write msgs[0].buf = &buf; /* Read data from the specified register */ msgs[1].addr = client->addr; // Same slave device address as above msgs[1].flags = I2C_M_RD; // Read flag msgs[1].len = length; // Number of bytes we want to read back msgs[1].buf = data; // Buffer where received data will be stored if (i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)) != 2) { dev_err(&client->dev, "Failed to perform I2C transfer\n"); return -EIO; } return 0; } ``` 这段代码展示了如何利用两个连续的消息传输过程——先是发出指定寄存器位置的信息给slave端(即RV1103),紧接着再请求接收来自同一节点的实际测量数值或其他形式的状态报告等信息。值得注意的是,这里的具体细节可能会因实际应用场景的不同而有所变化,因此建议开发者参照官方文档进一步了解更详尽的操作指南和最佳实践方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Comedy_宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值