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:INA226读取问题。

Guru**** 2590300 points
Other Parts Discussed in Thread: INA226, MSP430FR4133

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

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/682865/ina226-ina226-reading-problem

器件型号:INA226
主题中讨论的其他器件: MSP430FR4133

我在读取 INA226寄存器时遇到问题。

void INA2226_ReadReg (uint32_t SLAVE_ADR、uint8_t REG_addr、uint16_t *值)
{
uint8_t val[2];

/*------ 第一步-设置寄存器地址以便从---读取 *

//对于写入操作,R/WN 位应该为低电平
uint8_t SLAVE_ADDRESS = SLAVE_ADR 和0xFE;

I2C0_Start();

/*使用 W/R 位发送从地址*/
I2C0_WRITE_BYTE (SLAVE_ADDRESS);
I2C0_WAIT ();

/*设置寄存器地址*/
I2C0_WRITE_BYTE (REG_addr);
I2C0_WAIT ();


/*------ 第二步-从写入的寄存器地址读取--- *

//读取的从器件地址
SLAVE_ADDRESS = SLAVE_ADR | 0x01;

//I2C0_Start();
I2C0_RepeatedStart();

I2C0_WRITE_BYTE (SLAVE_ADDRESS);
I2C0_WAIT ();

//进入 Rx 模式
I2C0_C1 &=~I2C_C1_TX_MASK;

//确保 TXAK 位为0
I2C0_C1 &=~I2C_C1_TXAK_MASK;

//关闭 ACK,因为这是被读取的最后一个字节的第二个字节
//I2C0_C1 |= I2C_C1_TXAK_MASK;

//虚拟读取-为什么????
Val[0]= I2C0_D;
I2C0_WAIT ();

Val[0]= I2C0_D;
I2C0_WAIT ();

//禁用 akn
I2C0_C1 |= I2C_C1_TXAK_MASK;

Val[1]= I2C0_D;
I2C0_WAIT ();

I2C0_Stop();

*值=(val[0]<< 8)| val[1];

} 

这样、我从 INA226_MANUFACK_ID (0x5449)和 INA226_DIE_ID (0x2260)寄存器中读取正确的值。
正如您看到的、我需要一个虚拟读取来使其正确。

但是、当我触发测量、然后读取电压、分流、电流寄存器时、我会得到一些错误的值。
我的寄存器读取算法有什么问题?

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

    感谢您在设计中使用德州仪器。 根据您发布的代码、我怀疑您使用的从地址是问题所在。 某些微控制器具有由单独寄存器控制的读取和写入位。 为了说明这一点、我将以 MSP430FR4133为例。 假设我执行以下代码:

    SLAVE_ADR = 0x40; //地址应该只有7位、从器件的 A1和 A0连接到 GND
    UCB0I2CSA = SLAVE_ADR;//针对将被发送的从器件地址的寄存器
    UCB0CTLW0 &=~UCTR;//微控制器 I2C 设置寄存器在用户指南中列为 UCBxCTLW0。 UCTR = 0x10、该位决定是否是主器件
    //设置为发送或接收
    因此、我希望在 SDA 线路上有以下位流:START、1、0、0、0、0、0 (读取)、0 (从器件应答)。

    您的微控制器可能不同。 因此、我将使用用户指南或示波器快照进行验证。

    如果仍然有问题、我建议您附上示波器快照、以便我们更好地了解主从设备之间的交互实际上是什么样的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Evgeny、

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

    我有一个非常奇怪的情况-在逻辑分析仪上、我看到了一个正确的值、但当我读取它时、我得到了一个错误的结果。

    您能否显示 MSP430F 的读取函数?

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

    您好 Evgeny、

    下面我粘贴了一些代码 、这些代码显示了如何使 MSP430FR4133主器件从分配了地址0x48的从器件读取1个字节。  此外、为供将来参考、对于我们的许多微控制器、您可以在产品页面的"工具和软件"选项卡下找到发布的示例代码(www.ti.com/.../toolssoftware)。

    图1:示例代码位置

    //将 USCI_B0配置为 I2C 模式

      UCB0CTLW0 |= UCSWRST;          //软件复位被启用

      UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC;// I2C 模式、主控模式、同步

      UCB0CTLW1 |= UCASTP_2;          //生成自动停止

                          //到达 UCB0TBCNT 后

      UCB0BRW = 0x0008;            //波特率= SMCLK /8

      UCB0TBCNT = 0x0001;           //要接收的字节数

      UCB0I2CSA = 0x0048;           //从器件地址

      UCB0CTL1 &=~UCSWRST;

      UCB0IE |= UCRXIE | UCNACKIE | UCBCNTIE;

      while (1)

      {

        _DELAY_CYCLES (2000);

        while (UCB0CTL1 & UCTXSTP);     //确保发送了停止条件

        UCB0CTL1 |= UCTXSTT;         // I2C 启动条件

        _bis_SR_register (LPM0_bits|GIE); //通过中断输入 LPM0

      }

    //*********

    //中断服务例程

    //*********

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

    #pragma vector = USCI_B0_vector

    _interrupt void USCIB0_ISR (void)

    #Elif defined (_GNU_)

    void __attribute__((中断(USCI_B0_vector)) USCIB0_ISR (void)

    其他

    错误编译器不受支持!

    #endif

     开关(__evo_in_range (UCB0IV、USCI_I2C_UCBIT9IFG))

     {

      USCI_NONE 案例:      中断;     //向量0:无中断

      USCI_I2C_UCALIFG 案例: 中断;     //向量2:ALIFG

      USCI_I2C_UCNACKIFG 案例:         //向量4:NACKIFG

       UCB0CTL1 |= UCTXSTT;          // I2C 启动条件

       中断;

      案例 USCI_I2C_UCSTTIFG: 中断;     //向量6:STTIFG

      案例 USCI_I2C_UCSTPIFG: 中断;     //向量8:STPIFG

      USCI_I2C_UCRXIFG3案例: 中断;     //向量10:RXIFG3

      USCI_I2C_UCTXIFG3案例: 中断;     //向量14:TXIFG3

      USCI_I2C_UCRXIFG2案例: 中断;     //向量16:RXIFG2

      USCI_I2C_UCTXIFG2案例: 中断;     //向量18:TXIFG2

      USCI_I2C_UCRXIFG1案例: 中断;     //向量20:RXIFG1

      USCI_I2C_UCTXIFG1案例: 中断;     //向量22:TXIFG1

      USCI_I2C_UCRXIFG0案例:         //向量24:RXIFG0

       RXData = UCB0RXBUF;          //获取 RX 数据

       _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0

       中断;

      案例 USCI_I2C_UCTXIFG0: 中断;     //向量26:TXIFG0

      USCI_I2C_UCBCNTIFG 案例:         //向量28:BCNTIFG

       P1OUT ^= BIT0;             //在 P1.0上切换 LED

       中断;

      USCI_I2C_UCCLTOIFG 案例:中断;     //向量30:时钟低电平超时

      USCI_I2C_UCBIT9IFG 案例:中断;     //向量32:第9位

      默认值:break;

     }

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

    非常感谢。