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.

[参考译文] TMS320F28375D:存储器显示 EMIF 和外部 SDRAM

Guru**** 2528480 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/598375/tms320f28375d-memory-display-emif-and-external-sdram

器件型号:TMS320F28375D
Thread 中讨论的其他器件:controlSUITE

Code Composer 存储器窗口是否会通过存储器窗口中的 EMIF 正确地读取存储器并将其写入外部 SDRAM?  IE:如果我向0x8000000写入一个值、它是否会正确地将数据写入/读取到外部 SDRAM 中?  还是只能通过正确编码访问外部 SDRAM?

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

    只要 EMIF 被正确配置为在 SDRAM 模式下运行、它就会进行正确的读/写操作。 您是否发现了一些问题?

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

    我们刚刚收到了新的 SDRAM 版本、因此我正在进行调试、但我想确保代码编写器能够在假设一切设置正确的情况下正常工作。  此时、它不会、但只是想确定 Code Composer 的预期结果、一旦我有机会尝试确定当前的错误、就会让您知道这个问题是否仍然存在。

    谢谢。

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

    简单来说、 www.ti.com/.../spruhm8f.pdf 中的第7.2节...当我们为 EMIF1配置 GPIO 时、输入/输出以及输入和输出线路是固定的、对吧? 我们不必指定为输入或输出...

    但是、从第25.2节中可以看出、如果我们在外部没有设置上拉电阻器、我仍然需要将输入鉴定设置为异步并向输入线路添加上拉电阻器... 对吧?

    在 EMIF1的情况下、唯一的输入线路是数据 I/O 线路。  我是否必须明确地将这些设置为异步?  或者它们的功能是否已硬编码(内置在硬件中)到 EMIF 中?

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

    Rob、

    [引用]只是为了说明: www.ti.com/.../spruhm8f.pdf 中的第7.2节...当我们为 EMIF1配置 GPIO 时、输入/输出以及输入和输出线路是固定的、对吧? 我们不必指定为输入或输出... [/报价]

    没错。 当任何引脚被选为外设功能时、您没有设置输入/输出。

    [引用]但是、从第25.2节中可以看出、如果我们在外部没有设置上拉电阻器、我仍然需要将输入鉴定设置为异步并向输入线路添加上拉电阻器... 对吧? [/报价]

    这也是正确的。 如果您使用的是 controlSUITE 中的 pinmux 函数、则它会处理此问题。

    Vivek Singh

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

    I 基本上:将所有权设置为 CPU2、从表7-8中为相关引脚选择合适的2、3。

    然后、我根据手册执行相关的 EMIF 设置。 下面的代码片段:

    您是否看到我在设置中可能遗漏的任何明显内容?

    当前的状态是,我看到示波器上的一个我们低电平脉冲是什么样子的,当我写入一些测试代码以写入内存时... 我可以通过 Code Composer 存储器窗口写入0x8000000范围(SDRAM)的某些存储器或通过写入一些代码来生成 WI (写入使能)低电平... 但是、我还无法读回数据。

    我记得在 SDRAM 中的全局存储器上使用适当的 far 声明、并将其链接到0x8000000。

    在拔出逻辑分析仪并开始查看硬件中的总线周期之前、我只是想确保我没有忘记软件中的任何设置步骤。

    是否有任何明显的设置会影响它?

    谢谢。

    /*
    *配置 EMIF GPIO 引脚
    *

    // EMIF1的数据线
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、85、GPIO_MUX_CPU2、2);// D0
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、83、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、82、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、81、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、80、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、79、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、78、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、77、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、76、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、75、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、74、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、73、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、72、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、71、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、70、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、69、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、68、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、67、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、66、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、65、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、64、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、63、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、62、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、61、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、60、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、59、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、58、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、57、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、56、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、55、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、54、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、53、GPIO_MUX_CPU2、2);// D32

    //地址行
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、38、GPIO_MUX_CPU2、2);// A0
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、39、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、40、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、41、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、44、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、45、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、46、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、47、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、48、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、49、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、50、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、51、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、52、GPIO_MUX_CPU2、2);// A12

    // EM1CAS
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、86、GPIO_MUX_CPU2、3);
    // EM1RAS
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、87、GPIO_MUX_CPU2、3);
    //其他控制线
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、88、GPIO_MUX_CPU2、3);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、89、GPIO_MUX_CPU2、3);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、90、GPIO_MUX_CPU2、3);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、91、GPIO_MUX_CPU2、3);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、92、GPIO_MUX_CPU2、3);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、93、GPIO_MUX_CPU2、3);

    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、29、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、30、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、31、GPIO_MUX_CPU2、2);
    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、32、GPIO_MUX_CPU2、2);
    (一
    (一
    (一
    (一
    (一
    //
    // GPIO_SetupPinMux -设置指定引脚的外设多路复用。 。
    // 可以在 GPIO 复用中找到适当的参数
    // 数据表中的引脚表(4.4)。 使用 GPIO 索引
    // 行(0至15)、用于为 GPIO 选择多路复用选项。
    //
    空 GPIO_SetupPinMux (UINT16引脚、UINT16 CPU、UINT16外设)

    易失性 uint32 *gpioBaseAddr;
    易失性 uint32 * mux、* gmux、* csel;
    uint16 pin32、pin16、PIN8;

    pin32 =引脚% 32;
    pin16 =引脚% 16;
    PIN8 =引脚% 8;
    gpioBaseAddr =(uint32 *)&GpioCtrlRegs +(PIN/32)*GPY_CTRL_OFFSET;

    //
    //完整性检查有效的 CPU 和外设值
    //
    IF (CPU > GPIO_MUX_CPU2CLA ||外设> 0xF)
    返回;

    //
    //创建指向相应寄存器的指针。 这是一种权变措施
    //定义 GPIO 寄存器的方式。 标准定义
    //在头文件中,可以很容易地对其中一个进行命名访问
    //寄存器或位,但很难执行任意的数字访问。 是的
    //更容易拥有一组具有相同寄存器的 GPIO 模块、
    //包括多寄存器组的数组,如 GPyCSEL1-4。 但是
    //头文件不定义任何可以转换为数组的内容,
    //SO 改为使用手动指针算术。
    //
    MUX = gpioBaseAddr + GPYMUX + pin32/16;
    gmux = gpioBaseAddr + GPYGMUX + pin32/16;
    CSEL = gpioBaseAddr + GPYCSEL + pin32/8;

    //
    //现在用于实际函数
    //
    EALLOW;

    //
    //要更改多路复用、请先将外设多路复用器设置为0/GPIO 以避免
    //毛刺脉冲、然后更改组多路复用器、然后将外设多路复用器设置为
    //其目标值。 最后、设置 CPU 选择。 此过程是
    //在 TRM 中进行了说明。 遗憾的是、由于我们不知道中的引脚
    //提前我们无法对位字段引用进行硬编码,因此有一些
    //此处显示棘手的位。
    //
    *mux &=~(0x3UL <<(2*pin16));
    *gmux &=~(0x3UL <<(2*pin16));
    *gmux |=(uint32)((外设>> 2)& 0x3UL)<<(2*pin16);
    *mux |=(uint32)(外设和0x3UL)<<(2*pin16);

    *CSEL &=~(0x3L <<(4*PIN8));
    *CSEL |=(uint32)(CPU & 0x3L)<<(4*PIN8);

    //
    //警告:此代码不会触及模拟模式选择寄存器,
    //为 USB 模块提供对其 IO 的控制所需的。
    //
    EDIS;


    (一
    (一
    (一
    (一
    (一

    然后、我将遵循以下命令的 EMIF 初始化:

    //这是按照 EMIF1启动的过程 B 第25.3.5.5节进行的

    //将时钟频率设置为/2或100MHz
    EALLOW;
    ClkCfgRegs.PERCLKDIVSEL.bit.EMIF1CLKDIV = 1;
    EDIS;

    //告诉 EMIF 什么是 SDRAM 时序要求,以便更好地调度和满足 SDRAM 时序要求
    //注意:这些值应该来自所选 SDRAM 的数据表
    //注意:这些来自 AS4C4M32S 的数据表
    emif1Regs.SDRAM_TR.bit.T_RAS = 42;
    emif1Regs.SDRAM_TR.bit.T_RC = 60;
    Emif1Regs.SDRAM_TR.bit.T_RCD = 18;
    //注:根据 SDRAM 数据表(自动刷新命令)中的第12项,RGC 重新生成 RC min,因此我们有两个重复的条目
    emif1Regs.SDRAM_TR.bit.T_RFC = 60;
    emif1Regs.SDRAM_TR.bit.T_RP = 18;
    emif1Regs.SDRAM_TR.bit.T_RRD = 12;
    emif1Regs.SDRAM_TR.bit.T_WR = 2;

    EMif1Regs.SDR_EXT_TMNG.bit.T_XS = 61.5;

    //注意:这是启动刷新率,稍后在这个非常相同的初始化例程中再次更改
    //设置 SDRAM 的刷新率
    //数据表显示每64ms 4096个刷新周期,因此计算为:
    // 100MHz (EMIF 时钟)* 64ms/4096 = 1563个周期
    //但是,对于第一个设置,它们需要 Rr*x/100MHz > 200us,因此2501或更高版本才能满足约束条件,我们将需要2510
    emif1Regs.SDRAM_RCR.bit.refresh_rate = 2510;

    //注意:如果我们只需要一个自动重启周期,则需要使用.all 设置来设置以下4个变量。
    // 如果我们单独写入它们、它们将导致发生4次。
    //将总线宽度设置为32位
    //emif1Regs.SDRAM_CR.bit.nm = 0;

    //设置读取周期的 CAS 延迟
    //emif1Regs.SDRAM_CR.bit.CL = 2;

    //设置所选存储器的参数
    //emif1Regs.SDRAM_CR.bit.IBANK = 4;
    //我们有8个列地址位
    //emif1Regs.SDRAM_CR.bit.PAGESIGE = 0;

    //一次性设置上述全部四项
    emif1Regs.SDRAM_CR.all = 0x00000520;

    //从 SDRAM 读取内存或执行200us 延迟,我们选择读取内存
    EMIF1_StartupReadSDRAM( EMIF1 );

    //设置 SDRAM 的刷新率
    emif1Regs.SDRAM_RCR.bit.refresh_rate = 1563;

    (一
    (一
    (一
    (一
    (一


    ;********
    ;------------------------------------------------------------------
    ;_EMIF1_StartupReadSDRAMASM

    ;周期计数:
    ;注:不对循环进行计数 C/C++代码用于推入/POP 以进行调用
    ;------------------------------------------------------------------
    ;********
    _EMIF1_StartupReadSDRAMASM:
    ;(void * SDRAMPtr)

    ;转换为:

    ;XAR4=&SDRAMPtr

    ;注:返回值放在*-SP[2](32或2字值)

    ;----
    ;主循环
    ;----
    MOV32R0H,*XAR4;执行 SDRAM 虚拟读取以启动

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

    我们有机会进一步了解这一点... 目前、我们看到了 RAS/CAS 和控制信号的写入周期、但我们正在写入的数据不会出现在数据总线上?  我们正在调查硬件原因、但从软件角度来看、我称之为配置:

    CPUGPIO_SetupPinMux (&theCPU->the CPUGPIO、85、GPIO_MUS_CPU2、2);

    它只会调用:

    void CPUGPIO_SetupPinMux (CPUGPIO * CPUGPIO、unsigned long 引脚、unsigned long CPU、unsigned long 外设){

    CPU1

    GPIO_SetupPinMux (引脚、CPU、外设);

    #endif

    然后、它只会调用您提供的 TI 版本的剪切和粘贴。

    问题似乎只是不在数据线上输入数据... 因此我可以读取所有零(因为数据线实际上是全零...)

    我们正在调查 SDRAM 是否以某种方式将总线驱动为低电平、但如果只是配置错误、TI 器件端会提供任何输入。

    谢谢。

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

    您是否正在尝试从 CPU2访问 EMIF? 如果是、则需要配置 EMIF1MSEL (请参阅表25-51)。 TRM 中的 EMIF1_CONFIG_REGS 寄存器)以启用来自 CPU2的 EMIF 访问。

    此致、

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

    //将 EMIF1或 SDRAM 的所有权分配给 CPU2
    EMIF1ConfigRegs.EMIF1MSEL.ALL = 0x93a5ce72;

    我已经发现了这一点、因此我已经将 EMIF1的所有权分配给 CPU2、并编写了上面所示的特殊有趣序列。

    我们还看到了一些奇怪的东西... 事实证明、即使我对32位数据总线的 NM = 0进行编程... 如果我写入高十六进制位、我们将验证任何其他原因(硬件等)、因此在0xffffff0000中、对于所有0x80000000及以上的存储器、它会在 code composer 窗口中读回0xffffffff。。。

    我认为以上的要点似乎并不是协调32位数据... IE:我看到的是16位数据的模式...

    如果我写入0xf0ff0000,那么它会读回0xf0fff0ff 0xf0fff0ff…… 对于所有内存...

    我记得问过它如何调整32位存储器的地址行的问题、这是否与它有关? IE:如果在硬件中、地址行未连接以说明 EMIF1如何生成32位地址... 也许我看到16位复本并且必须写入高位的原因是、当生成读取周期时、它读取的地址可能不对齐?

    好消息是它正在读回一些数据... 坏消息是它被炒了... 需要去解码并确定原因...

    您能否给我们发送一个更新的表25-14... 由于这是一个4的组大小和0的页大小、因此我们没有正确的地址行图...

    谢谢。。。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在表25-14的正上方,该表指出:

    EMIF 在 WRT 命令期间使用 EM1DQM[1:0]引脚来屏蔽所选字节或整个字节
    字。 EM1DQM[1:0]引脚在读取命令期间始终为低电平。

    您能否进一步说明这一点? 由于我们看到写入的数据的"低字"丢失、但读取周期正在读取写入高数据的重复值、这听起来可能是我们观察到的结果。

    请对此进行扩展。

    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、这是一个拼写错误。 它应该是 EM1DQM[3:0]而不是 EM1DQM[1:0]。 我假设您已将所有4个 DQM 引脚从 EMIF 连接到 SDRAM 器件。 只要它在那里、就很好。 我们将在下一个版本中更正此拼写错误。

    对于 NM 位配置、您是否在 CCS 寄存器视图中检查了配置以确保其确实为"0"?

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

    您是从 CCS 调试窗口还是从实际代码中观察到这一点? 如果您没有尝试过该代码、我建议您使用该代码访问 SDRAM、看看该代码是否正常。

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从您所解释的内容来看、SDRAM 器件似乎没有响应 EMIF 的命令。 在这种情况下、您将看到所有地址上重复出现数据问题、因为写入数据仍保留在总线上、并在读取命令期间被捕获。
    您是否已检查 SDRAM 设备是否已正确通电?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我们已将这四个器件都连接到硬件中。

    我检查了 CCS 寄存器视图、它似乎没有改变为我对它进行编程的方式... 但是、NM 的默认值是0、根据表25-8、它表示1 = 16位数据总线、0是32位数据总线...

    我在启动时分配 EMIF1的所有权、然后在 CPU2上运行 EMIF1启动... 但正如我看到的、SDRAM_CR 寄存器在 CPU2上不更新... 我将其设置为:

    //一次性设置上述全部四项
    emif1Regs.SDRAM_CR.all = 0x00000440;

    但是、当我查看 Code Composer 寄存器视图时、它仍然是默认值... CL = 3、bank = 2、不是 Banks = 4、CL = 2、我要尝试设置... 但无论在哪种情况下、nm 都是0。

    它不会说这是一个 EALLOW 寄存器、我需要 EALLOW/DIS 吗? 如果我在启动时为 CPU1分配了所有权、那么我在 CPU2上具有 EMIF1启动序列... 它应该能够正确地访问这些寄存器?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    --删除了答复,因为它不正确----

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在尝试准确确定我们在代码中看到的内容、但我可以说它不正确。 IE:当我们读回它时、我们看不到我们写的内容... 我将尝试量化当我通过代码执行写入和读取周期时看到的模式... 我还不确定我通过常规编码看到的是什么... 让我确保它与我们使用 code composer 看到的内容相同、或者有所不同... 我将尝试缩小范围、但我可以说、如果我在代码中向存储器写入某些内容、它不会读回相同的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、这可能会对它进行解释。 我要将 EMIF1的初始化代码移动到 CPU1、因为这时 EMIF1的初始化序列未成功运行、并且未初始化 SDRAM (模式寄存器未设置等) 这可能是问题所在...

    谢谢。。。 我将告诉您这是否解决了问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rob、

    让我把它带回去。 我们有另一个器件、在该器件上、只能从主 CPU 访问配置寄存器、但 CPU2应该能够配置 EMIF1寄存器。 您能否检查所有写入是否都失败、还是仅检查一些写入失败?

    此致、
    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在从任一 CPU 设置它们时遇到问题... 当我将初始化移动到 CPU1时、我从寄存器窗口读回所有零... IE:CL 和 ibank 读数为零、因此它们不是默认值或我将其设置为什么值。 当我在 CPU2上保留初始化时、它至少保持默认值... 当我在 CPU1上初始化它时、我在通过 code composer memory 窗口读取或写入时看不到任何活动... 因此、我认为我一定要重点关注 EMIF1/SDRAM 的正确初始化... 有任何输入?

    如果所有写入都失败、这意味着什么? 还是只有一些?

    如果我在 CPU1上初始化它、是否必须在初始化之前/之后设置所有权? 当前、我在 CPU1上初始化 EMIF 后将所有权更改为 CPU2。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 EMIF1配置之后,您在 CCS 寄存器视图(或表达式视图)的配置寄存器中看到的值是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您在所有字段中看到重置值、则可能无法正确更新 CL 字段。 要更新 CL 字段、还需要向位8 (bit_11_9_lock)写入"1"。 最好将 SDRAM 寄存器写入32位、而不是单独的位、因为某些位写操作会启动 SDRAM 初始化序列。

    我还假设您仅从 CPU1执行 GPIO 设置、而不是从 CPU2执行 GPIO 设置、因为 CPU2不支持该设置。 如果您可以发送从 CPU1代码和 CPU2完成的序列的详细信息、这将很有帮助。

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

    这是您昨天向我通报的所有内容的当前样子。

    是的、假设我在 CPU1上设置 GPIO、您的回答正确。

    首先、我能说明:

    为了设置 SDRAM_TR 寄存器中的时序值、T_RP、T_RC 等、手动设置会以时钟周期进行编程。  如果数据表中列出的值为18ns、外部时钟为100MHz 或10ns、我们输入的值是否为2?  IE:将18舍入至20、然后除以10ns、得到2?

    而且他们都说-1…… 那么、在上面的示例中、我会对1进行编程吗?

    那么、如果计时为60ns、那么这将是6个时钟周期、但由于-1、我们应该输入5?  对吧?

    下一步:

    这是我观察到的、在所有权设置中、文档状态00 = CPU1、但 CPU2可以抓取、01、CPU1拥有 EMIF、02 CPU2拥有 EMIF1和11 CPU1、但 CPU2可以抓取...

    我观察到、如果我尝试在 CPU1上设置此值、让 CPU2拥有它... 它不做任何事情... 但是、如果我通过在 CPU2上设置相同的寄存器来"抓取" EMIF、那么 CPU2会获取它...  此外、如果我在 CPU1上设置了该寄存器、并将其设置为 CPU1、则 CPU2无法获取它...

    重点是... 是否不清楚我在 CPU2上必须设置该寄存器、以"获取" EMIF 的所有权...  您的所有其他所有权(内存等) 我已经对 CPU1执行过操作、想、我将其设置为让 CPU2拥有它... 但在这种情况下、您似乎必须从 CPU2中抓取(即设置所有权)...

    您能确认这是正确的行为吗?

    因此、我基本上需要将这条线放置在 CPU2中、以使其获得 EMIF1的所有权。

     EMIF1ConfigRegs.EMIF1MSEL.ALL = 0x93a5ce72;

    这解决了一个问题、我现在可以设置 CPU2中的所有寄存器并观察它们的正确设置。



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

    在进一步测试后、它的性能会更好、但我需要对如何设置时钟和-1的时序寄存器进行验证的答案。 另请注意、在 WR One 上、它会显示"for SDR"、而在其他所有器件上、它会显示:

    WR
    对于 SDR、这等于中的 EMxCLK 周期的最小数量
    到预充电的最后一次写入传输减1。

    RC (以及所有其他遵循此格式)
    从激活到激活减去的 EMxCLK 周期的最小数量
    一个。

    "对于 SDR"是什么意思?

    摘要;
    是采用器件数据表中以 ns 为单位的时序值、在本例中除以100MHz 还是10ns 时钟、然后针对所有这些值减去一个?

    我已经可以告诉您、如果我这么做、我看不到正确的写入总线周期... 如果我做以上的事,我会看到 Ras,然后是 CAS,然后我们… 因此、我需要清楚如何设置它们。 谢谢。

    非常感谢您的支持、它帮助我更快地找到问题。

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

    尊敬的 Rob:

    很高兴知道它工作正常。 正如定义 EMIF1MSEL 寄存器位中提到的、EMIF 的控制需要由单个主器件获取。 这与其他主所有权控制不同。

    寄存器设置、您的理解是正确的。 所有值都以周期为单位、您需要以 EMIF 时钟周期的倍数舍入数字、然后减1以获得配置值。  "表25-27中给出了一个示例。 EMIF 的 SDRAM_TR 场计算"。 请参阅相同的内容。

    [引用] RC (以及所有其他人都遵循此格式)
    从激活到激活减去的 EMxCLK 周期的最小数量
    一个。

    "对于 SDR"是什么意思? [/报价]

    SDR 用于 SDRAM 设置(不适用于 DDR)。

    此致、

    Vivek Singh

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

    感谢您迄今提供的帮助。

    遗憾的是、它仍然无法完全正常工作。

    我需要请您深入了解 TI 器件可能出现的问题。

    我可以在示波器上捕获自动初始化序列、按照25.3.5.4中的说明、该序列看起来非常完美

    为了实现这一点、我需要更改的只是 EMIF 的所有权(将其移至 CPU2)。

    我已通过该示例验证、我正在为所选存储器正确设置寄存器。

    emif1Regs.SDRAM_TR.bit.T_RAS = 4;

    emif1Regs.SDRAM_TR.bit.T_RC = 5;

    emif1Regs.SDRAM_TR.bit.T_RCD = 1;

     emif1Regs.SDRAM_TR.bit.T_RFC = 5;

    emif1Regs.SDRAM_TR.bit.T_RP = 1;

    emif1Regs.SDRAM_TR.bit.T_RRD = 1;

    emif1Regs.SDRAM_TR.bit.T_WR = 1;

    EMif1Regs.SDR_EXT_TMNG.bit.T_XS = 6;

     

    现在、当我在代码中写入一些数据时、我会看到 Code Composer 窗口在所有地址0x8000000及更高的地址更新了该数据、不过是完整的32位。

    但是,我当前执行一个示例测试: (其中 MatrixUI->ArrayUI[0]= 0x8000000

    对于(;;){

    MatrixUI->ArrayUI[0]= 2882342889;//十六进制0xabcd0fe9

    MatrixUI->ArrayUI[1]= 0;

    MatrixUI->ArrayUI[2]= 1;

    MatrixUI->ArrayUI[3]= 2;

    MatrixUI->ArrayUI[4]= 3;

    values[0]= MatrixUI->ArrayUI[0]

    values[1]= MatrixUI->ArrayUI[1]

    values[2]= MatrixUI->ArrayUI[2]

    values[3]= MatrixUI->ArrayUI[3]

    values[4]= MatrixUI->ArrayUI[4]

    i = MatrixUI->ArrayUI[0]

    if (i =2882342889){

    asm (" ESTOP0");

    值[0]= I;

    MatrixUI->ArrayUI[0]= 47;

    i = MatrixUI->ArrayUI[3]

    如果(i ==2){

    asm (" ESTOP0");

    值[3]= I;

    如果它正确读取数据、则在以全速运行时应该会达到 ESTOP0、并且它永远不会...

     

    我根据您关于数据总线将保存写入的最后一个值的陈述来安排测试...  当然、如果我将上述程序更改为包含以下内容:

    MatrixUI->ArrayUI[whateverIndex]= somenumber;

    i = MatrixUI->ArrayUI[whateverIndex];

    如果(i == somenumber){

    asm (" ESTOP0");

    然后它当然起作用、因为某些数字是我最后一次写入总线的数据... IE:它符合 ESTOP0、

     

    因此、这就是我构建上述代码以不测试刚刚写入的值的原因...  测试它是否真的在读取它...

     

    现在、当我查看示波器上的写入周期时、它看起来并不完全正确。  主要是先发生 Ras、然后是 cas、然后是我们...  但我们应该在 cas 正确的同时发生呢?  在 CAS 线路之后、我们开始减少1个时钟周期、因此延迟了1个周期...

     

    那么问题是、对于我为时序编程的值、为什么 TI 器件显然会产生略微扰动的写入周期...

     

    这与调试器有什么关系吗?

     

    此外、使用这些设置、当我使用 Code Composer 存储器窗口进行写入时、我仍然看到16位复制、而不是32位复制、当我使用代码进行写入时、我看到...

     

    关于以下方面的任何想法:

    为什么 我们可以延迟写入周期、

    2. 为什么我基本上只能读取总线上最后放置的内容?  (我认为这是因为写入周期不正确、所以它实际上不会写入存储器、 虽然我没有检查读取周期、但我想肯定有问题、因为如果正确、它应该读取 SDRAM 中存储的任何内容、并相应地驱动总线...

     3. 是否可能我要求它超过某些最大/最小限制、所以 EMIF 无法生成正确的周期、因为我"超出范围"

    谢谢。

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

    谢谢 Vivek。

    我查看了您的 F2837xD_EMIF.c 文件、需要提出一些澄清问题。

    我终于能够读取和写入 SDRAM、我可以在代码中以及通过 code composer memory 窗口执行此操作... 但以下事项需要进行分层:

    在 F2837xD_EMIF.c 版本200下(我尚未开始使用210版本)有一个函数 setup_emif1_pinmux_SDRAM_32位

    在此函数中、您按原样设置 GPIO 引脚、调用 GPIO_SetupPinMux ...

    这与我所做的相同、除了... 您调用 GPIO_SetupPinMus (94...  

    分层1:

    为什么设置引脚94?  在表7-8中、引脚94现在具有 EMIF 特定的功能...  实际上、在我们的电路板上、我们为 GPIO94...

    因此、我只需要澄清引脚94用于该示例应用中的其他用途、与 EMIF1无关。

    分层2:

    然后、您继续为数据线路和 EM1DQM0-3线路调用 GPIO_SetupPinOptions。。。  您可以将它们设置为具有上拉和异步模式的输入(0是输入、0x31是与上拉异步)

    我觉得这有点令人困惑。  第25.2节确实指出、我们应该将输入设置为异步、并讨论如何设置上拉电阻...  但是数据线是 I/O、而 EM1DQM0-3是作为输出列出的?  那么、澄清是: 我怎么可能知道如何像在该样片中那样设置这些参数呢?  由于方向寄存器是输入或输出、而不是输入和输出、因此从这个角度来看、这有点令人困惑...  由于 EM1DQM0-3被列为输出、为什么要将它们设置为具有上拉和异步的输入?  (引脚88-91)

    层化3:

    在示波器上、我现在看到 WI 脉冲低电平与 CAS 同时、它的宽度持续更长的时间...

    查看同一文件如何为其特定部分设置计时寄存器(EMIF_32IT_SDRAM.c)...

    //

    //配置 SDRAM 控制寄存器

    //

    //需要根据 SDRAM 数据表进行编程。

    //T_RFC = 60ns = 0x6

    //T_RP = 18ns = 0x1

    //T_RCD = 18ns = 0x1

    //T_WR = 1CLK + 6ns = 0x1

    //T_RAS = 42ns = 0x4

    //T_RC = 60ns = 0x6

    //T_RRD = 12ns = 0x1

    根据我们讨论过的内容、我认为 T_RFC 应该设置为5或60ns/10ns 时钟= 6 -1 = 5、但在这里、他将其设置为6?

    T_WR 为何要加上1clk? 该特定于本示例中使用的器件... 如果是、没关系、

    重点是 T_RC 和 T_RFC 通过1个时钟以不同的方式进行设置、而我所理解的是...  计算这两者的正确方法是什么?

    分层4:

    设置了保护寄存器?  我假设由于 One 寄存器看起来像 Set once 功能、这里的想法是将这些设置锁定在器件中、这很可能是因为一旦分配了 SDRAM、您就不会希望它意外更改...  因此、我们不必对其进行设置、它只是可选的。

    //

    //为 CPU1抓取 EMIF1

    //

    EMIF1ConfigRegs.EMIF1MSEL.ALL = 0x93A5CE71;

    if (emif1ConfigRegs.EMIF1MSEL.all!= 0x1)

    ErrCount++;

    //

    //禁用访问保护(CPU_Fetch、CPU_WR/DMA_WR)

    //

    EMIF1ConfigRegs.EMIF1ACCPRT0.ALL = 0x0;

    if (emif1ConfigRegs.EMIF1ACCPRT0.ALL!= 0x0)

    ErrCount++;

    //

    //提交与保护相关的配置。 直到该位保持不变

    //设置 EMIF1ACCPROT0寄存器的内容不能更改。

    //

    EMIF1ConfigRegs.EMIF1COMMIT.ALL = 0x1;

    if (emif1ConfigRegs.EMIF1COMMIT.ALL!= 0x1)

    ErrCount++;

    //

    //锁定配置,使 EMIF1COMMIT 寄存器不能更改

    //任何更多。

    //

    EMIF1ConfigRegs.EMIF1LOCK.ALL = 0x1;

    if (emif1ConfigRegs.EMIF1LOCK.ALL!= 1)

    ErrCount++;

    层化5:

    我看到 WI 脉冲在 CAS 收到读取请求后变为低电平... 时序图显示它保持高电平?  虽然这似乎不会引起任何问题、但问题更多是该器件为什么会在读取周期中生成低电平?  这是否与写入周期上的视在双宽度脉冲有关? 这是否与我看到的寄存器差异(T_RC 和 T_RFC)的设置相关、以便导致双宽度脉冲的任何因素也可能是我们在读取周期中看到第二个周期的原因?

    谢谢。

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

    尊敬的 Rob:

    很高兴知道您已使其正常工作。

    [引述]

    分层1:

    为什么设置引脚94?  在表7-8中、引脚94现在具有 EMIF 特定的功能...  实际上、在我们的电路板上、我们为 GPIO94... [/报价]

    无需 GPIO94。 您可以将其用于所需的任何其他函数。

    [引述]密化2:[/引述]

    正如我在前面的一篇文章中提到的、GPIO 寄存器的输入选择与引脚是否用作 EMIF 无关。 因此该部件是冗余的。

    [引述]密化3:[/引述]

    由于该数字是60、 我们应该对值5或更高的值进行编程。 在这种情况下、我们已经对6进行了编程、这是可以的、 但即使是5也应该起作用。

    [引述]

    分层4:

    设置了保护寄存器?  我假设由于 One 寄存器看起来像 Set once 功能、这里的想法是将这些设置锁定在器件中、这很可能是因为一旦分配了 SDRAM、您就不会希望它意外更改...  因此、我们不必对其进行设置、它只是可选的。 [/报价]

    没错。 这是可选配置。

    [引用]分层5:我看到 We 脉冲在 CAS 收到读取请求后变为低电平... 时序图显示它保持高电平?  虽然这似乎不会引起任何问题、但问题更多是该器件为什么会在读取周期中生成低电平?  这是否与写入周期上的视在双宽度脉冲有关? 这是否与我看到的寄存器差异(T_RC 和 T_RFC)的设置相关、以便导致双宽度脉冲的任何因素也可能是我们在读取周期中看到第二个周期的原因? [/报价]

    我认为这是读取后的突发终止命令(写入也是如此)。 请注意,对于 SDRAM,最大突发量为1次访问(16位 SDRAM 设备的32位访问除外,其中将为2),因此每次访问后都将出现突发终止命令。

    此致、

    Vivek Singh