c - i2c_master_recv 的值从何而来?

标签 c linux linux-kernel

我不明白为什么 i2c_master_send 需要注册地址​​?

但是i2c_master_recv不需要寄存器地址。

我可以使用 i2c_master_recv 接收特定的寄存器地址值吗?

i2c_master_recv 的值从何而来?

为什么i2c_master_send第三个参数是2而i2c_master_recv第三个参数是1?

下面是 i2c_master_send 和 i2c_master_recv 的示例代码。

非常感谢。

    struct i2c_client *client
    unsigned char buf[2] = {0};
    int ret;

    buf[0]=0x30;//set register's address
    buf[1]=0x05;//set register's value

    //set register
    ret = i2c_master_send(client, buf, 2);
    if(ret < 0)
        printk(KERN_ERR "Write data failed\n");
    //read register
    ret = i2c_master_recv(client, buf, 1);
    if(ret < 0)
        printk(KERN_ERR "Read data failed\n");

最佳答案

I2C 协议(protocol)可以使用的地址有两种:I2C 总线上芯片的地址(7 位或 10 位)和寄存器地址。从技术上讲,寄存器的地址比 I2C 高一级,因此它并不是真正的 I2C 协议(protocol)的一部分。

当您发送数据时,所有发送的数据都将来自主机。不会有“回应”。

当您接收数据时,所有接收到的数据都将来自设备。没有“注册地址”。

因此,在这种情况下,您基本上想知道如何通过地址读取寄存器。这是特定于设备的,但通常会通过首先以某种方式告诉(发送)设备您正在访问的地址而不包含其值,然后从设备读取数据来工作。

我不确定您的特定芯片是如何设计的,但如果我是微芯片设计者,我会通过仅写入 1 个字节(地址,无值)然后读取 1 个字节(因此返回地址处的值)。我还支持通过写入 2 个字节(地址、值)来写入任意寄存器地址。

因此,本质上您必须通过发送地址来选择寄存器,然后您可以通过接收其内容来访问寄存器。

我不确定你的芯片是不是这样设计的。您真的需要仔细查看芯片的 I2C 规范。

关于c - i2c_master_recv 的值从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839969/

相关文章:

c - 从数组中删除数字?

linux - 在 AWK 中使用 if/else 语句

c - POSIX 信号量 : Why come the parent process acquire semaphore before child releases it?

mysql - 脚本执行mysql查询,返回列名+结果

c - 内核空间和用户空间之间的大共享内存

Linux内核调度程序变量 "vruntime"

linux - 不引导嵌入在 Linux 内核中的 RAM 文件系统

c++ -++i 与 i++ : is there any difference on any modern compiler?

c - 将指向变量的指针保留在范围之外是否安全?

c - unix tcp 客户端/服务器奇怪的行为