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.

[参考译文] LAUNCHXL2-570LC43:EMIF SDRAM 数据损坏

Guru**** 2468460 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/672605/launchxl2-570lc43-emif-sdram-data-corruption

器件型号:LAUNCHXL2-570LC43

好的、我有以下问题。 我使用 EMIF SDRAM 存储数据。 当我每1000ms 向 SDRAM 写入数据一段时间时、一切都正常。 但有时会发生数据损坏,如下所示:

这是什么?

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

    您好、Roman、

    您是否意味着写入的数据与回读数据不匹配? 请执行另一项测试:

    1.禁用高速缓存:_cacheDisable_()

    2.将一组32位字写入 SDRAM:我使用地址作为示例代码中的数据

    void WRITW32BIT_ADR (unsigned int Start_Address、 unsigned int No_for_words)

      unsigned int *地址 =(unsigned int *) Start_Address;

      while (No_of _words > 0) {

        *地址++= Start_Address++;

        NO_NO_ON_TO_CES--;

      }

    3.读回这些数据,并检查它们是否相互匹配

    unsigned int check_emif_memory_32bit_adr (unsigned int Start_Address、unsigned int No_Of_words)

     unsigned int ReadPattern;
     unsigned int *地址=(unsigned int *) Start_Address;

     while (NO_Of _words > 0)
     {
       ReadPattern =*地址++;
       if (ReadPattern!= Start_Address)
       {
        返回(Start_Address);
       }   
       NO_NO_ON_TO_CES--;
       START_Address++;
     }
     返回(0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的意思是、有时回读数据不匹配、但现在始终如此。 85%的匹配次数。 但是、有时所有 EMIF 存储器(我的数据未填充)都使用奇怪的数据填充(屏幕截图)。

    1.当我使_cacheDisable()时;EMIF 完全停止写入数据。

    EMIF 的回读和写操作每次都正常。 但有时某些寄存器会被这些奇怪的数据覆盖。 它并不总是相同的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Roman、

    如果缓存被启用并且 SDRAM 被配置为写回(MPU)、那么数据首先被写入缓存(32kB)。 SDRAM 写操作不会每次更新 SDRAM 内容。

    SDRAM 的 EMIF 配置参数(tRCD、TRC 等)应与 SDRAM 数据表中定义的值匹配。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是用于 HDK (IS42S1640)上的 SDRAM 的 SDRAM 配置。

    void EMIF_SDRAM_StartupInit (void)

    /*用户代码开始(11)*/

    /*用户代码结束*/

    易失性 uint32缓冲器;

    /*过程 B 第1步: 假定在启动时配置 EMIF 时钟频率*/

    /*过程 B 步骤2: 对 SDTIMR 和 SDSRETR 进行编程以满足 SDRAM 器件的要求*/

    emifREG->SDTIMR =(uint32)((uint32) 2U << 27U)|

     (uint32)((uint32) 0U << 24U)|

     (uint32)((uint32) 0U <<23U)|

     (uint32)((uint32) 0U << 20U)|

     (uint32)((uint32) 0U << 19U)|

     (uint32)((uint32) 0U << 16U)|

     (uint32)((uint32) 1U <<12U)|

     (uint32)((uint32) 2U <<8U)|

     (uint32)((uint32) 0U << 7U)|

     (uint32)((uint32) 0U << 4U)|

     (uint32)((uint32) 0U << 3U);

    emifREG->SDSRETR =(uint32) 2U;

    /*程序 B 步骤3: 对 SDRCR 的 RR 场进行编程以提供200us 的初始化时间*/

    emifREG->SDRCR = 1605U;

    /*过程 B 步骤4: 将 SDRCR 编程为触发初始化序列*/

    /**- 登记册的一般清零

    *  -用于 nm 设置16位数据总线

    *  -cas 延迟

    *  -BIT11_9CLOCK、以允许写入 cl 字段

    *  -选择组

    *  -设置页面大小

    *

    emifREG->SDCR =(uint32)((uint32) 0U << 31U)|

     (uint32)((uint32) 1U <<14U)|

     (uint32)((uint32) 2U <<9U)|

     (uint32)((uint32) 1U <<8U)|

     (uint32)((uint32) 2U << 4U)|

     (uint32)((uint32) elements_256);

    /*过程 B 步骤5: 读取 SDRAM 内存位置会导致处理器等待 SDRAM 初始化完成*/

    缓冲器      =* ptr;

    /*阻止优化*/

    缓冲器      =缓冲器;

    /*过程 B 步骤6: 将 RR 字段编程为 SDRAM*/的默认刷新间隔

    emifREG->SDRCR = 585U;

    /*将 EMIF 置于自刷新模式以进行时钟更改      *

    /*只能写入 SDCR 的高字节以避免    */

    /*第二个初始化序列                *

    /*字节地址取决于字节序(LE 为0x3U、BE32为0x00)*/

       *((unsigned char *)(&emifREG->SDCR)+ 0x0U)= 0x80;

    /*用户代码开始(12)*/

    /*用户代码结束*/