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.

[参考译文] AM2632:AM2632 IIC

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491573/am2632-am2632-iic

器件型号:AM2632
主题中讨论的其他器件: SysConfig

工具与软件:

尊敬的 TI 支持团队:

AM2632与湿度/温度传感器(NSHT30-Q1DNR)之间的 I2C 通信会遇到问题。 如果您提供解决此问题的指导、我将不胜感激。

问题:

  • 写作品 、但是  读取失败 :发送从地址后( R/W=1 ),传感器 ACK ,但 SCL 保持不变  低电平 .

  • 我尝试了各种读取和写入操作、每个读取操作都具有相同的响应、因此我无法完全输出时钟

  • 我确信从器件工作正常

设置:

  • 传感器: 在7位地址上  0x44 .

  • I2C 速度:400kHz (标准模式)。

  • 上拉:SDA/SCL 上为4.7kΩ。

问题:
在读取期间、为什么在从器件 ACK 后 SCL 保持低电平? 这是主要配置问题还是传感器行为?

附件:

  • 逻辑分析仪捕获(SCL_stuck.png)。

感谢您的帮助!

此致、

ZX

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

    您好、ZX、  

    如果将比特率降至100kbps、是否能够读取?

    此致、

    Brennan

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

    嗨 Brennan:

    我尝试过100K、但它仍然显示相同的现象。 此从器件支持高达1M 的时钟速度

    此致

    ZX

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

    您好、ZX、

    SysConfig 和硬件配置看起来正确。 我将在该主题中添加一位软件专家、用于进一步调查。

    如果您能提供一些有关代码的详细信息、将会有所帮助。  

    此致、

    Brennan

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

    嗨  Brennan:

    以下是我的代码、我对 SDK 的例程示例进行了一些修改

    /*
     *  Copyright (C) 2024 Texas Instruments Incorporated
     *
     *  Redistribution and use in source and binary forms, with or without
     *  modification, are permitted provided that the following conditions
     *  are met:
     *
     *    Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     *    Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the
     *    distribution.
     *
     *    Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    #include <drivers/i2c.h>
    #include <kernel/dpl/DebugP.h>
    #include "ti_drivers_config.h"
    #include "ti_drivers_open_close.h"
    #include "ti_board_open_close.h"
    
    
    extern uint32_t Board_i2cGetEepromDeviceAddr(void);
    #define I2C_READ_LEN                    (6U)
    
    static void i2c_read_error_handler(uint16_t sample, int32_t status);
    
    void i2c_read_main(void *arg0)
    {
        uint16_t        sample;
        int32_t         status;
        uint32_t        i2cReadTargetAddr;
        uint8_t         rxBuffer[I2C_READ_LEN];
        uint8_t         txBuffer[2];
        I2C_Handle      i2cHandle;
        I2C_Transaction i2cTransaction;
    
        Drivers_open();
        Board_driversOpen();
    
        i2cReadTargetAddr     = 0x44;//Board_i2cGetEepromDeviceAddr();
        i2cHandle = gI2cHandle[CONFIG_I2C0];
    
        DebugP_log("[I2C] Read data ... !!!\r\n");
    
        /* Set default transaction parameters */
        I2C_Transaction_init(&i2cTransaction);
        i2cTransaction.writeBuf      = txBuffer;
        i2cTransaction.readBuf      = rxBuffer;
        i2cTransaction.writeCount    = 2;
        i2cTransaction.readCount    = 1;
        i2cTransaction.targetAddress = i2cReadTargetAddr;
        txBuffer[0] = 0x24;
        txBuffer[1] = 0x16;
    
        status = I2C_transfer(i2cHandle, &i2cTransaction);
    
        I2C_Transaction_init(&i2cTransaction);
        /* Override with required transaction parameters */
        i2cTransaction.readBuf      = rxBuffer;
        i2cTransaction.readCount    = I2C_READ_LEN;
        i2cTransaction.targetAddress = i2cReadTargetAddr;
    
        /* Read 20 samples and log them */
        // for(sample = 0; sample < 20; sample++)
        // {
            status = I2C_transfer(i2cHandle, &i2cTransaction);
            if(status == I2C_STS_SUCCESS)
            {
                DebugP_log("[I2C] Sample %u: %u\r\n", sample, rxBuffer[0]);
            }
            else
            {
                i2c_read_error_handler(sample, i2cTransaction.status);
            }
        // }
    
        DebugP_log("[I2C] Read data ... DONE !!!\r\n");
        if(status == SystemP_SUCCESS)
        {
            DebugP_log("All tests have passed!!\r\n");
        }
        else
        {
            DebugP_log("Some tests have failed!!\r\n");
        }
    
        Board_driversClose();
        Drivers_close();
    
        return;
    }
    
    static void i2c_read_error_handler(uint16_t sample, int32_t status)
    {
        switch(status)
        {
            case I2C_STS_ERR:
                DebugP_logError("[I2C] Sample %u: Generic error occurred", sample);
                break;
            case I2C_STS_ERR_TIMEOUT:
                DebugP_logError("[I2C] Sample %u: Timeout error occurred", sample);
                break;
            case I2C_STS_ERR_NO_ACK:
                DebugP_logError("[I2C] Sample %u: No acknowledgement received", sample);
                break;
            case I2C_STS_ERR_ARBITRATION_LOST:
                DebugP_logError("[I2C] Sample %u: Arbitration lost", sample);
                break;
            case I2C_STS_ERR_BUS_BUSY:
                DebugP_logError("[I2C] Sample %u: Bus Bus Busy error occurred", sample);
                break;
        }
    
        return;
    }

    期待您的回复

    ZX

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

    您好、ZX、

    从我的初始分析来看、我有几个要点:

    1.在你的代码中,我看到 I2C 写入操作后,你调用"I2C_Transaction_init ()"函数,并填充3个参数(目标地址, readBufa nd ReadCount )。 超时、控制器模式、状态和其他参数等其他参数采用如下所示的默认值

     在调用读取操作之前、请确保正确配置 I2C 事务结构

    2.我明白为什么 I2C_READ_LEN 会更改为"6"、但根据传感器的数据表、主器件应在接收到前5B 后发送 ACK、并在第6个字节后发送停止命令。 您能验证一下是否出现这种情况吗? 逻辑分析仪捕获结果 对我来说没有以高分辨率打开、因此我看不清。

    3.我觉得代码中没有问题,我认为我们在正确执行读取操作方面缺少了一些步骤。  

    此致、
    Shaunak

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

     Shaunak 您好:

    感谢您的答复。

    1. 我提到了多个例程,只配置了目标器地址, readBufa 和 ReadCount、我遵循他的指示,我也配置了超时,但我没有正确地读取数据。 其他参数使用默认参数更好

     当前的问题是在读取时、在发送从器件地址之后、时钟终止并变为低电平

    此致  

    ZX

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

    您好、ZX、

    我认为问题在于 I2C 地址。 请勿将自身从器件地址设置为与总线上的任何其他从器件相同、自身从器件地址的用途是为了控制器的从模式运行、 保持其默认值或至少与总线上的任何其他从器件不同、否则 IP 将锁定

    此致、
    Shaunak

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

     Shaunak 您好:

    我的 IIC 总线上只有一个从器件。

    我想知道这种现象是否由主机主动下拉、Ω 引起、以及原因

    谢谢

    ZX

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

    您好、ZX、

    即使 I2C 总线上只有一个从器件、am263x 的自身从器件地址也必须与连接的从器件地址不同。 仅当 AM263x 处于从模式时、才应使用 AM263x 从器件地址。

    [报价 userid="642495" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491573/am2632-am2632-iic/5739709 #5739709"]

    我想知道这种现象是否由主机主动下拉、Ω 引起、以及原因

    [报价]

    是的、确实如此、但在跳转之前、我只想一次性确认更改地址是否可以解决此问题。

    此致、
    Shaunak

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

     Shaunak 您好:

     抱歉、我误解了。  我错误地将"自有目标地址"配置为从器件地址。

     我已更正配置并将进行全面测试以验证功能。 完成后、我会立即与您分享测试结果。

    再次感谢您的耐心与支持

    ZX

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

     Shaunak 您好:

    我通过 更改地址修复了该问题。

    感谢您的帮助

    ZX