0

我正在研究 VEML7700 Lux 传感器。数据表链接。我可以使用 i2c-tool 检测传感器并读取/写入数据。传感器的 I2C 地址为 0x10。在这里,我可以正确读取 0x04 结果寄存器。

apalis-imx8-06852506:~$ i2cdetect -y -r 4
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: 10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: 30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
apalis-imx8-06852506:~$ i2cget -y 4 0x10 0x00 w
0x0000
apalis-imx8-06852506:~$ i2cget -y 4 0x10 0x00 w
0x0000
apalis-imx8-06852506:~$ i2cget -y 4 0x10 0x04 w
0x0930
apalis-imx8-06852506:~$ i2cget -y 4 0x10 0x04 w
0x093c
apalis-imx8-06852506:~$ i2cget -y 4 0x10 0x04 w
0x0939
apalis-imx8-06852506:~$ 

当我试图在 c 程序中读取寄存器时,我得到恒定的 0 值。但我也可以在 c 程序中使用 write 命令写入配置寄存器。

这是我的c程序。

#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>

//sensor i2c address is 0x44
#define SLAVE_ADDR 0x10

void main()
{
    // Create I2C bus
        int file;
        char *bus = "/dev/apalis-i2c1";
        if((file = open(bus, O_RDWR)) < 0) 
        {
                printf("Failed to open the bus. \n");
                exit(1);
        }
        // Get I2C device, VEML7700 I2C address is 0x10-7BIT
        ioctl(file, I2C_SLAVE, SLAVE_ADDR);

        //unsigned char reg[1] = {0};
        //unsigned char data[2] ;
        __uint16_t reg_data;

        //configuring the register 0x00
        char config[3] = {0};
        config[0] = 0x00;
        config[1] = 0x00;
        config[2] = 0x00;
        write(file,config,3);
        sleep(1);

        unsigned char reg[1] = {0x04};
        write(file, reg, 1);
        sleep(1);
        unsigned char data[2] = {0};
        if(read(file, data, 2) != 2)
        {
                printf("Erorr : Input/output Erorr \n");
                exit(1);
        }
        printf(" data[0] %x\n data[1] %x\n",data[0],data[1]);

        close(file);
}

root@apalis-imx8-06852506:/bhagwatws# gcc light_sensor.c -o light_sensor
root@apalis-imx8-06852506:/bhagwatws# ./light_sensor
 data[0] 0
 data[1] 0
root@apalis-imx8-06852506:/bhagwatws# ./light_sensor
 data[0] 0
 data[1] 0
root@apalis-imx8-06852506:/bhagwatws# ./light_sensor
 data[0] 0
 data[1] 0

4

1 回答 1

0

您尝试读取寄存器 0x​​04 失败,因为您选择寄存器 0x​​04 的写入事务和随后的字读取不是在同一个 I2C 事务中执行,而是作为单独的事务执行。

来自https://www.kernel.org/doc/Documentation/i2c/dev-interface

请注意,只有一部分 I2C 和 SMBus 协议可以通过 read() 和 write() 调用来实现。特别是,不支持所谓的组合事务(在同一个事务中混合读取和写入消息)。因此,用户空间程序几乎从不使用此接口。

而是使用以下访问方法:

ioctl(文件,I2C_RDWR,结构 i2c_rdwr_ioctl_data *msgset)

于 2022-03-01T23:59:12.010 回答