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.

[参考译文] AM5726:GPMC 状态

Guru**** 2542160 points
Other Parts Discussed in Thread: AM5726

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/875974/am5726-gpmc-status

器件型号:AM5726

您好!

在 AM5726处理器上、我使用 NOR 类似(如下所示为异步)接口连接了控制器。 目标控制器的限制是没有等待引脚。 但时间始终是100%相同的。 因为我从来不知道 GPMC 何时完成了读写操作、所以我必须在操作之间插入延迟、否则会出现重叠和数据丢失。 我可以在逻辑分析仪上很好地看到这一点。


AM572x.CS0 => controller.cs
AM572x.a[20..1]=> CONTROLLER.A[20...1]
AM572x.d[15.0.0]<=> CONTROLLER.d[15.0]
AM572x.ren => controller.rd
AM572x.wen =>控制器电源


是否可以确定 GPMC 的状态、这会告诉我 GPMC 是否忙?

必须读取哪个寄存器?

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

    您好!

    我相信 GPMC 寄存器中没有寄存器位来决定一个传输的完成。 只能通过 GPMC_IRQSTATUS 寄存器监视等待引脚和预取/写后引擎(NAND)。

    如果使用 DMA、可以使用其中断来了解 DMA 何时完成了与 GPMC 之间的传输。
    如果使用 CPU、则可以将 GPMC 存储器映射声明为严格顺序和/或使用软件数据同步边界(DSB)或数据存储器边界(DMB)指令来停止代码执行、直到存储器访问完成。

    其他技巧可能是将 CSn 路由到 GPIO 并在状态变化时中断...或者可能是来自另一个器件的一些其他信号。
    也许您可以利用 GPMC_TIMEOUT_CONTROL 寄存器、方法是向某个地址写入异步存储器不会响应的地址、并让其超时...

    希望这对您有所帮助、
    标记

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

    我现在有问题...

    我已将 wait0引脚添加到监控中:

    AM572x.CS0 => controller.cs
    AM572x.a[20..1]=> CONTROLLER.A[20...1]
    AM572x.d[15.0.0]<=> CONTROLLER.d[15.0]
    AM572x.ren => controller.rd
    AM572x.wen =>控制器电源
    AM572x.wait0 =>控制器。rdy

    我必须添加等待信号、因为控制器不像我想象的那么可靠。
    当我现在访问控制器时、系统挂起。 GPMC 现在等待 wait0变为低电平。 但这不会发生、因为芯片选择和读取/写入信号不够长。 如果我现在在配置寄存器中查找相应的芯片信号、我已经可以看到输入了最大值。 (笑声)
    在 wait0信号为低电平之前、是否无法告知 GPMC 控制器芯片选择、读取/写入信号为低电平?


    有我的 DTS 配置:

    GPMC{
       状态="正常";
       //compatible ="ti、omap4430-gpmC"、"simple-bus";
       //ti、hwmds ="ti、gpmC";thisdo 不起作用
       ti、hwmds ="gpmC";
       #address-cells =<2>;
      大小单元格=<1>;
       GPMC、num-cs =<2>;
       GPMC、num-waitpins =<1>;
       范围=<
          // GPMC 0x0000_0000 0x1FFF_FFFF
          0 0 0x08000000 0x01000000   // Ertec         16MB
          1 0 0x09000000 0x01000000 // XHIF-Register   16MB
       >;
       
       pinctrl-names ="default"、"sleep";
       pinctrl-0 =<&pinmux_GPMC_default>;
       pinctrl-1 =<&pinmux_GPMC_SLEEP>;


      MEM@0、0{
          REG =<0 0x01000000>;
          组宽度=<2>;  // witdh、以字节为单位
          器件宽度=<2>;// witdh、以字节为单位
          无未对齐直接访问;

          GPMC、mux-add-data =<0>;
          GPMC、设备宽度=<2>;/*{1、2} 8位码器16位*/
          GPMC、WAIT-Pin =<0>;
          //GPMC、突发长度=<4>;

          //GPMC CS1时序配置:
          GPMC、cs-on-ns =<3>;/* 1ns - 3ns;1个周期*/
          GPMC、cs-rd-Off-ns =<110>;// 57ns - 60ns;16个周期*/
          GPMC、cs-wr-off-ns =<60>;// 57ns - 60ns;16个周期*/
          GPMC、Adv-on-ns =<15>;// 12ns - 15ns;4个周期*/
          GPMC、Adv-rd -关闭-ns =<18>;// 16ns - 18ns;5个周期*/
          GPMC、Adv-wr-off-ns =<22>;// 19 ns - 22ns;6个周期*/
          GPMC、adv-aad-mux-on-ns =<3>;/* 1ns - 3ns;1个周期*/
          GPMC、Ad-aad-mux-rd-Off-ns =<7>;/* 4ns - 7ns;2个周期*/
          GPMC、Ad-aad-mux-wr-off-ns =<7>;/* 4ns - 7ns;2个周期*/
          GPMC、OE-ON-ns =<3>;/* 19ns - 22ns;6个周期*/
          GPMC、OE-OFF-ns =<110>;/* 57ns - 60ns;16个周期*/
          GPMC、OE-aad-mux-on-ns =<3>;/* 1ns - 3ns;1个周期*/
          GPMC、OE-aad-mux-off-ns =<11>;/* 8ns - 11ns;3个周期*/
          GPMC、WE-ON-ns =<18>;/* 16ns - 18ns;5个周期*/
          GPMC、WE-OFF-ns =<60>;/* 57ns - 60ns;16个周期*/

          GPMC、rd 周期-ns =<115>;// 61 ns - 63 ns;17个周期*/
          GPMC、功率周期-ns =<63>;/* 61ns - 63ns;17个周期*/
          GPMC、ACCESS ns =<115>;/* 53ns - 56ns;15个周期*/
          //GPMC、page-burse-access-ns =<3>;/* 1ns - 3ns;1个周期*/
          GPMC、总线翻转-ns =<12>;// 0 ns - 0 ns;0个周期*/
          GPMC、cycle2cycle-delay-ns =<50>;// 0 ns - 0 ns;0个周期*/
          GPMC、等待监控-ns =<0>;/* 0ns - 0ns;0个周期*/
          GPMC、clk-activation-ns =<0>;/* 0ns - 0ns;0个周期*/
          GPMC、wr-data-mux-bus-ns =<26>;/* 23ns - 26ns;7个周期*/
          GPMC、wr 访问-ns =<56>;/* 53ns - 56ns;15个周期*/

          GPMC、cycle2cycle-samecsen;
          GPMC、cycle2cycle-diffcsen;       
          //GPMC、OE-extra-delay;
          GPMC、WE-extra-delay;
          GPMC、时间参数粒度;      //将所有访问时间乘以2 */

          GPMC、等待读取;
          /GPMC、写入等待;
       };

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

    您好!

    您似乎已经将 TIMEPARAGNULARITY 设置为1、以将信号减慢2倍。 您是否观察到了差异?

          GPMC、时间参数粒度;      //将所有访问时间乘以2 */

    GPMC 使用内部计数器对从访问周期开始的信号转换进行计时。 TIMEPARAGNULARITY 位强制每个计数器在两个 GPMC_FCLK 周期而非一个周期后递增、因此与不设置 TIMEPARAGNUARITY 位相比、每个周期开始时的时序加倍。

    当 GPMC 检测到 WAIT 信号处于活动状态(根据配置可能为低电平或高电平)时、它会冻结所有内部计数器、以便它们不会随着每个 FCLK (如果使用了 TIMEPARAGNULARITY、则每两个 FCLK 周期递增一次)。

    如果不将 WAIT 信号置为有效、计数器将有最长的计数时间。 例如、在31个 FCLK 周期内、您可以放入 CSRDOFFTIME 的最大值为0x1F。 借助于 TIMPARANNULARITY、这个周期被加倍至62个 FCLK 周期。 减慢它的唯一方法是通过调整为 GPMC_FCLK 供电的 PLL 来使用较慢的 GPMC_FCLK (TI 不建议这样做、因为该时钟由其他外设共享)。 请参阅时钟树工具(https://www.ti.com/tool/CLOCKTREETOOL)

    在使用 GPMC_CONFIG1_n 寄存器中的 FCLK 分频器= div-1的同步事务期间、您可以通过示波器探测 GPMC_CLK 来观察 GPMC_FCLK 的频率。 默认情况下应为266MHz。

    但我相信引导 ROM 软件会将 diver_L3_ICLK 配置为2倍频模式、从而使 GPMC_FCLK 频率为133MHz。 在时钟树工具中跟踪时钟、以查找 L3MAIN1_L3_GICLK 由 L3_ICLK 计时、L3_ICLK 由 CORE_X2_CLK 计时(在 Divider_L3_ICLK div-1或 div-2之后)。

    值得注意的是、AM335x 和 AM437x 等其他 Sitara 处理器默认为100MHz GPMC_FCLK、AM654x 处理器(和未来的处理器)具有时钟多路复用器、您可以在各种频率下为 GPMC_FCLK 选择不同的源。

    最后、NAND 驱动程序使用的一个技巧是查询 GPMC_STATUS 寄存器中的 WAIT0STATUS 位。 软件会在任何事务之外轮询该位、然后在释放等待信号后恢复发送到 NAND 的软件命令。 这是因为 NAND 在初始化期间具有很长的延迟。 不确定是否可以将其放在此处使用。

    请告诉我您的问题。 请随时分享您的 GPMC 寄存器转储以供审核。

    希望这对您有所帮助、
    标记