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.

[参考译文] AM625:UART 在仅 MCU 模式下不传输

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1666257/am625-uart-not-transmitting-during-mcu-only-mode

器件型号: AM625

尊敬的支持部门:

我正在 M4 内核上开发一个应用、要求我在仅 MCU 模式下使用 UART。 我注意到在仅 MCU 期间、MCU_UART0 不在传输。 我使用 FTDI 捕获我的 UART 数据。

我注意到、当 CPU 和 M4 都被唤醒时可以接收字符。 当我使用以下命令将 CPU 置于仅 MCU 模式时、不再打印字符。 但当 CPU 从仅 MCU 模式唤醒时、字符会恢复打印。 我还使用循环计数器来检查 M4 是否继续运行、并在睡眠期间递增。

Echo 100 >/sys/devices/system/cpu/cpu0/power/pm_qos_resume_latency_us
Echo mem >/sys/power/state

设备树设置是否不正确? 或者 MCU UART 外设配置是否正确?

此致、

Job Meulenbeld


在单独任务中测试代码:

static void uart_print_char(char c)
{
    UART_Transaction transaction;

    UART_Transaction_init(&transaction);
    transaction.buf   = &c;
    transaction.count = 1U;

    UART_write(gUartHandle[CONFIG_UART0], &transaction);
}

static void Test_Task(void *args){
    while (1)
    {
        GPIO_pinWriteLow(baseAddr, CONFIG_GPIO0_PIN);
        uart_print_char('X');
        vTaskDelay(pdMS_TO_TICKS(1000));

        GPIO_pinWriteHigh(baseAddr, CONFIG_GPIO0_PIN);
        uart_print_char('Y');
        vTaskDelay(pdMS_TO_TICKS(1000));

        gToggleCount++;
    }
}

image.png

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

    尊敬的 Job:

    您是在 TI EVM 或定制硬件上测试它吗? 如果您使用的是自定义硬件、那么 TI EVM 上也会出现该问题吗?

    您是否也可以共享您的器件树源?

    此致、

    Anshu

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

    嗨、Anshu

    我正在开发定制硬件 (Toradex Verdin AM62)、遗憾的是、没有 TI EVM 来验证行为。 我的设备树文件中与 M4 和 MCU_UART0 相关的部分如下所示。 您是否可能有任何已知可在仅 MCU 模式下工作的参考或 MCU+ SDK 示例、以便我可以将其与我们的实现进行比较?

    此致、

    作业

    // more /proc/device-tree/bus\@f0000/bus\@4000000/serial\@4a00000/status
    &mcu_uart0 {
    	status = "disabled";
    };
    
    &mcu_m4fss {
    	compatible = "ti,am64-m4fss";
    	mboxes = <&mailbox0_cluster0 &mbox_m4_0>;
    	mbox-names = "tx", "rx";
    	memory-region = <&mcu_m4fss_dma_memory_region>,
    			<&mcu_m4fss_memory_region>;
    	firmware-name = "am62-mcu-m4f0_0-fw";
    	wakeup-source;
    	status = "okay";
    };

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

    尊敬的 Anshu:

    经过进一步挖掘后、我发现多个线程报告了与我面临的问题完全相同的问题:
    Thread1

    Thread2

    它们都指示相同的行为:使用 MCU_UART0 进行打印在正常操作期间工作、当进入仅 MCU 模式时、打印停止。

    我目前使用的是以下版本:MCU+ SDK 版本 11.01.00.16。

    很遗憾、我没有看到对这些线程的响应来解决此问题。 您可能对这种情况有更多的了解吗?

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

    您好作业、

    看起来没有关于这些主题的后续讨论。  

    除了 MCU+ SDK 中包含的内容之外、我们没有任何其他参考示例。  

    让我联系开发团队、然后返回给您。 我最初认为 UART 缓冲区可能执行了一些意外操作。

    此致、

    Anshu

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

    您好 Anshu、

    我不认为这只是 UART。 我也使用切换 GPIO 对其进行了测试、即使 M4 持续运行、也可以停止切换。 我的想法更倾向于通过 R5(器件管理器)执行的 IO 隔离。 当 IO 应具有可预测状态时、这种 IO 隔离对于深度睡眠而言是有意义的。 M4 可能也会发生这种情况、也许它还会在仅 MCU 模式期间执行这种隔离(意外)、这就是为什么我看到每当 CPU 进入仅 MCU 模式时 GPIO 引脚被拉至高电平状态的原因。

    我目前正在深入研究 R5 固件、以尝试并了解这种 IO 隔离行为发生的时间、也许我可以找到(并暂时禁用)它来看看这是否是问题所在。

    我对开发团队的想法很好奇!

    此致、

    作业

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

    您好 Anshu、

    我发现了这个问题! 我的代码不包含 MCU I/O 所需的旁路。  我的工程基于示例 ipc_rpmsg_echo_linux、该示例实现了 rpmessage、也是具有 UART 唤醒功能的仅 MCU 模式。 但是、此示例不包括 I/O 引脚的旁路。 示例 lpm_MCU_UART_wakeup 包含这一点。 必须使用要从 I/O 隔离中排除的引脚(对于 ME UART 和 GPIO 引脚)来初始化以下结构:

    /* MCU I/Os are isolated in lpm therefore we need to bypass the pins we need */
    static Pinmux_PerCfg_t gPinMuxIsolationBypassCfg[] =
    {
        /* MCU_SPI0_CS1 -> MCU_GPIO0_1 */
        {
            PIN_MCU_SPI0_CS1,
            PIN_MODE(7) |
            PIN_PULL_DISABLE |
            PIN_ISOLATION_BYPASS
        },
    
        /* MCU_UART0 RX */
        {
            PIN_MCU_UART0_RXD,
            PIN_MODE(0) |
            PIN_PULL_DISABLE |
            PIN_INPUT_ENABLE |
            PIN_ISOLATION_BYPASS
        },
    
        /* MCU_UART0 TX */
        {
            PIN_MCU_UART0_TXD,
            PIN_MODE(0) |
            PIN_PULL_DISABLE |
            PIN_ISOLATION_BYPASS
        },
    
        { PINMUX_END, 0U }
    };


    然后、在进入仅 MCU 模式之前、您会应用此引脚多路复用:

    /* Enable isolation bypass for the pinmux */
    Pinmux_config(gPinMuxIsolationBypassCfg, PINMUX_DOMAIN_ID_MCU);

    即使 LPM 有一个明确的示例、我也建议将其添加到 ipc_rpmsg 示例中、因为执行此旁路是必需的、可用信息有限。

    感谢您抽出宝贵的时间并耐心等待!

    此致、

    Job Meulenbeld

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

    感谢您分享解决方案工作。 我将关闭该主题。 请尽管创建新主题以供后续问题使用。

    此致、

    Anshu