i2c_master_recv的值从哪里来?

时间:2019-02-23 09:03:55

标签: 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");

1 个答案:

答案 0 :(得分:1)

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

发送数据时,所有发送的数据将来自主机。没有“响应”。

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

因此,在这种情况下,您实际上想知道如何通过其地址读取寄存器。这是特定于设备的,但通常可以通过先以某种方式告诉(发送)设备所访问的地址而没有其值,然后从设备读取数据来起作用。

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

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

我不确定您的芯片是否采用这种方式设计。您非常需要认真研究该芯片的I2C规格。