我不明白为什么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");
答案 0 :(得分:1)
I2C协议可以使用两个地址:I2C总线上芯片的地址(7位或10位)和寄存器的地址。从技术上讲,寄存器的地址比I2C高,因此它实际上不是I2C协议的一部分。
发送数据时,所有发送的数据将来自主机。没有“响应”。
当您接收数据时,所有接收到的数据将来自设备。没有“注册地址”。
因此,在这种情况下,您实际上想知道如何通过其地址读取寄存器。这是特定于设备的,但通常可以通过先以某种方式告诉(发送)设备所访问的地址而没有其值,然后从设备读取数据来起作用。
我不确定您的特定芯片是如何设计的,但是如果我是微芯片设计者,我将支持只写入1个字节(地址,没有值)然后读取1个字节(因此,从任意寄存器地址读取)在地址处返回值)。我还将支持通过写入2个字节(地址,值)来写入任意寄存器地址。
因此,基本上,您必须通过发送其地址来选择寄存器,然后才能通过接收其内容来访问该寄存器。
我不确定您的芯片是否采用这种方式设计。您非常需要认真研究该芯片的I2C规格。