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.

[参考译文] LAUNCHXL2-570LC43:不确定通过 I2C 连接 INA219 电流传感器的程序。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1522297/launchxl2-570lc43-unsure-of-procedure-to-connect-with-an-ina219-current-sensor-through-i2c

部件号:LAUNCHXL2-570LC43
主题中讨论的其他部分:INA219、、 HALCOGEN

工具/软件:

您好:

我无法在线找到详细说明如何通过 I2C 与 LAUNCHXL2-570LC43 通信读取 INA219 上的寄存器值的文档。 我将 INA 的 VCC 和 GND 连接到微处理器的 3.3V 电源和接地端。 SCL 连接到 3CS3 引脚、而 SDA 连接到我的 LAUNCHXL 上的 3CS2 引脚(升压组 1、J2 列、引脚 8 和 9)、如详细说明可以使用这些引脚建立 I2C 连接的电路板原理图(请参阅 https://www.ti.com/lit/df/sprr397/sprr397.pdf?ts = 1748924725068 BoosterPack 站点 1、第 7 页)。 目前、我还没有设置要分析的电路、因为我只想了解是否可以读取寄存器。 不过、我很困惑这部分:我想知道是否有专门针对此器件的指南、因为我似乎无法调整 HALCoGen TMS570LC43x example_i2cCommunication.c 示例以满足我的需求。 有人能不能让我知道如何构建我的代码、以便在两个器件之间执行此通信协议、从而仅以总线电压寄存器等寄存器上的值为例?

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

    尊敬的 Stefano:

    实际上、主站端的 I2C 设计方式可以连接到任何 I2C 从设备。 因此、很难找到所有从设备的文档。 不过、在从器件数据表中、只有它们应提及与相应器件相关的过程和协议。

    我觉得这是一款全新的 I2C 从设备、但我可以通过了解该设备来帮助您。

    您是否通过 SCL 和 SDA 线路连接了任何上拉寄存器?

    如果没有外部上拉电阻器、I2C 将无法正常工作。

    确保在 SDA 和 SCL 线路上连接外部上拉电阻。 上拉电阻既不应过高、也不应过小、最好在 2.2K 到 4.7K 之间。  

    即使您也无法使用内部上拉电阻器、因为内部上拉电阻器太弱、无法用于 I2C。 它们足以防止引脚悬空。  必须为 I2C 信号提供外部上拉电阻。

    因此、请在 I2C 线路和板中的 3.3V 电源之间连接上拉电阻。

    有关更多详细信息、您可以参考下面的主题、在这里、客户最初尝试不使用上拉电阻器、发现通信无法正常工作、最后他使用 2.2K 连接了外部上拉电阻器、然后他发现通信正常。

    有关更多详细信息、请参阅以下主题:

    (18) TMS570LS3137:温度传感器 (tmp101nA/3k)-基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

    (18) TMS570LS1224:I2C 中无法使用 i2cSend () 发送值的问题 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

    (18) TMS570LS3137:I2C 不工作 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

    --
    此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我的 INA219 在电路板上连接了大约 10kΩ Ω 的内部上拉电阻器。 我猜该值太高、会阻止任何 I2C 通信吗?

    非常感谢您的帮助!

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

    您是对的。

    上拉电阻既不应过高、也不应过小、最好在 2.2K 到 4.7K 之间。  

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

    感谢您让我知道、我目前正在使用此代码来测试 INA219 的通信是否正常。 我注意到在调试时 SCL 线路上的电压从 3.3V 下降到 0V、发出通信正在进行的信号、但我似乎无法越过 i2cReceive (...);函数、因为它卡在“ while (i2c->STR 和 (uint32) I2C_RX_INT)== 0U){}“函数中。 您能否向我提供一些见解、说明为什么会陷入困境?

    #include "HL_sys_common.h"
    #include "HL_i2c.h"
    #include "HL_sys_core.h"
    #include <stdio.h>
    
    #define INA219_ADDR        0x40
    #define INA219_REG_BUSVOLT 0x02
    
    int main(void)
    {
        uint8 tx_data = INA219_REG_BUSVOLT;
        uint8 rx_data[2];
    
        i2cInit();
    
        /** Write register address to INA219 **/
        i2cSetSlaveAdd(i2cREG1, INA219_ADDR);
        i2cSetDirection(i2cREG1, I2C_TRANSMITTER);
        i2cSetCount(i2cREG1, 1);
        i2cSetMode(i2cREG1, I2C_MASTER);
        i2cSetStart(i2cREG1);
        i2cSend(i2cREG1, 1, &tx_data);  
        i2cSetStop(i2cREG1);
    
        /** Read 2 bytes from bus voltage register **/
        i2cSetDirection(i2cREG1, I2C_RECEIVER);
        i2cSetCount(i2cREG1, 2);
        i2cSetMode(i2cREG1, I2C_MASTER);
        i2cSetStart(i2cREG1);
        i2cReceive(i2cREG1, 2, rx_data);
        i2cSetStop(i2cREG1);
    
        uint16 raw = ((uint16)rx_data[0] << 8) | rx_data[1];
    
        // Convert to actual voltage
        float voltage = (raw >> 3) * 0.004;  // 4 mV per bit
    
        printf("%d", voltage);
    }

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

    尊敬的 Stefano:

    我验证了您的代码以及 INA219 的数据表。

    1.首先、我想确保这一点、因为您使用的是从器件地址 0x40、这意味着您应该将 A1 和 A0 地址线接地。 希望您在硬件中完成此操作。

    2.现在我对您的代码做了一些更改,尝试使用此修改后的代码一次,并将状态更新为我:

    #include "HL_sys_common.h"
    #include "HL_i2c.h"
    #include "HL_sys_core.h"
    #include <stdio.h>
    
    #define INA219_ADDR        0x40
    #define INA219_REG_BUSVOLT 0x02
    
    int main(void)
    {
        uint8 tx_data = INA219_REG_BUSVOLT;
        uint8 rx_data[2];
    
        i2cInit();
    
        /** Write register address to INA219 **/
        i2cSetSlaveAdd(i2cREG1, INA219_ADDR);
        i2cSetDirection(i2cREG1, I2C_TRANSMITTER);
        i2cSetCount(i2cREG1, 1);
        i2cSetMode(i2cREG1, I2C_MASTER);  
        i2cSetStop(i2cREG1);
        i2cSetStart(i2cREG1);
        i2cSend(i2cREG1, 1, &tx_data);
    	
    	/* Wait until Bus Busy is cleared */
        while(i2cIsBusBusy(i2cREG1) == true);
    
        /* Wait until Stop is detected */
        while(i2cIsStopDetected(i2cREG1) == 0);
    	
    	/* Clear the Stop condition */
        i2cClearSCD(i2cREG1);
    
        /** Read 2 bytes from bus voltage register **/
        i2cSetDirection(i2cREG1, I2C_RECEIVER);
        i2cSetCount(i2cREG1, 2);
        i2cSetMode(i2cREG1, I2C_MASTER);
        i2cSetStop(i2cREG1);
        i2cSetStart(i2cREG1);
        i2cReceive(i2cREG1, 2, rx_data);
    
        uint16 raw = ((uint16)rx_data[0] << 8) | rx_data[1];
    
        // Convert to actual voltage
        float voltage = (raw >> 3) * 0.004;  // 4 mV per bit
    
        printf("%d", voltage);
    }

    --
    此致、
    Jagadish。

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

    感谢您的帮助。 我当时意识到、我没有给程序足够的延迟(从发送总线电压寄存器到读取传入数据)、所以代码可以正常运行。 我尝试做它与你提供的 while 循环,但我会不断地被卡住,没有进展在所有. 使用__delay_cycles (n) 函数、但我能够使其正常工作。 我使用了 n = 70000、因此延迟为 7ms、但任何类似的延迟都应该起作用。