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.

[参考译文] OPPT3001:配置寄存器的意外值

Guru**** 1641220 points
Other Parts Discussed in Thread: OPT3001, OPT3007
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1066089/opt3001-unexpected-value-of-configuration-register

部件号:OPT3001
“线程: 测试OPT3007”中讨论的其它部件

大家好

我们在 imx6dl 平台上使用了 opt3001传感器,并将驱动程序与 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/iio/light/opt3001.c 一起使用 ,在我们的产品中读取/写入 lux。

我们读取 in_照明 度输入的设备节点文件,以便在程序中每隔2秒获得一次 lux。  

  当程序运行几个月,并且我使用 cat 命令获取 lux 时,它无法正常工作,结果是:

# cat in_照明_input
CAT:读取错误:连接超时

使用 i2cget 命令从 opt3001读取配置寄存器,结果是:

 i2cget -f 0x44 1 w

0x9fc0

结果,我发现 POL 和 FC 位已更改,默认情况下,POL 为0,而 FC=00,但当它无法正常工作时,POL 为1,而 FC=11

我分析了 opt3001.c 的源代码,发现配置寄存器的 POL 和 FC 文件只在中更改 
opt3001_configure,但仅当驱动程序已被探测到时才调用。

所以,我不知道哪种操作会改变 POL 和 FC 的值,并将它们设置为不预期的值。

最佳

