主题中讨论的其他器件: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
