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.

[参考译文] SK-AM62B-P1:从 MCU 上 TCA6424ARGJR 的输入端口寄存器读取数据时出现问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1378977/sk-am62b-p1-issue-while-reading-data-from-input-port-register-of-tca6424argjr-on-mcu

器件型号:SK-AM62B-P1
主题中讨论的其他器件:SysConfigTCA6424A、TCA6424

工具与软件:

尊敬的团队:

e2e.ti.com/.../5466.empty.c

这是我正在使用的源代码。 我参考了 MCU SDK /ti/mcu_plus_sdk_am62x_09_02_01_06/examples/drivers/i2c/i2c_temperature 中的 ti/mcu_plus_sdk_am62x_09_02_01_06/examples/drivers/i2c/i2c_temperature 源代码。

我可以编译、生成和闪存 M4F_nortos 的二进制文件、但设置寄存器地址失败。 请检查 MCU UART 终端输出

empty.c 中所述的寄存器地址是否正确、如果您不能告诉我要在源代码中进行的更改。 此外、我可以为 R5_RTOS 和 M4F_nortos 生成二进制文件、但在尝试为 A53_freertos 生成二进制文件时出现错误

针对 M4F 和 R5进行编译

我使用的是从 EEPROM"/ti/mcu_plus_sdk_am62x_09_02_01_06/examples/drivers/i2c/i2c_read/am62x-sk "读取的默认 i2c 中给出的相同 SysConfig 文件。 请说明需要提供哪些进一步信息才能调查此问题。