梁。 周

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    如果配置寄存器的结果为0x9FC0,则 FC=00和 POL=0,因为它们是配置寄存器的位2:0。 POL=1和 FC=11时的配置寄存器结果是什么?

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的回复。

    1.  

    我使用“i2cget -f 5 0x44 1 w” 获取配置寄存器的值 ,结果是 0x9FC0 (由于字节顺序,位7:0为0x9F),因此位2:0为111b。

    我已使用 i2cset 设置 配置  寄存器进行进一步测试:

    i2cset -f -y 5 0x44 1 0x17C0 w   (位7:0 为0x17,  因此此命令可以将 PL 设置 为0)

    通过这样做,我们可以从 IN_照明 度输入中读取 lux,结果是:

    root@/sys/bus/IIO/devices/IIO:device0# cat in_照明_input
    30.540000

      2.另一台计算机上也发生了同样的问题,,配置寄存器的结果是:0x1ffa,的实际值
    由于 字节顺序,配置寄存器为0xfa1f。

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    我现在来看一下,我很快就会回来。

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的,谢谢!

    梁。 周

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    由于某种原因,I2C 在一段时间后更改配置寄存器。 这种情况不会发生,可能需要您进行一些故障排除,以确定此问题的发生时间,以及是否有其他可能导致此问题的因素,因为 opt3001.c 文件不应将配置寄存器设置为这些值。

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,布伦特·埃利奥特,

    我们已经做了一些测试,当机器运行了大约五天,  并且在 opt3001设备文件上只有一个程序运行时,就会出现问题。

    如果配置寄存器的值不正确,驱动程序将在 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/iio/light/opt3001.c 的第280行失败

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    您是否能够在故障期间捕获 I2C 波形?

    此代码不受直接支持,因此我们无法帮助调试它。 我们确实有一个 C 代码驱动器,我们可以更好地支持它,并且可以在任何平台(包括 Linux)上运行。

    https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/872229/faq-opt300x-family-parts-what-are-the-available-drivers-for-ti-s-family-of-ambient-light-sensors

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好,我们使用的驱动器与您所说的相同,我们仍在对 opt3001进行更多测试,我们将在计算故障时尝试捕获 I2C 波形。

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    我在共享的链接中引用的驱动程序称为“52520.OPT3007-C-Driver-example.zip”。 它是为 OP3007配置的,但您可以 通过更新 在 opt3007_hostControl.h 行15中定义的 TI_OP3007_BUSADDRESS 来为 OP3001配置它

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    我现在要结束这条线程。 如果您需要进一步帮助,请告诉我。

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨, 布伦特·埃利奥特

    好的,我们正在对 opt3001进行更多测试,意外 的配置寄存器值很难再现,如果我们发现更多线索,我会咨询您。

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨, 布伦特·埃利奥特
    我们使用 Arduino 微控制器读取配置寄存器,并且只有 opt3001已连接到微控制器,测试程序将持续读取配置寄存器的值,该值 最初是正确的, 但在运行16天后,它的值将变为无效,
    配置寄存器的值在0xFE9F 和0xFE1F 之间切换。

    当我们重新启动 opt3001时,读取值再次正常(值为0xc810)。

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    您是否能够捕获故障的波形? 您是否曾尝试使用 OP3007驱动程序来查看故障是否仍然发生,或者您是否已在 Arduino 上编写了自己的代码?

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1.我们在 Arduino 上使用自己的代码 ,在 Arduino 上运行的测试程序 如下所示,它仅从配置寄存器中读取值,并确定该值是否正确:

    #include <U8glib.h>
    #include <Wire.h>
    #include <数学.h>
    #include <stdlib.h>

    //Init 液晶屏 Init 针脚
    #define SCK 13.
    #define MOSI 11.
    #define CS 10.
    U8GLIB_ST7920_128x64_1X u8g (SCK,MOSI,CS);// SPI COM:SCK = en = 18,MOSI = RW = 16,CS = DI = 17

    //控制引脚
    #define remote_CTR 2.
    无符号 int 值;
    无符号 int 读数=0;

    void show_Running"(无符号长值)

    字符值_str[10];
    Sprintf (value_str,"%s","值:",值);

    //在 LCD 上显示配置寄存器值
    u8g.firstPage();
    请执行{
    u8g.drawStr( 0,60, value_str);
    }同时(u8g.nextPage());
    }

    //显示错误消息
    void show_error_setting (void){
    u8g.setFont(u8g_font_unifont);
    u8g.drawStr( 0,22,“错误”);
    }


    //显示正常消息
    作废 SHOW_RIGHT 设置(作废){
    u8g.setFont(u8g_font_unifont);
    u8g.drawStr( 0,22,“右”);
    }

    void setup()(无效设置())

    Wire.begin();
    Serial.begin(9600);//init 血清分级率
    }

    void loo()

    Wire.beginTransmission(0x44);//传输到设备#112
    wire.write(byte(0x01));//将寄存器指针设置为 echo #1寄存器(0x02)

    //请求来自 opt3001传感器的读数
    wire.endTransmission ();
    wire.requestFrom (0x44,2);
    如果(2<= Wire.Available ()))

    读数= Wire.read();//接收高字节(覆盖以前的读数)
    读数=读数<<8;//将高字节转换为高8位
    读数|= Wire.Read();//接收低字节为8位
    值=读数;

    //打印读数
    延迟(300);

    如果(value=0xc810)//

    serial.println("right");
    u8g.setFont(u8g_font_unifont);

    u8g.firstPage();
    做什么
    show_right_setting();
    }同时(u8g.nextPage());
    }
    否则

    serial.println("错误");
    serial.println(值);
    u8g.setFont(u8g_font_unifont);

    u8g.firstPage();
    做什么
    显示_运行(值);
    }同时(u8g.nextPage());
    }

    }
    否则

    serial.println("错误");
    u8g.setFont(u8g_font_unifont);
    show_error_setting();
    u8g.firstPage();
    做什么
    show_error_setting();
    }同时(u8g.nextPage());
    }
    }

    2. Arduino 硬件原理图如下:

    e2e.ti.com/.../Arduino_5F00_Uno_5F00_Rev3_2D00_schematic.pdf
    opt3001连接到 Arduino 的 AD4和 AD5,并使用10 kΩ 电阻器连接到电源。



    3.如我们之前所述,当该程序运行16天时,将出现无效值。  

    在程序运行大约10天之前,我们捕获了一个故障波形,但波形太短,它仅显示来自的错误值读数
    配置寄存器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    您的 I2C 线路和 Vdd 之间似乎没有任何上拉电阻器。 您的 INT 引脚有一个上拉电阻器,但每个 I2C 线路也需要一个。 除非 您在 Arduino 中设置了内部扩展,否则这可能是问题的原因。

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨, 布伦特·埃利奥特

      在 kΩ    中,我们为每个 i2c 线路连接了一个外部10 µ A 电阻器, 很抱歉,图中没有显示 I2C 线路的上拉电阻器。

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,梁

    您有 I2C 线路的图片吗? 此外,由于此帖子已开放30天,您能否发布具有相同问题的新线程,此帖子可能很快因打开时间太长而锁定。

    谢谢你,

    布伦特·埃利奥特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨, 布伦特·埃利奥特

    好的,我在中发布了一个新的主题来讨论这个问题  

    https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1078330/opt3001-test-for-unexpected-value-of-configuration-register

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    关闭此线程并在新线程中选取此线程。