我不明白为什么 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/