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.
工具与软件:
大家好!
我们的一个客户一直在向 DM 内核固件中添加该功能、同时保留固件构建器包含在此固件中的现有功能。
TRM 显示 MCU_MCAN 寄存器可"通过 RAT"访问 DM 内核、我们需要澄清需要如何设置 RAT 才能访问0x04E00000和0x04E10000处的 MCU_MCAN 寄存器。
针对0x04E00000大小128KB 的当前 syscfg RAT 设置
代码汇总
//Global struct defined #define CONFIG_ADDR_TRANSLATE_RAT_BASE_ADDR (0x02FFE0000u) #define CONFIG_ADDR_TRANSLATE_REGIONS (1u) AddrTranslateP_RegionConfig gAddrTranslateRegionConfig[CONFIG_ADDR_TRANSLATE_REGIONS] = { { .localAddr = 0x4E00000u, .systemAddr = 0x4E00000u, .size = AddrTranslateP_RegionSize_128K, }, }; //Executed Code AddrTranslateP_Params addrTranslateParams; AddrTranslateP_Params_init(&addrTranslateParams); addrTranslateParams.numRegions = CONFIG_ADDR_TRANSLATE_REGIONS; addrTranslateParams.ratBaseAddr = CONFIG_ADDR_TRANSLATE_RAT_BASE_ADDR; addrTranslateParams.regionConfig = &gAddrTranslateRegionConfig[0]; AddrTranslateP_init(&addrTranslateParams); uint32_t mcu_can0_base_addr = (uint32_t)AddrTranslateP_getLocalAddr( (uint64_t)CSL_MCU_MCAN0_MSGMEM_RAM_BASE); uint32_t mcu_can1_base_addr = (uint32_t)AddrTranslateP_getLocalAddr( (uint64_t)CSL_MCU_MCAN1_MSGMEM_RAM_BASE); MCAN_isMemInitDone(mcu_can0_base_addr); <----DM core hangs here, in this MCAN driver API call, which reads a register based on above base addr MCAN_isMemInitDone(mcu_can1_base_addr);
但是、代码似乎无法正确访问 MCU_MCAN 寄存器、并且 MCAN_isMemInitDone () API 由于无法访问 STAT 寄存器而挂起
是否还需要其他东西来将 MCU_MCAN 寄存器空间映射到 DM 内核中?
谢谢!
——Gunter
作为快速的跟进(感谢 Gunter 帮助我发布此帖子!)
MCAN_isMemInitDone() API 似乎只是调用下面的函数、该函数只读取一个32位地址。
memInit = HW_RD_FIELD32 (MCAN_SsAddr (baseAddr)+ MCAN_MCANSS_STAT、MCAN_MCANSS_STAT_MEM_INIT_DONE);
我添加了一个快速日志并验证了 MCAN_SsAddr (baseAddr)+ MCAN_MCANSS_STAT 的计算结果为0x4E09008、该值应涵盖在上述 VRAT 设置中、并且是 MCU_MCAN0_SS 部分的一部分。
HW_RD_FIELD32似乎会导致 DM 内核崩溃、因此我想知道是否有一些 MPU 配置未正确设置。 我注意到开箱即用的 syscfg、因为下面的 register_region 区域已经设置完毕。 是否应设置另一个 MPU 实例?
以下是 REGISTER_REGION 的 MPU 设置:
.baseAddr = 0x0u, .size = MpuP_RegionSize_4G, .attrs = { .isEnable = 1, .isCacheable = 0, .isBufferable = 0, .isSharable = 0, .isExecuteNever = 1, .tex = 0, .accessPerm = MpuP_AP_ALL_RW, .subregionDisableMask = 0x0u },
您好!
感谢您的发帖。 我会仔细研究它,并很快回到你。
此致、
Aparna
您好 Gunter 和 Yue、
设置支持期望
首先要设定期望:我们的团队目前还不能提供有关固件构建器代码的深入支持。 因此、我们将提供我们所能提供的援助、但我们所能提供的支持是有限的。
什么是 RAT? 您何时需要对其进行配置?
请首先阅读 AM62Ax Academy 中 MCU 模块的 RAT 文档:
https://dev.ti.com/tirex/explore/node?node=A__AXBsTEetU2hiTMZSzq4row__AM62A-ACADEMY__WeZ9SsL__LATEST
我是这份文件的作者、所以请随时提出后续问题。
我最初的想法-您不需要为这些访问配置 RAT 模块
有关何时需要配置 RAT 的详细信息、请参阅上述 RAT 文档。 我认为这些要点中的任何一个实际上都不适用于您的用例。
在 TRM 章节存储器映射>器件管理器 R5F 存储器视图中:
除了目标事务之外、所有 R5F 事务都可以通过 RAT 进行地址重映射功能
地址范围0x2000_0000至0x2FFF_FFFF 以及它自己的 ATCM 和 BTCM 中的信息。 仅强烈建议使用
将 R5F 的地址范围从0x8000_0000重新映射到0xFFFFF_FFFF 以访问位于的目标区域
0x8000_0000和0xF_FFFFFFFF_FFFF 之间的通用存储器映射。
因此、如果您要访问位于0x4E0_0000的存储器、则可以将该系统地址重新映射到不同的本地地址-但这是没有理由的。
此致、
Nick
进一步阐明 TRM 的"通过 RAT"含义:
从技术角度而言、 全部 DM R5F 对高于0x2FFF_FFFF 的数据范围的访问将通过 RAT。 但是、默认情况下、localAddress = systemAddress、因此即使电子在物理上通过 RAT、也不会进行地址转换。
此致、
Nick
您好、Nick、您能帮我确认是否使用 VRAT 没有困难吗? 总之、它应该不会产生任何影响?
我在结束时注意到、DM 内核调用来设置 CAN 总线的函数会导致 DM 内核崩溃、这种情况看起来很像。 基本:
正在调用 DM 内核中的此函数(我添加了日志)、它似乎挂起于 HW_RD_FIELD32上、而这只是读取一个地址。 当日志执行并记录此"MCAN_DRIVER using 0x04e09008!"(MCAN_DRIVER using 0x04e09008!)时、传递(来自日志)的地址为值0x04e09008。
uint32_t MCAN_isMemInitDone(uint32_t baseAddr) { uint32_t memInit; uint32_t state; DebugP_log("MCAN_DRIVER using 0x%08x!\r\n", MCAN_SsAddr(baseAddr) + MCAN_MCANSS_STAT); memInit = HW_RD_FIELD32(MCAN_SsAddr(baseAddr) + MCAN_MCANSS_STAT, MCAN_MCANSS_STAT_MEM_INIT_DONE);
我在 MCAN 驱动程序中尝试了其他函数、这些函数只是写入0x04e09000空间中的其他地址(或类似的、cfg 寄存器将写入 CAN 的0x04exxxxx 寄存器)。
想象一下读取或写入这些寄存器会导致 DM 内核挂起、您还想了解什么吗?
我可以进行以下测试:
1.将更多的日志添加到 CAN 驱动程序本身中,看看会发生什么
2.从 syscfg 中删除 VRAT 配置、查看是否有任何行为变化
您好、Nick。
从您的注释中、您是否指出 MCU_MCAN0/1范围内(即0x04E00000至0x04E1FFFF)的地址不需要任何 RAT 配置?
我正在查看 TRM 中的表2-3、显示该范围的 RAT_REGION0。
您认为这些地址范围 0x04E00000至0x04E1FFFF 会自动通过 RAT、无需进行配置吗?
谢谢!
——Gunter
Gunter、您好!
正确。 我的理解是、RAT 基本上是二次逻辑(即、它并不会对通过它的信号增加任何延迟、因为没有 FLOPS 或其他需要多个时钟周期才能使信号通过的电路)、并且对于发布的表 Gunter 中"RAT 区域"内的存储器的任何访问都将通过 RAT 电路物理退出 DM R5F 子系统。
您好、Yue、
我和冈特聊了一会儿。 我的第一个问题是检查 MCAN 是否实际上正在计时。 如果没有进入外设的有效时钟信号、我预计对该寄存器空间的读取和写入会失败(尽管我不确定从远程内核端看是什么样子、但我习惯在 Linux 端使用 devmem2来查看读取失败)。
我将该线程转交给了一位更熟悉 MCU+ SDK 编程的团队成员、旨在提供更多调试思路。
此致、
Nick
嗨、Nick!
看起来我们是在同一波长:)
对于 DM 内核、syscfg 不允许我配置 CAN 总线。 但是对于"示例"代码、它们是为 MCU 内核构建和完成的、这确实允许您通过 syscfg 初始化 MCU CAN 总线。
我所缺少的 Δ 值是您说的、电源时钟。 在示例代码中、syscfg 在 ti_power_clock_config.c 中自动生成该代码 然而,在我的 DM 核心不允许我,我错过了这一点。
现在、在使用 MCAN 驱动程序 API 之前、我已将此代码添加到我的应用中:
SoC_moduleClockEnable (TISCI_DEV_MCU_MCAN0、1);
SoC_moduleSetClockFrequency (TISCI_DEV_MCU_MCAN0、TISCI_DEV_MCU_MCAN0_MCANSS_CCLK_CLK、80000000);
SoC_moduleClockEnable (TISCI_DEV_MCU_MCAN1、1);
SoC_moduleSetClockFrequency (TISCI_DEV_MCU_MCAN1、TISCI_DEV_MCU_MCAN1_MCANSS_CCLK_CLK、80000000);
现在它不再挂起! 我将继续进行测试、如果我遇到更多问题、请及时告知您
大家好、我能够从 DM 内核在 MCU_CAN0和 MCU_CAN1上执行环回测试。 解决后关闭此窗口。 谢谢!
您好、Yue、
很高兴听到现在已对外设计时、所有设备都能够继续操作! 我已经将该主题标记为已解决、但如果您将来有问题、可以随时创建新主题。
此致、
Nick