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.

[参考译文] TMDS64EVM:处于中断模式的 LLD MCU 域 MCSPI 外设不会产生时钟信号

Guru**** 2478765 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1458569/tmds64evm-lld-mcu-domain-mcspi-peripheral-in-interrupt-mode-does-not-produce-clock-signal

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

工具与软件:

您好!

我正在尝试使"MCU_SPI0"-MCSPI-peripheral 实例与我的09.02.00工业通信 SDK 提供的 LLD 驱动程序 API 配合使用。 作为正确获取中断值的参考、我使用了包含的"mcspi_loopback_interrupt_LLD"示例。

编辑:已通过更改使用的中断回调机制来解决下面的问题。 虽然我的答复仍有一个跟进问题。

我遇到的第一个问题是中断永远不会结束。 调用"MCSPI_LLD_readWriteIntr"函数后、已触发中断、已输入入口点"ISR_MCU_MCSPI0"、并通过"ISR_call_level_NONFLOAT_reentrant"宏调用"MCSPI_LLD_controllerIsr"、代码已卡在那里、处理从未清除的中断。

我发现问题是在驱动程序包装程序初始化期间注册中断 ID "208"(因为我在 MCU_SPI0引脚上连接了 SPI 外设设备)、但将中断编号"204"作为参数传递给"ISR_call_level_NONFLOAT_reentrant"。 我认为这导致了这个问题、并且在'MCSPILLD_InitObject'初始化和 ISR-macro 自变量中将中断 ID 更正为208。

现在、在以下片段中调用宏之后、R5内核在"Hwip_data_abort_handler_c ()"中挂起:

AM64x_MCSPI.hpp

class AM64x_MCSPI : public drivers::SPI {
...
  [[gnu::section(".text.hwi"), gnu::noinline, gnu::naked, gnu::target("arm"),
    gnu::aligned(4)]] static void
  ISR_MCU_MCSPI0();
...
};

AM64x_MCSPI.cpp:

std::uintptr_t R5FSS01_VIC_section_base_address = 0x2FFF0000;
volatile MCSPILLD_Handle MCSPI_handle_MCSPI0 = nullptr;

...

void drivers::AM64x_MCSPI::ISR_MCU_MCSPI0() {
  ISR_CALL_LEVEL_NONFLOAT_REENTRANT(
      MCSPI_lld_controllerIsr, 
      MCSPI_handle_MCU_MCSPI0,
      208u,
      (R5FSS01_VIC_section_base_address + 0x404U + (((208) >> 5) & 0xFU) * 0x20U),
      0x1U << ((208u) & 0x1FU),
      R5FSS01_VIC_section_base_address);
}

在类结构上、把手从 nullptr 正确地更改为有效的 MCSPILLD_Handle。 我注意到 register-clear-mask 是5位。 是否应该将不同的寄存器/掩码组合与 MCU MCSPI 实例结合使用? 我当时想、掩码(0x1FU)的5位可能仅用于5个主域 MCSPI 实例、并且需要不同的参数来正确处理 MCU 实例?

作为解决方法、我可以将通信模式更改为轮询、在完成的传输之间生成 FreeRTOS。 但我想让中断模式工作、以尽可能缩短 SPI 传输的处理时间。

谢谢!

Matthijs

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

    更新:我通过使用 Hwip_Object 和相关函数解决了这个特定问题。 创建如下:

        HwiP_Params parameters{
            .intNum = init_handle.intrNum, // 208 for MCU_MCSPI0
            .callback = &MCSPI_lld_controllerIsr,
            .args = &instance_handle, // MCSPILLD_Object*
            .eventId = 0,
            .priority = init_handle.intrPriority, // 4
            .isFIQ = 0,
            .isPulse = 0,
        };
        result = HwiP_construct(&interrupt_handle, &parameters);

    此中断和回调会触发。 但是、传输状态的进度不超过"MSPI_TRANSFER_STARTUP"状态。 并最终被抵消。

    我还在 MISO、MOSI、CS 和 CLK 引脚上连接了一个逻辑分析仪。 输出如下:

    红色波形所示为"Chip Select"(芯片选择)、其活动时间为几毫秒。 这与 SPI 传输之间由 GPIO 驱动程序控制的第5个数据/命令引脚非常接近。 因此、我认为至少 CS 机制是有效的。 不过、时钟处于非活动状态。 我在 LLD_MCSPI 配置结构中看到的时钟设置不能超过频率/比特率。 是否缺少设置? 或者我应该在 SysConfig 中更改什么内容?

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

    更新:通过重写驱动程序以使用 HLD 接口修复此问题。 省略安装代码以挂钩到 SysConfig 生成的内容中。 现在它可以工作,但我不知道为什么;使用的设置应该是相同的