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.

[参考译文] INA226校准回读不正确

Guru**** 2814355 points

Other Parts Discussed in Thread: INA226

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/902997/ina226-calibration-readback-incorrect

器件型号:INA226

校准回读应该适用于 INA226 (寄存器0x05)、应该回读我写的任何内容、对吧?

我有一些奇怪的事情发生了。  如果我复位芯片并读取0x05、我读取0x0000、这是预期的复位值。  如果我向它写入所需的值(十进制838)、那么当我读取0x05时、我会返回胡说。

我的写操作使用的是导线库、如下所示:

uint16_t cal = 838;
Wire.beginTransmission(INA_ADDR);
Wire.write (0x05);/* cal 寄存器*/
Wire.write((cal >> 8)| 0xFF);/*高位字节*/
Wire.write( cal & 0xFF );/*低位字节*/
Wire.endTransmission (); 

当我读取时、我必须执行完全不同的操作。  我必须首先设置寄存器、如下所示:

uint16_t cal = 838;
Wire.beginTransmission(INA_ADDR);
Wire.write (0x05);/* cal 寄存器*/
Wire.endTransmission ();

Wire.requestFrom (INADDR、2);
byte high = Wire.read();
byte low = Wire.read();
Wire.endTransmission ();

我不确定原因、但如果我尝试在单个事务(开始、写入、读取、读取、结束)中执行该操作、似乎无法正确锁定地址。  它们必须是两个完全独立的事务。

我认为我的读操作正常(我可以读回总线电压和分流电压、这是有道理的)、但我认为我的写操作一定要关闭。  我尝试在两个事务中进行配置-写入寄存器地址(然后结束传输)、然后写入该值。  它也不是这样工作的。

对于不熟悉的用户、endTransmission 在 I2C 语言中基本停止。

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

    嗨、Christopher、

    感谢您在论坛上发帖。 在写入序列期间、一旦置位、寄存器指针不应改变。 可能会发生许多事情。

    1. 时钟速度是多少?
    2. 您是否能够正确读回校准寄存器中838的内容?
    3. 写入校准寄存器后、您是否读取了正确的电流和功率寄存器值? 如果是、这意味着校准寄存器实际上被正确编程。
    4. 可能违反表3中所示的以下时间:
      1. t (BUF)-停止和启动条件之间的总线空闲时间
      2. T (HDSTA)–重复启动条件后的保持时间。
      3. T (SUSTA)-重复 START 条件建立时间。

    我不希望您的最后一种方法在写入寄存器地址、endTransmission、然后写回值时起作用。 这是因为数据表中显示的写入命令显示的值恰好在指针地址之后、两者之间没有停止条件。

    此致、

    Peter

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

    谢谢你。  帮助我的主要原因是您告诉我"它应该起作用"。

    不管用。  我的运行频率仅为400kHz、因此没有什么疯狂的事情。  最大的问题是:

    Wire.write ((cal >> 8)| 0xFF);/*高字节*/
    Wire.write (cal & 0xFF);/*低字节*/ 

    这不是你怎么做的,它应该是(cal>>>8)和0xFF…… 实际上、一个字节的掩码甚至是不必要的、GCC 无论如何都会对其进行优化。  为了清晰起见、我用这种方式写、这次用"bit and"换为"bit or"、只是把我弄砸了。  新手的错误,盯着它4个小时,没有看到它。  我将逻辑分析仪与 I2C 协议驱动器相连、并询问"为什么要编写它?"  (笑声) Sheesh。

    感谢您的回复、非常感谢。