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.

[参考译文] RTOS/TM4C123GH6PM:INA219 Tiva C EK-TM4C123GXL 的 I2C 通信问题

Guru**** 2540720 points
Other Parts Discussed in Thread: INA219, EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/761190/rtos-tm4c123gh6pm-ina219-i2c-communication-problem-with-tiva-c-ek-tm4c123gxl

器件型号:TM4C123GH6PM
主题中讨论的其他器件:INA219EK-TM4C123GXL

工具/软件:TI-RTOS

大家好、

我将使用 INA219进行电流测量。

尝试使用 I2C 与微控制器进行通信。 但不幸的是、传输失败。

我将 TI-RTOS 2.16.00.08、CCSv8.1.0用于我的项目。

请找到所附的项目文件夹、并更正我出错的位置。

提前感谢、

Yashwanth Kumar Gandeti、e2e.ti.com/.../ina219-Datasheet.pdfe2e.ti.com/.../ina219.zip

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

    您必须向我们提供更多信息、而不仅仅是说"转让失败"并发布您的项目。 我们不会对整个项目进行深入的代码审查。

    请提供一些有关已有和未有工作的内容的更多详细信息、只需发布相关代码、如 I2C 初始化以及正在发送的命令。

    此外、对于 I2C、确保在 SDA 和 SCL 线路上安装了上拉电阻器、并请告知上拉电阻器的值。

    如果您有示波器、我建议仔细检查 I2C 线路、以查看它们上发生的通信。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph Jacobi、

    对于 I2C 通信、我 使用了 I2C1Channel。 初始化 如下:

    SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);
    
    /*将相应的引脚配置为 I2C 而不是 GPIO。 *
    GPIOPinConfigure (GPIO_PA6_I2C1SCL);
    GPIOPinConfigure (GPIO_PA7_I2C1SDA);
    GPIOPinTypeI2CSCL (GPIO_Porta_base、GPIO_PIN_6);
    GPIOPinTypeI2C (GPIO_Porta_base、GPIO_PIN_7); 

    我已将 void currentTask()配置为任务。 当我尝试使用 writeRegister()执行 I2cwrite 时,执行此任务

    void writeRegister (I2C_Handle handle、uint16_t regAddr、uint16_t value)
    {
    uint8_t txBuffer[4];
    I2C_Transaction i2c 交易;
    
    i2cTransaction.slaveAddress = CURR_I2C_ADDR;
    
    //写入16位状态寄存器
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 3;
    i2cTransaction.ReadCount = 0;
    
    txBuffer[0]= regAddr & 0xFF;// 8位地址
    txBuffer[1]=值>> 8;// HB 地址
    txBuffer[2]=值和0xFF;// lb Addr
    
    if (!I2C_transfer (handle、&i2cTransaction)){
    GPIO_WRITE (Board_LED2、Board_LED_ON);
    system_abort (" I2C 传输错误!");
    }
    } 

    用于将校准 值写入地址 0x05的寄存器

    writeRegister (i2c、0x05、8192); 

    函数中的函数  

    I2C_transfer (handle、&i2cTransaction) 

    (调试时...)

    控制 未执行下一行代码。 我尝试暂停调试时的状态。 控制位于 Load.c 中的 Load_IdleFxn ()中、在 Idle.c 中的 Idle环路()中有几次

    我没有为 SCL 和 SDA 线路使用任何外部上拉电阻器。(我正在使用 Tiva C EK-TM4C123GXL launchpad。 我是否需要添加外部上拉电阻器?)  

    我的读取函数如下(由于 我不能从写入寄存器的 I2C_transfer ()中输出、因此尚未执行此函数):

    空 readRegister (I2C_Handle handle、
    uint16_t regAddr、
    uint16_t *数据、
    size_t length)
    {
    uint8_t txBuffer[2];
    I2C_Transaction i2c 交易;
    
    i2cTransaction.slaveAddress = CURR_I2C_ADDR;
    
    /*写入16位状态寄存器*/
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.readBuf =数据;
    i2cTransaction.writeCount = 1;
    i2cTransaction.ReadCount =长度;
    
    txBuffer[0]= regAddr & 0xFF;//LB Addr
    
    if (!I2C_transfer (handle、&i2cTransaction)){
    GPIO_WRITE (Board_LED2、Board_LED_ON);
    system_abort (" I2C 传输错误!");
    }
    }
    

    请帮我解决问题。

    我没有示波器来查看它们上发生了什么通信。

    此致、

    Yashwanth。

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

    EK-TM4C123GXL LaunchPad 不附带用于 I2C 的上拉电阻器。 如果您用于连接 INA219传感器的电路板也没有上拉电阻、则需要安装它们。 请检查、因为如果没有上拉电阻器、I2C 通信是不可能的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ralphi Jacobi、

    刚才我知道 SCL 和 SDA 线路上安装了10k 上拉电阻器。 我将使用 Adafruit 的 INA219分线板。

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

    很抱歉、但我真的不理解这个问题。

    如果暂停正在运行的系统、通常会将 PC 置于 Load_IdleFxn 中、因为这是在空闲任务中调用的(在没有发生任何其他情况时运行)。

    请使用 Tools->ROV 帮助确定系统的状态。

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

    很抱歉,我没有在 Load_IdleFxn 中使用该 PC,因为它是在空闲任务中调用的。
    是的。 你说的是真的。 当前任务处于被阻止状态、空闲任务始终处于运行状态。

    我的查询是在执行后逐步调试的情况
    I2C_transfer (handle、&i2cTransaction)
    在 writeregister()中,PC 不会进入下一行代码。 我认为交易时出现了问题。 但无法准确确定问题所在。

    根据数据表、INA219是16位寄存器类型、我将尝试以上述方式进行写入。

    您能不能帮助和纠正我是向 INA219写入的正确方法。

    此致、
    Yashwanth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    单步调试在优化时会有点困难。 您可以尝试编辑编译器优化。 但这不会解决驱动程序库代码。 为此、您可以在不进行优化的情况下重建库、或者进行短期实验、将产品中的 I2C.c 和 I2CTiva.c 文件添加到您的项目中(然后重新构建)。 您的项目将挑选本地函数(这些函数是使用简化的优化编译的)。

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

    您好 Todd、

    正如您所说、我添加了 I2C.c 和 I2CTiva.c 文件。

    在分步调试模式下进行调试时。 执行之后

    /*
    *在此处等待传输完成。
    *可以从这里阻止、因为 I2C 的 Hwi 将解除阻止
    *出错时
    *
    Semaphore_pend (Semaphore_handle (&(object->transferComplete)))、
    BIOS_wait_forever); 

    在 I2CTiva.c 文件中的 bool I2CTiva_transfer (I2C_Handle handle、I2C_Transaction * transaction)函数中

    PC 没有从这一行输出。

    这意味着 我在写入从器件地址、寄存器地址和值时出错了吗?

    此致、

    Yashwanth Kumar Gandeti。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我会避免单步执行这个。 只需在 I2C_transfer 之后和 I2C ISR (I2CTiva_hwiFxn)处放置一个断点。 ISR 是否运行过? 如果不是、这似乎是您遇到配置或硬件问题。 这里会有一个示波器来方便地确定 I2C 上是否有任何变化。

    如果 ISR 正在运行、数据是否有意义(内容和数量)。

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

    按照您的建议、在 I2C_transfer 之后和 I2C ISR (I2CTiva_hwiFxn)处保留断点。
    ISR 从未运行过、也没有在 I2C_transfer 断点之后停止。

    配置 I2C 通道时遇到的配置问题?
    我认为硬件可以、因为我能够使用相同的 I2C 引脚通过 I2C 通信对另一个传感器(MPU - 6050)进行测试。

    此致、
    Yashwanth。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、所以任务在信号量上被阻止(因此 I2C_transfer 后的断点不会被命中)。 ISR 未运行(本来称为 Semphore_post)。

    配置可以是"Board".c 文件中的设置(例如 EK_TM4C123GXL.c)或 I2C 地址。 如果同一个 I2C 正在使用不同的外设、听起来就可以了。 您是否具有正确的 I2C 地址并使用有效的比特率? 这听起来好像您真的需要一个示波器来查看导线的情况。

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

    I2C 地址有效(我使用0x40作为从地址。)
    位速率为100KHz。

    我将尝试获取示波器并点击导线以了解发生了什么。
    我很快会回来的。

    非常感谢您在调试我的问题时持续提供的支持。

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

    现在、PC 在 I2C_transfer 行之后到达断点。
    因为 I2C_transfer ()返回 false。 系统正在按照上述代码中止。
    我认为我的注册地址和转让前的价值等结构是错误的。
    你能在这方面提供帮助吗?

    此致、
    Yashwanth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否获得了查看线路上发生了什么情况的范围?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    是的、我使用示波器抽头了这些线。 寄存器地址不正确。 我将发送示波器的屏幕截图。

    我正在尝试更正寄存器地址结构。

    此致、

    Yashwanth

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

    使用5V 电源的 INA219和 EK-TM4C123GXL 使用3.3V 是否会成为问题? 我是否应该使用任何电平转换器将 INA219的5V 转换为3.3V?

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

    虽然 EK-TM4C123GXL 上的引脚可耐受5V 电压、但功能模拟规格只能耐受 VDD -即3.3V 电压。 您确实需要在 INA219信号和 EK-TM4C123GXL 之间使用电平转换器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、

    很抱歉、由于我不工作、所以需要很长时间才能回复。

    当我创建一个单独的项目时、我发现 INA219正在响应我的写入和读取操作。 当我尝试在任务上下文中包括项目配置时,它不起作用。 它的运行方式与旧版本类似(不是从 I2C_Transfer ()中输出)。
    您认为问题可能出在哪? 如果您同意查看,我可以附加这两个代码。

    此致、
    Yashwanth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请附上两个项目。 确保指明哪个正在工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    请查找所示的附加项目:

    Working_Project -工作。

    NotWorking_Project -不工作。

    此致、

    Yashwanth

    编辑:由于项目的隐私问题而删除的项目

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

    非常感谢您在查找我的问题时给予的持续指导。
    最后、我发现了这个问题、即引脚配置问题、在将 I2C 引脚配置为 I2C 后、我将 I2C 引脚设置为 GPIO。 很抱歉我的错误、我困扰了你。 但在这个调试过程中、我知道所有问题都可能是什么。 这对我来说是一次很好的学习。
    希望您的支持能在将来为我提供指导、如果我在某些地方停留(希望不要停留)。
    感谢所有在此过程中提供支持的人员、最后感谢 TI 和 TI 论坛为我们提供了一个讨论问题并解决问题的绝佳平台。
    Hatsoff TI!!!

    谢谢、此致、
    Yashwanth Kumar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到您发现问题!