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.

[参考译文] TMS570LC4357:EMIF 32 位访问产生一个 16 位访问、是否进行调试?

Guru**** 2782615 points

Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1584341/tms570lc4357-emif-32bits-access-produce-one-16bits-access-debug

器件型号: TMS570LC4357

尊敬的专家:

使用的芯片是 tms570lc4357 修订版 B。它设置为使用具有 32 位访问和选通模式(地址 0xFCFFE818、数据 0xC4600301)的 CS4n、并启用等待状态(地址 0xFCFFE804、数据 0x000000FF)。 使用 EMIF 0x68 进行读取访问... 为偏移 0x0 和 0x4 生成正确的读数、但在偏移 0x8 (DATA = 0x0) 处给出错误的读数、然后为后续地址校正读数。 然而、读取偏移量 0x8 两次会在第二次读取时产生正确数据。 测量的 EMIF CS4n 似乎对所有 32 位读取产生正确的 2×16 位访问、但在对偏移量 0x8 进行 32 位读取期间或之前产生一个 1×16 位访问。 第二次阅读似乎可以解决此问题。  

这种行为的原因可能是什么? 可以检查哪些寄存器来了解错误、哪些设置可能会影响该行为?

此致、

Marvin

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

    尊敬的 Marvin:

    我以前从未看到过这个问题。

    但是、我们有一个内部 TI AI 工具、它可以访问所有旧的 e2e 数据库、也可以访问与此器件相关的所有文档。当我使用该工具时、收到了一些很好的建议。 请检查一次:

    根据 e2e.ti.com 上的信息和技术文档、我可以解释您在使用 TMS570LC4357 EMIF 配置时遇到的行为。

    根本原因:数据线缓冲区和 64 位对齐

    在偏移 0x8 处遇到的问题与有关 EMIF 数据线缓冲器行为 64 位对齐边界 。 具体情况如下:

    (1) TMS570LC4357 EMIF 使用在 64 位边界上运行的数据线缓冲器 。 根据技术文档:

    “任何错过数据线缓冲区的 16 位或 32 位读取都会启动对 EMIF 的 64 位访问、并使 CPU 停止运行、直到四个 16 位访问完成并重新填充缓冲区(在 16 位 SDRAM 或 ASRAM 上)。 这意味着顺序访问具有更好的性能。“(1)

    “行缓冲区的宽度为 64 位、并具有相关的有效位 (Vx) 和地址标签 (ATAGx)。 ATAGx 是数据线缓冲器中保存的数据的 64 位对齐地址。“(1)

    为什么偏移 0x8 行为不同

    您的访问模式是:

    • 偏移 0x0 :正常工作(在第一个 64 位缓冲区行 0x0-0x7 内)
    • 偏移 0x4 :正常工作(仍在第一个 64 位缓冲区行 0x0-0x7 内)
    • 偏移量 0x8 首次读取时失败 (交叉到第二个 64 位缓冲区行:0x8-0xF)
    • 偏移 0x8(第二次读取) :正常工作(缓冲区现已填充)

    对偏移量 0x8 的第一次访问会跨越 64 位边界、从而导致缓冲区丢失。 您观察到的不完整 16 位访问可能是由于缓冲区管理逻辑尝试处理边界交叉造成的。

    要检查的寄存器

    1. PMCR(外设存储器控制寄存器)- 0xCFFE818

      • 您的当前值:0xC4600301
      • 要验证的位字段:
        • 位[31:30]:数据总线宽度(对于 32 位、应为 10b)
        • 位[8]:SS(选择选通模式)-您已启用此功能
    2. ASYNCWAIT 寄存器 — 0xFCFFE804

      • 您的当前值:0x000000FF
      • 配置的最大等待状态
    3. 存储器数据线缓冲器配置(如果可访问)

      • 检查是否为您的 CPU 启用了数据线缓冲器
      • 寄存器地址因器件配置而异

    推荐解决方案

    解决方案 1:禁用 EMIF 区域的数据线缓冲器(首选)

    配置 MPU(存储器保护单元)、将 EMIF CS4N 区域标记为未缓冲读取的外设区域:

    // Configure MPU region for EMIF CS4N space
    // Set memory attributes to disable buffering
    // TEX=0, C=0, B=0 for strongly-ordered/device memory

    这可确保这一点 “在 DLB 中不缓冲读取“ 用于外设空间 (1)、防止缓冲区对齐问题。

    解决方案 2:调整访问模式

    确保您的首次访问与 64 位边界一致:

    • 开始从偏移 0x0 读取、然后 0x8、0x10 等
    • 或执行虚拟读取、以便在实际读取之前填充缓冲区

    解决方案 3:添加内存障碍

    在访问之间插入存储器屏障指令 (DSB/DMB) 以确保完成:

    __asm(" DSB");  // Data Synchronization Barrier
    // Perform your EMIF read
    __asm(" DSB");

    解决方案 4:验证计时参数

    您的 PMCR 配置 (0xC4600301) 应根据外部器件时序进行验证:

    • R_Setup、R_频 闪、R_HOLD
    • W_SETUP、W_频 闪灯、W_HOLD
    • TA(周转时间)

    不完整的访问也可能指示缓冲区重新填充操作期间的时间问题。

    E2E 主题参考

    您的具体问题已在 e2e.ti.com 上讨论:(1) https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrolle

    线程确认这是与跨 64 位边界的数据线缓冲区管理相关的已知行为。

    --
    此致、
    Jagadish。