谢谢。此致、
Sahithi

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

    尊敬的 Sahithi:

    感谢您的提问。

    我已获取您的意见并进行处理。 请等待一段时间再回来。

    此致、

    Tushar

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

    您好 Sahithi、

    感谢您的耐心。

    尝试为 A53_freertos
    生成二进制文件时出现错误

    您是否在中添加了 I2C 实例 example.syscfg A53 FreeRTOS 示例的 CCS 文件? 我可以看到错误日志显示该内容 gI2cHandle 未定义。

    [报价 userid="610006" url="~/support/processors-group/processors/f/processors-forum/1378977/sk-am62b-p1-issue-while-reading-data-from-input-port-register-of-tca6424argjr-on-mcu 我可以编译、生成并刷写 M4F_nortos 的二进制文件、但未能设置寄存器地址。 请检查 MCU UART 终端输出[/报价]

    您能告诉您在使用哪个 I2C 实例吗? 是主域 I2C 还是 MCU 域 I2C? TCA6424ARGJR IO 扩展器连接到主域 I2C1实例、仅由该实例控制。

    请参阅下面的屏幕截图。

    还可以指定要使用的端口和模式 输入/输出 高/低 状态?

    有关更多详细信息、请参阅  faq-processor-sdk-am64x-how-to-program-tca6424a-using-soc_i2c1 

    此致、

    Tushar

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

    尊敬的 Tushar:

    感谢您的答复。 我刚注意到、M4F 上的 I2C 引脚并没有物理连接到 IO 扩展器的 I2C 引脚。 我将尝试执行一些 i2c 事务、方法是通过 MCU 接头引脚将 M4F 的 i2c 线路从外部连接到我们的定制电路板(其中 i2c 线路物理连接到 TCA6424A)。 您可以考虑提供参考代码来从 MCU 到 TCA6424A 执行读取/写入操作吗?

    此致、

    Sahithi

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

    尊敬的 Sahithi:

    感谢您的答复。

    您想提供一个参考代码以从 MCU 执行到 TCA6424A 的读/写操作吗?

    我认为上面的共享常见问题解答链接中已经提供了读取/写入 TCA6424A 的方法。 您能否尝试常见问题解答中建议的步骤、并在遇到任何困难时告诉我们。

    此致、

    Tushar

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

    尊敬的 Tushar:

    您是否在中添加了 I2C 实例 example.syscfg A53 FreeRTOS 示例的 CCS 文件? 我可以看到错误日志显示该内容 gI2cHandle 未定义。

    该问题已解决。

    您能告诉我们您使用的是哪个 I2C 实例吗? 是主域 I2C 还是 MCU 域 I2C? TCA6424ARGJR IO 扩展器连接到主域 I2C1实例、仅由该实例控制。[/QUOT]

    嗯、明白。 我使用的是主域 I2C1。

    再次感谢您的答复。

    现在、我将 MCU 上的 I2C 线路连接到外部 IO 扩展器。 请找到以下原理图的屏幕截图。

    我们可以使用 M4F_freortos 和 M4F_nortos 的代码吗?

    我可以针对上述常见问题解答中的源代码使用/ti/mcu_plus_sdk_am62x_09_02_01_06/examples/drivers/i2c/i2c_read/am62x-sk 中使用的相同 SysConfig 文件吗?

    我正在尝试从从器件地址为0x22的外部 IO 扩展器写入配置寄存器、如常见问题解答链接中所述。 我使用的是前面提到的 I2C_READ 文件夹中的同一 SysConfig 文件。 请查找 IO 扩展器的原理图。 以下 IO 扩展器的数据表与 EVM 上的数据表相同。

    我还能为 m4f_nortos 使用以下源代码吗? 此外、这些代码在 M4F 上编译。 我现在想控制 MCU 接头上的 I2C0。

    e2e.ti.com/.../8875.empty.c

    请在 UART 终端上找到 MCU 输出。

    我已确保 I2C 线路连接正确。 是否正确进行了 I2C 写入。 我使用了错误处理程序函数。 我仍然面临 NACK 问题。 您能否告知我代码或配置中是否有任何更改或任何错误?

    此致、

    Sahithi

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

    您好 Sahithi、

    、用于确认 I2C 写入是否正确。 我使用了错误处理程序函数。 我仍然面临 NACK 问题。 您能否告诉我代码或配置中是否有任何更改或任何错误?

    我已经尝试在我的终端运行上述共享代码、它对我来说非常有效。 我没有遇到任何 NACK 问题。 因此该代码应该也适用于您的情况。

    我使用了 I2C1实例而不是 I2C0、因为在 TI 的 EVM 中、I2C1线路连接到 TCA6424A。  

    请在定制电路板上正确检查硬件连接。

    请观看以下视频以供参考。

    e2e.ti.com/.../i2c_5F00_example_5F00_m4f.mp4

    此致、

    Tushar

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

    尊敬的 Tushar:

    感谢您的答复。

    当连接到定制电路板上的 IO 扩展器接头(该接头也连接到 I2c0总线)时、在 I2C0总线上检测到从器件地址、我能够执行写入操作并将引脚16配置为输出。 为了测试我是否尝试通过从 M4F 与 I2C 器件(IO 扩展器)进行通信来连接和控制引脚16上的外部 LED。 我应该在 SysConfig 中进行任何更改吗? 您是否可以提供其源代码、以便我可以参考并检查所有 I/O 上的 GPIO 配置?

    谢谢、此致、

    Sahithi

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

    您好 Sahithi、

    为了测试我是否正在尝试通过 M4F 与 I2C 设备通信(io ex-pander)来连接和控制引脚16上的外部 LED

    这是否意味着 I2C0可以为您工作、但无法与 TCA6424A 连接?

    检查所有 I/O 上的 GPIO 配置?

    请参阅器件数据表、以检查 GPIO 配置/引脚属性。 请参阅 AM62x 数据表。  

    我是否应该在 SysConfig 中进行任何更改?

    您能尝试一下中的以下更改吗 example.syscfg 使用状态进行归档和更新。

    /**
     * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
     * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
     * @cliArgs --device "AM62x" --package "ALW" --part "Default" --context "m4fss0-0" --product "MCU_PLUS_SDK_AM62x@09.02.01"
     * @versions {"tool":"1.20.0+3587"}
     */
    
    /**
     * Import the modules used in this configuration.
     */
    const i2c             = scripting.addModule("/drivers/i2c/i2c", {}, false);
    const i2c1            = i2c.addInstance();
    const addr_translate  = scripting.addModule("/kernel/dpl/addr_translate", {}, false);
    const addr_translate1 = addr_translate.addInstance();
    const addr_translate2 = addr_translate.addInstance();
    const addr_translate3 = addr_translate.addInstance();
    const addr_translate4 = addr_translate.addInstance();
    const clock           = scripting.addModule("/kernel/dpl/clock");
    const debug_log       = scripting.addModule("/kernel/dpl/debug_log");
    const mpu_armv7       = scripting.addModule("/kernel/dpl/mpu_armv7", {}, false);
    const mpu_armv71      = mpu_armv7.addInstance();
    const mpu_armv72      = mpu_armv7.addInstance();
    
    /**
     * Write custom configuration values to the imported modules.
     */
    i2c1.$name                   = "CONFIG_I2C0";
    i2c1.useMcuDomainPeripherals = false;
    i2c1.enableIntr              = false;
    i2c1.I2C.$assign             = "I2C0";
    
    addr_translate1.$name     = "CONFIG_ADDR_TRANSLATE_REGION0";
    addr_translate1.localAddr = 0x80000000;
    
    addr_translate2.$name      = "CONFIG_ADDR_TRANSLATE_REGION1";
    addr_translate2.systemAddr = 0x20000000;
    addr_translate2.localAddr  = 0xA0000000;
    
    addr_translate3.$name      = "CONFIG_ADDR_TRANSLATE_REGION2";
    addr_translate3.systemAddr = 0x40000000;
    addr_translate3.localAddr  = 0xC0000000;
    
    addr_translate4.$name      = "CONFIG_ADDR_TRANSLATE_REGION3";
    addr_translate4.systemAddr = 0x60000000;
    addr_translate4.localAddr  = 0x60000000;
    
    debug_log.enableUartLog = true;
    debug_log.uartLog.$name = "CONFIG_UART0";
    
    mpu_armv71.$name        = "CONFIG_MPU_REGION0";
    mpu_armv71.attributes   = "Device";
    mpu_armv71.allowExecute = false;
    
    mpu_armv72.$name = "CONFIG_MPU_REGION1";
    mpu_armv72.size  = 18;
    
    /**
     * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
     * version of the tool will not impact the pinmux you originally saw.  These lines can be completely deleted in order to
     * re-solve from scratch.
     */
    i2c1.I2C.SCL.$suggestSolution                   = "I2C0_SCL";
    i2c1.I2C.SDA.$suggestSolution                   = "I2C0_SDA";
    debug_log.uartLog.MCU_UART.$suggestSolution     = "MCU_USART0";
    debug_log.uartLog.MCU_UART.RXD.$suggestSolution = "MCU_UART0_RXD";
    debug_log.uartLog.MCU_UART.TXD.$suggestSolution = "MCU_UART0_TXD";
    

    此致、

    Tushar

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

    尊敬的 Tushar:

    使用 MCU 域外设时、我得到了以下代码的正确输出、因为我们将 MCU 接头的 I2C 引脚连接到了定制电路板上的外部 TCA6424A 的 I2C 引脚、并且两者都使用相同的 I2C 总线(I2C0)。 此外、当 AM62x-SK EVM 连接到定制电路板时、它会将 EVM 上的 I2C0线路物理连接到 MCU 引脚的 I2C 线路。 请找到代码、SysConfig 文件和输出。

    代码:

    e2e.ti.com/.../4666.empty.c

    SysConfig 文件:

    /**
     * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
     * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
     * @cliArgs --device "AM62x" --package "ALW" --part "Default" --context "m4fss0-0" --product "MCU_PLUS_SDK_AM62x@09.02.01"
     * @versions {"tool":"1.20.0+3587"}
     */
    
    /**
     * Import the modules used in this configuration.
     */
    const i2c             = scripting.addModule("/drivers/i2c/i2c", {}, false);
    const i2c1            = i2c.addInstance();
    const addr_translate  = scripting.addModule("/kernel/dpl/addr_translate", {}, false);
    const addr_translate1 = addr_translate.addInstance();
    const addr_translate2 = addr_translate.addInstance();
    const addr_translate3 = addr_translate.addInstance();
    const addr_translate4 = addr_translate.addInstance();
    const clock           = scripting.addModule("/kernel/dpl/clock");
    const debug_log       = scripting.addModule("/kernel/dpl/debug_log");
    const mpu_armv7       = scripting.addModule("/kernel/dpl/mpu_armv7", {}, false);
    const mpu_armv71      = mpu_armv7.addInstance();
    const mpu_armv72      = mpu_armv7.addInstance();
    
    /**
     * Write custom configuration values to the imported modules.
     */
    i2c1.$name = "CONFIG_I2C0";
    
    addr_translate1.$name     = "CONFIG_ADDR_TRANSLATE_REGION0";
    addr_translate1.localAddr = 0x80000000;
    
    addr_translate2.$name      = "CONFIG_ADDR_TRANSLATE_REGION1";
    addr_translate2.systemAddr = 0x20000000;
    addr_translate2.localAddr  = 0xA0000000;
    
    addr_translate3.$name      = "CONFIG_ADDR_TRANSLATE_REGION2";
    addr_translate3.systemAddr = 0x40000000;
    addr_translate3.localAddr  = 0xC0000000;
    
    addr_translate4.$name      = "CONFIG_ADDR_TRANSLATE_REGION3";
    addr_translate4.systemAddr = 0x60000000;
    addr_translate4.localAddr  = 0x60000000;
    
    debug_log.enableUartLog = true;
    debug_log.uartLog.$name = "CONFIG_UART0";
    
    mpu_armv71.$name        = "CONFIG_MPU_REGION0";
    mpu_armv71.attributes   = "Device";
    mpu_armv71.allowExecute = false;
    
    mpu_armv72.$name = "CONFIG_MPU_REGION1";
    mpu_armv72.size  = 18;
    
    /**
     * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
     * version of the tool will not impact the pinmux you originally saw.  These lines can be completely deleted in order to
     * re-solve from scratch.
     */
    i2c1.MCU_I2C.$suggestSolution                   = "MCU_I2C0";
    i2c1.MCU_I2C.SCL.$suggestSolution               = "MCU_I2C0_SCL";
    i2c1.MCU_I2C.SDA.$suggestSolution               = "MCU_I2C0_SDA";
    debug_log.uartLog.MCU_UART.$suggestSolution     = "MCU_USART0";
    debug_log.uartLog.MCU_UART.RXD.$suggestSolution = "MCU_UART0_RXD";
    debug_log.uartLog.MCU_UART.TXD.$suggestSolution = "MCU_UART0_TXD";

    输出电容损耗:

    现在、我要通过在 MCU 上运行代码来切换 TCA6424A 上的 LED。 提供了一个源代码、通过向 SysConfig 添加 GPIO 实例并选择要设置为 LED 输出的所需 MCU 引脚来切换连接到 MCU 引脚的 LED。

    #include <drivers/gpio.h>
    #include <kernel/dpl/AddrTranslateP.h>
    #include <kernel/dpl/DebugP.h>
    #include <kernel/dpl/ClockP.h>
    #include "ti_drivers_config.h"
    #include "ti_drivers_open_close.h"
    #include "ti_board_open_close.h"
    
    void gpio_led_blink_main(void *args)
    {
        uint32_t    loopcnt = 5, delaySec = 1;
        uint32_t    gpioBaseAddr, pinNum;
    
        DebugP_log("GPIO LED Blink Test Started ...\r\n");
        DebugP_log("LED will Blink for %d seconds ...\r\n", (loopcnt * delaySec * 2));
    
        /* Get address after translation translate */
        gpioBaseAddr = (uint32_t) AddrTranslateP_getLocalAddr(GPIO_LED_BASE_ADDR);
        pinNum       = GPIO_LED_PIN;
        DebugP_log("pinNum:%d\r\n",pinNum);
        GPIO_setDirMode(gpioBaseAddr, pinNum, GPIO_LED_DIR);
        while(loopcnt > 0)
        {
            GPIO_pinWriteHigh(gpioBaseAddr, pinNum);
            ClockP_sleep(delaySec);
            GPIO_pinWriteLow(gpioBaseAddr, pinNum);
            ClockP_sleep(delaySec);
    
            loopcnt--;
        }
    
        DebugP_log("GPIO LED Blink Test Passed!!\r\n");
        DebugP_log("All tests have passed!!\r\n");
    
    }

    我是否可以使用相同的驱动器来控制 TCA6424A 上的 GPIO? 如果需要、基地址是什么?我们可以在 SysConfig 或 GPIO 处理中配置这些引脚吗、全都与寄存器处理相关? 您想提供源代码来将 GPIO 引脚写入所需引脚的高电平或低电平吗? 如果无法做到、请提供 TCA6424A 数据表中的此页供参考。 在 TCA6424A 数据表中、该产品说明书也没有详细介绍 GPIO 处理。

    请尝试更改中的以下内容 example.syscfg 以状态归档和更新。[/QUOT]

    我们的目标是在使用 M4F 内核时通过 MCU 控制 I2C 总线。 因此、我们应该仅使用 MCU 域外设。

    谢谢 Reagards、

    Sahithi

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

    您好 Sahithi、

    感谢您的答复。

    我对上述评论有一些疑问。 您能详细说明一下用例吗?

    我们已将 MCU 接头的 I2C 引脚连接到外部 TCA6424A

    从上面的注释中、我了解到您正在将 MCU 域 I2C 连接到 TCA6424A 器件。

    并且您能够使用 I2C 成功与 TCA6424建立通信。 请在此处更正我的错误。

    现在我想通过在 MCU 上运行代码来切换 TCA6424A 上的 LED。 通过向 SysConfig 添加 GPIO 实例并选择要设置为 LED 输出的所需 MCU 引脚、有一个源代码可用于切换连接到 MCU 引脚的 LED。[/QUOT]

    现在、您要使用 I2C 写入 TCA6424的寄存器以控制外部 LED。 我的理解是否正确?

    此致、

    Tushar

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

    尊敬的 Tushar:


    是的、您的两项陈述都正确。

    [报价 userid="16414" url="~/support/processors-group/processors/f/processors-forum/1378977/sk-am62b-p1-issue-while-reading-data-from-input-port-register-of-tca6424argjr-on-mcu/5281822 #5281822"]现在、您要使用 I2C 写入 TCA6424的寄存器来控制外部 LED。 我的理解是否正确?

    这是我要做的事情。

    谢谢。此致、

    Sahithi

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

    尊敬的 Sahithi:

    感谢以上确认。

    您想提供一个源代码来将 GPIO 引脚写入所需引脚的高电平还是低电平吗?

    您可以尝试 此处建议的步骤吗?  

    您能否说明连接到外部 LED 的端口号? 另外、您能否说明要写入高电平还是低电平的端口?

    此致、

    Tushar