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.

[参考译文] CCS/TMS570LS3137:SDRAM 问题

Guru**** 2328790 points
Other Parts Discussed in Thread: TMS570LS3137, HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/587600/ccs-tms570ls3137-sdram-issue

器件型号:TMS570LS3137
主题中讨论的其他器件: HALCOGEN

工具/软件:Code Composer Studio

您好!

我是嵌入式系统编程的新手。 我有一个 TMS570LS3137 HDK、并且尝试访问 SDRAM。 我编写一个简单的程序来检查是否可以使用 SDRAM。

volatile uint16_t * p =(volatile uint16_t *) 0x8000000;

for (int i=0;i<32;i++)

*p=(uint16_t) 0x0030 + I;

P++;

sciSend_32bitdata (scilinREG、*p);

sciSend_32bitdata (scilinREG、p);

在 CCS 中、我使用终端、结果为:

值:00000030地址:8000000

值:00000030地址:800002

值:00000032地址:800004.

值:00000032地址:800006.

值:00000034地址:800008

值:00000034地址:80000010

它将相同的值保存2次。 我可以做些什么来解决这个问题? 我确信我已经很好地完成了所有配置、我启用了驱动程序、在 PINMUX 选项卡中启用了 EMIF、关闭了 EMIF 时钟、在 EMIF 选项卡中、我编写了与 ISSI SDRAM 数据表相同的所有时序、尝试了所有时钟频率、您能不能让我解决这个问题? 会出什么问题?

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

    您已将存储器指针设置为16位字、并且正在递增指针、该指针将递增1 16位工作地址位置。 即、按2个地址位置。 但是、由于器件采用32位架构、您已将循环计数器"i"内嵌为 int、该 int 本身将为32位。 您还将调用 sciSend_32bitdata (scilinREG、*p)、它将一次发送32位。 尝试将指针初始化为 uint 指针(32位指针)、并确保代码中使用的类型一致。

    您还提到了 EMIF 初始化。 您的代码仅访问从基地址0x8000000开始的标准 SRAM。 您发布的代码中没有与 EMIF 相关的内容、因此它不会影响您所做的工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、

    感谢您的快速回复。 正如我所说、我是嵌入式系统的新手、我做了与此帖子相关的所有事情;

    e2e.ti.com/.../260952

    您能否检查该帖子。 我使一切都相似、遇到相同的问题、并做了相同的事情来解决它。 这个用户已经解决了他在改变频率和时序方面的问题。 我检查了我的频率、SDRAM 的数据表以及有关 SDRAM 使用情况的每篇 TMS570文章。 我知道 ISSI 42S16400F SDRAM 有16位总线、当我将指针设置为32位指针时、我在终端中看到的所有值都变为零。 此外、我在存储器视图中检查了地址、我看到每个地址都具有相同的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    用户好!

    在您提供链接的主题中、Anthony 发布了一个示例项目、您是否能够让他的示例正常工作、然后您可以从中进行调整。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、

    Anthony 仅发布了 EMIF 配置、而不是完整的项目。 我想我应该找到一个示例来检查问题是我的设备还是其他设备。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    用户好!

    我仔细看了您的示例、我认为问题是第一个 sciSend_32bitdata、因为它接收到*p 作为要发送的32位数据的地址。 即、sciSend_32bitdata 函数在仅为16位时尝试以32位宽存储器位置访问 EMIF。 您能否更改 SEND 函数、使其访问写入数据类型? 或者、另一个选项是在常规器件 SRAM 中创建一个临时位置、在该位置、您可以在调用 sciSend_32bitdata 之前将 EMIF SRAM 的内容复制到中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    用户好、

    使用此代码:

    unsigned short * Addr =(unsigned short *) Start_Address;//0x8000_0000
    对于(data=0;data<32;data+2){
    *Addr++=(DATA & 0xFFFF0000)>>16;//big endianess
    *地址++=(DATA+1和0x0000FFFF);


    写入数据后、在 CCS 中打开存储器浏览器、并检查 SDRAM 中的数据。

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

    QJ Wang、您好!

    首先感谢您的关注、在我为解决问题做了一切之后、我决定更新我的 HALCoGen 程序、因为我认为版本3存在一些有关 EMIF 驱动程序的错误。 我安装了版本4并运行了我的程序、它工作正常。 但我对某些东西很好奇。

    1.如果我写一个程序并且 RAM 已满、它会自动使用 SDRAM 吗? 如果它不是我需要做什么?

    谢谢、此致、

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

    QJ Wang、您好!

    我在写有关我询问的问题、我发现如何在 RAM 已满时使我的器件自动使用 SDRAM。 在 sys_link.cmd 中、我像定义实际 RAM 一样定义了 SDRAM、现在我可以按照我想要的方式使用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Aslan、

    我很高兴您能够更正 Halcogen 工具更新的问题、是的、从外部 EMIF 添加扩展存储器范围将允许在编译时使用/分配 RAM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、

    谢谢、我也有一个问题。 我执行所有配置并在 RAM 已满时运行程序、它自动使用 SDRAM、这正是我要做的、但现在我面临一个不同的问题。 我定义了长尺寸数组、以测试内存是否正常工作。 当我执行此操作时、我运行程序并检查内存浏览器、我会看到类似的内容;

    代码

    易失性 uint32_t testArray[100]={0};
    volatile uint32_t testArray2[1000]={0};

    for (int i=0;i<1000;i++)

    testArray[i]= i;
    testArray2[i]= i;

    --------------------------------------


    testArray[0]= 0
    testArray[1]=1
    testArray[2]=2

    testArray2[0]=100
    testArray2[0]=101
    testArray2[0]=102
    --------------------------------------

    testArray2的 testArray 必须具有相同的值、但不具有相同的值。 我认为该程序无法进行良好的内存分配、或者解决了问题。 会出什么问题?

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

    EMIF 连接器上 SRAM 的16位访问限制是否存在问题? 即、对外部 RAM 的访问被限制在16位、否则会出现错误行为。 分配 RAM 时、请确保 EMIF 上的 SRAM 只显式使用16位值。 这可能是允许编译器为您决定这一点的问题、因为它无法正确了解哪些 RAM 限制为16位、并且只对其使用16位访问。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、

    我知道外部 RAM 具有16位访问限制、因此我也尝试了使用 uint16的程序、但它没有解决我的问题。

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

    我解决了在 EMIF.c 中更改行时出现的问题、
    我在这里写这个、如果有人有相同的问题、他/她可以解决这个问题。 别忘了仅使用16位值!

    在 EMIF.c 中、有一个函数在启动时初始化 EMIF、并且该函数的最后一行有此代码、

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

    如果有人面临相同的问题、他/她必须使用以下方法进行更改;

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

    谢谢、此致、

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

    阿斯兰

    您是否注意到 testArray 只有100个元素、并且您的循环正在索引到超过该边界? testArray 的有效索引为0至99

    由于编译器 在 第一个数组之后分配了 testArray2、因此当您超过索引99时、您的循环会覆盖 testArray2元素。 因此 testArray2[0]的值为100。

    Joe

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

    我不认为是这样、我也遇到了同样的问题、只有一个数组。 例如

    volatile uint16 testArray[500000];

    对于(i=0;i<500000;i++)

    testArray[i]= i;



    我对其进行调试并逐步检查内存浏览器、一切都会正常增加。 当 i = 256时、testArray[256]必须等于256、但在某种程度上 testArray[0]也等于256。 testArray[1]=257...
    (笑声)

    无论如何,我已经解决了这一问题,就像我之前提到的那样。

    谢谢、此致、

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

    阿斯兰

    正如 Jo 提到的、如果它真正代表了您在器件上编码和执行的内容、这将是一个错误。

    [引用 user4958934"]

    易失性 uint32_t testArray[100]={0};
    volatile uint32_t testArray2[1000]={0};

    for (int i=0;i<1000;i++)

    testArray[i]= i;
    testArray2[i]= i;
    }[/报价]

    从代码片段中可以看出、您明显超出了为 testArray[100]分配的内存、因为您在 for 循环中复制1000个元素。

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

    问题与 EMIF.c 文件有关。 如果您还记得、我告诉过我将 HALCoGen 更新为4.0。 现在我要下载4.06.01版、该版本中的 EMIF.c 文件可以正常工作、没有该错误。

    谢谢、此致、

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

    我使用以下代码编辑了代码:

    #define testSize 0x00380000

    uint16 testArray[testSize];
    int i;

    for (i=0;<testSize;i++))

    testArray[i]= i;


    我正在检查内存浏览器、我看到 testArray 元素正在增加0到0xFFFF、但寻址非常令人困惑。 例如、testArray 从地址0x8000000000开始、大小为0x00380000、每个元素包含16位数据(2个字节)、因此它需要在0x80700000 (0x00380000 * 2)结束、但当我检查内存浏览器时、我看到这一点;


    0x80000000 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A
    ……………… ................................................................................................................................
    ……………… FFF9 FFFA FFFB FFFC FFFD FFFE FFFF 0000 0001 0002 0003
    ……………… ................................................................................................................................
    ……………… ................................................................................................................................
    ……………… E67C 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
    ……………… ................................................................................................................................
    ……………… ................................................................................................................................
    ……………… 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A
    ……………… ................................................................................................................................
    ……………… FFF9 FFFA FFFB FFFC FFFD FFFE FFFF 0000 0001 0002 0003
    ……………… FFF5 FFF6 FFF7 FFF8 FFF9 FFFA FFFB FFFC FFFD FFFE FFFF
    0x80700000 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A
    …………. 000b 000c 000d 000E 000f 0010 0011 0012 0013 0014 0015


    有时数据在起始地址和结束地址之间损坏、有时值变为零、然后再次变为正常。 当 i=9时、我会逐步观察它是否中断了循环。 我认为它会随机地将数据写入内存、因此我使用指针而不是像这样的数组来尝试代码;

    #define testSize 0x00380000

    volatile uint16 * p =(volatile uint16 *) 0x8000000;
    int i;

    for (i=0;<testSize;i++))

    *p= i;
    P++;


    我对此也有同样的问题。 我真的很困惑、我不知道问题是什么。 是否有人可以帮助我解决这个问题? 我在等你的建议。 可能出什么问题了?

    谢谢、此致、

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

    是否有人可以帮助我解决这个问题? 如果有人可以解决问题、我可以发送项目。

    谢谢、此致、

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

    从您发布的恢复数据中可以看出、损坏是在计数结束时发生的。 您能否提供有关该值的更多详细信息、例如存储该值的元素编号和地址? 它位于某种类型的页边界还是地址边界?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    数据从地址0x8000000开始、当我在地址0x8000000处写入内容时、所有内容都被复制到地址0x80200000 (距起始地址2MB)、0x80400000 (距起始地址4MB)以及0x80600000 (距起始地址6MB)。 我认为程序或 MCU 在组之间进行某种类型的镜像。 我知道 SDRAM 有4个组、它是8 MB、所以每组必须有2 MB。 是否有可以关闭镜像的设置或是否是错误?

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

    由于您的原始问题已得到解决、并且您已经有另一个线程在处理此镜像问题、因此让我们关闭此线程、并使用 e2e.ti.com/.../2164823上的新线程 来获得新问题的答案。