This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

OPT3001: IIC读取设备名称和ID可以正常读出,但是读光照值为0

Part Number: OPT3001

IIC读取传感器信息的方式都是相同的,读opt3001的厂商信息TI和设备ID3001都可以正常读出,但是将寄存器地址改为0后读取光照值就一直为0,将配置寄存器,配置后也能正常读出配置的值

IIC读取流程:起始信号—>发送设备地址加写信号,等待应答—>发送寄存器地址(一个字节)—>起始信号—>发送设备地址加读信号,等待应答—>读两个字节—>停止信号

  • IIC读取流程:起始信号—>发送设备地址加写信号,等待应答—>发送寄存器地址(一个字节)—>起始信号—>发送设备地址加读信号,等待应答—>读两个字节—>停止信号

    您好,如果寄存器地址不变的话,不需要重新发起起始信号。

    比如要读取00h的值,流程如下:

    start+7bit slave address+R+ACK+00h+ACK+MSB(00h)+ACK+ LSB(00h) +NACK+stop 

  • 按照start+7bit slave address+R+ACK+00h+ACK+MSB(00h)+ACK+ LSB(00h) +NACK+stop 的形式修改读寄存器的流程,修改后并不能读取光照值,并且连设备id和厂商都会读取失败,之前的读取流程可以读取厂商和id,如果都是通用的话,应该可以直接读取光照值(00h)

  • 您好,这是读操作的时序。

    起始信号—>发送设备地址加写信号,等待应答—>发送寄存器地址(一个字节)—>起始信号—>发送设备地址加读信号,等待应答—>读两个字节—>停止信号

    在这个时序中,7bit从机地址后面是W写操作,那说明是要对某个寄存器进行配置,但是后面加了寄存器的地址之后,又重新发送给了repeat 起始信号对其进行读操作,实际并没有进行寄存器的写。

    Device ID和读取光照的寄存器(00h)都是只读寄存器,不需要对其进行配置,所以直接参考Figure21的read timing 就可以。

    如果是配置寄存器,我们可以先写,再读,流程如下:

    Start+7bit address+ W+ ACK+ Configure register address+ ACK + 7bit address +R+ Ack +Configure register data +NACK + Stop

    因为读写都是configure regsiter,所以不需要发送repeat command。

    但假如先对configure register 进行写操作,再去读取其他寄存器,也就是其他寄存器地址改变,需要主机重新发送起始命令。 

  • 我现在应用逻辑是这样的:设备上电,读取设备id和厂商,往配置寄存器(01h)里写两个字节0xC410,然后读取结果寄存器(00h),接着读取配置寄存器(01h)里面的内容,他们的结果是(3001)、(TI)、(c410)、(c410)

    ,由此发现往配置寄存器写的内容会在结果寄存器和配置寄存器读到

  • 设备上电,读取设备id和厂商,往配置寄存器(01h)里写两个字节0xC410,然后读取结果寄存器(00h)

     对配置寄存器先写,然后并没有读配置寄存器,而是先读取结果寄存器00h是吗? 

    这样的话,在写完配置寄存器,有收到ACK信号之后,因为要读取的寄存器变了,所以是需要主机再发送一个repeat 起始命令,然后7 bit地址+Read+00h+ACK+data(00h MSB )+ACK+LSB(00h)。

    然后这时候读取的00h的值都为零是吗?

    接着读取配置寄存器(01h)里面的内容

    读完寄存器00h,接着又去读的配置寄存器吗?

  • 是的,读完寄存器00h后,再去读配置寄存器,发现00h读到的数据是0xc490,配置寄存器读到的是0xc410(正好就是配置的数据)

  • 读完寄存器00h后,再去读配置寄存器,发现00h读到的数据是0xc490,

    您的第一个帖子说00h读取的值为00,现在读取的是0xC490了吗?每一次读写都能收到ACK信号吗?

  • 您好,我建议您去验证两个方面:

    1)上电后,对配置寄存器配置完之后可以紧接着去读配置寄存器,然后再去读结果寄存器,看光照结果是不是正确?

    2。 将配置寄存器的bit 10:9连续转换模式改为one shot单次转换试试,看光照结果是否正确?

  • 在结果寄存器之前或者之后读配置寄存器,结果都是配置的内容,但是结果寄存器,却一直是定值,

    (配置寄存器0xc210后读配置寄存器,再读结果寄存器)当opt3001 config: 0xc210时结果寄存器定值0xc090,

    (配置寄存器0xc410后读结果寄存器,再读配置寄存器)当opt3001 config: 0xc410时结果寄存器定值0xc410,

    换了板子也是这样,读出以上的值,不知道为什么会是这样

  • 好的,我这边收到您的反馈,我再看看这个问题。

    也就是说每次读取到的结果寄存器的值都不会随着转换而更新是吗?

    并且您现在读取的结果寄存器的值和光照匹配吗?