当前位置:首页 > 技术分析 > 正文内容

嵌入式实操——基于RT1170 使能SEMC配置SDRAM功能(八)

ruisui884个月前 (01-14)技术分析32

本文主要是通过迁移的思维,记录本人初次使用NXP MCUXpresso SDK API进行BSP开发

MCUXpresso SDK SEMC API 接口链接
  在MCUXpresso SDK 框架下提供了对SEMC DDR进行操作的接口。
学习链接:https://community.nxp.com/t5/MCUXpresso-Community-Articles/i-MX-RT-memory-validation/ba-p/1130828

1. 首先阅读原理图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qTWOXGYP-1616410062182)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/6057feda1d181.png)]

DDR芯处使用IS42S32800J-6BLA1从手册上可以看得出来该芯片支持的最大工作时钟为166Mhz.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySJKUJ2a-1616410062187)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/6057ffa173d6b.png)]

但是从MCU的手册上可以看出其支持的最大速率为200Mhz.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CBTG5s3-1616410062191)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60580129bcfb3.png)]

2. SDK api 应用

2.1 引脚配置

引脚复用配置

2.2 时钟配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-75JlQGrZ-1616410062196)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/6058272b304cd.png)]

从上图可以看到时钟源从SYM_PLL2_528Mhz至SYS_PLL2_PFD1(594Mhz)再通过4分频获取148.5MHz的时钟。
相关的配置代码如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f82yVIHQ-1616410062201)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/6058267a981aa.png)]

2.3 外设配置

对DDR的初始化,还是需要有前置知识的,了解DDR的工作时钟、时序相关知识,以及初始化的状态机。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rb44zg8B-1616410062204)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60582a0331852.png)]

进入SEMC DDR的配置界面,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lc7tfEvK-1616410062208)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60582a2f3707f.png)]



在这里插入图片描述

第一,需要选择DDR的时钟源及其频率

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L13QIjQ7-1616410062210)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60582b1a49ef6.png)]

第二,需要DDR的数据锁存模式,我们选择DQS模式。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(img-6PpdiigO-1616410062212)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60582afe564ca.png)]

第三、需要配置片选信号,这个和硬件设计相关

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBB5pDrd-1616410062214)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60582b7bc8b18.png)]

第四、需要配置内存的物理起始位置,这个和MCU的地址分配相关。


第五、需要配置内存的容量,和所选的SDRAM芯片容量保持一致。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5YFmIFn-1616410062218)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60582c0e1cf83.png)]

第六、配置SDRAM数据线的宽度及突发长度,数据宽度从原理图上可以看出来。突发长度可以从SDRAM手册上找到。




第七、配置列地址线的个数及CAS。列地址线的个数可以从手册上找出来,CAS可以选择2或者3也是在手册上的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OQ2SnkBN-1616410062223)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60582fb3e39ec.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PdpxZ9Ru-1616410062224)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60582f1dd4655.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4jbMJ2h-1616410062226)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60583026eac64.png)]

第八、预充电(Precharge)至有效(active)的等待时间tRP,在166MHz,从手册上查得该数值>=18




第九、Active Command To Read / Write Command Delay Time (tRCD)



[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qUn0WMOr-1616410062234)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60583551c0021.png)]

第十、刷新恢复时间 取tRFC/tXSR当中的最大值。





[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5kHX6uD-1616410062239)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/6058488c43a50.png)]

第十一、写恢复(write recovery)时间 tWR

在这里插入图片描述



在这里插入图片描述

第十二、CKE off minimun time, 一般取tRAS




第十三、active to precharge, 取tRAS



在这里插入图片描述

第十四、self refresh reovery time 自刷新恢复时间,取tXSR




第十五、refresh to refresh wait time 刷新至刷新的等待时间,取tRC.




第十六、active to active wait time 有效至有效的等待时间, 取tRC = tRAS + tRP = tRCD + tWR + tRP


第十七、prescaler timer period, 取160个tCLK时钟周期

160 *  1000000000 / semc_clk = 160 * 1000000000 / 148500000


第十八、sdram idle time 必须小于 tRAS, 而tRAS的最大值为100000ns

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfv4jMU3-1616410062262)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/605861ba9e04c.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SIgHIUB7-1616410062265)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60585419c8d2c.png)]

且有一个限制条件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KsOMMcJT-1616410062267)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/605856c4cc5ee.png)]

周期为 tPrescalePeriod_Ns = 160*100000000/semc_clk
ITO* 160  * 1000000000 / 148500000  < 100000,
ITO  < 92.812

ITO取值意义如下,所以我们取[1,92]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Qzfhzhx-1616410062269)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/60585a5b0f6c3.png)]

第十九:refresh timer period /refresh upgent period, 从手册上可以看到刷新4096次,总用耗时64ms,每次的刷新时间为 64*1000000/4096,两者相同值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYL1SxUl-1616410062270)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-22/6058610be8c32.png)]

2.4 验证测试

SDRAM 时钟配置成148.5Mhz:

Index: D:/svn/SDK_2.8.0_MIMXRT1170-EAR3/boards/easyarm-rt1170-revb/driver_examples/semc/sdram/cm7/clock_config.c
===================================================================
--- D:/svn/SDK_2.8.0_MIMXRT1170-EAR3/boards/easyarm-rt1170-revb/driver_examples/semc/sdram/cm7/clock_config.c    (revision 7)
+++ D:/svn/SDK_2.8.0_MIMXRT1170-EAR3/boards/easyarm-rt1170-revb/driver_examples/semc/sdram/cm7/clock_config.c    (working copy)
@@ -136,7 +136,7 @@
     CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd1, 16);
     /* Configure Semc using SysPll2Pfd1 divided by 3 */
     rootCfg.mux = kCLOCK_SEMC_ClockRoot_MuxSysPll2Pfd1;
-    rootCfg.div = 3;
+    rootCfg.div = 4;
     CLOCK_SetRootClock(kCLOCK_Root_Semc, &rootCfg);
 #endif

最终针对148.5Mhz时钟的SDRAM配置代码如下所示:

status_t BOARD_InitSEMC(void)
{
    semc_config_t config;
    semc_sdram_config_t sdramconfig;
    uint32_t clockFrq = EXAMPLE_SEMC_CLK_FREQ;

    /* Initializes the MAC configure structure to zero. */
    memset(&config, 0, sizeof(semc_config_t));
    memset(&sdramconfig, 0, sizeof(semc_sdram_config_t));

    /* Initialize SEMC. */
    SEMC_GetDefaultConfig(&config);
    config.dqsMode = kSEMC_Loopbackdqspad; /* For more accurate timing. */
    SEMC_Init(SEMC, &config);

    /* Configure SDRAM. */
    sdramconfig.csxPinMux           = kSEMC_MUXCSX0;
    sdramconfig.address             = 0x80000000;
    sdramconfig.memsize_kbytes      = 32 * 1024; /* 32MB = 32*1024*1KBytes*/
    sdramconfig.portSize            = kSEMC_PortSize32Bit;
    sdramconfig.burstLen            = kSEMC_Sdram_BurstLen8;
    sdramconfig.columnAddrBitNum    = kSEMC_SdramColunm_9bit;
    sdramconfig.casLatency          = kSEMC_LatencyThree;
    sdramconfig.tPrecharge2Act_Ns   = 18; /* Trp 18ns */
    sdramconfig.tAct2ReadWrite_Ns   = 18; /* Trcd 18ns */
    sdramconfig.tRefreshRecovery_Ns = 70; /* Use the maximum of the (Trfc , Txsr). */
    sdramconfig.tWriteRecovery_Ns   = 12; /* 12ns */
    sdramconfig.tCkeOff_Ns =
        42; /* The minimum cycle of SDRAM CLK off state. CKE is off in self refresh at a minimum period tRAS.*/
    sdramconfig.tAct2Prechage_Ns       = 42; /* Tras 42ns */
    sdramconfig.tSelfRefRecovery_Ns    = 70;
    sdramconfig.tRefresh2Refresh_Ns    = 60;
    sdramconfig.tAct2Act_Ns            = 60;
    sdramconfig.tPrescalePeriod_Ns     = 160 * (1000000000 / clockFrq);
    sdramconfig.refreshPeriod_nsPerRow = 64 * 1000000 / 4096; /* 64ms/8192 */
    sdramconfig.refreshUrgThreshold    = sdramconfig.refreshPeriod_nsPerRow;
    sdramconfig.refreshBurstLen        = 1;
    sdramconfig.delayChain             = 2;
   sdramconfig.tIdleTimeout_Ns        = 92;

    return SEMC_ConfigureSDRAM(SEMC, kSEMC_SDRAM_CS0, &sdramconfig, clockFrq);
}

测试结果如下所示:

 SEMC SDRAM Example Start!

 EXAMPLE_SEMC_CLK_FREQ:  148500000 

 SEMC SDRAM Write 32 bit Start, Start Address 0x80000000, Data Length 8388607 !

 SEMC SDRAM Read 32 bit Data Start, Start Address 0x80000000, Data Length 8388607 !

 SEMC SDRAM Write 32 bit Start, Start Address 0x80000001, Data Length 8388607 !

 SEMC SDRAM Read 32 bit Data Start, Start Address 0x80000001, Data Length 8388607 !

 SEMC SDRAM Write 32 bit Start, Start Address 0x80000002, Data Length 8388607 !

 SEMC SDRAM Read 32 bit Data Start, Start Address 0x80000002, Data Length 8388607 !

 SEMC SDRAM Write 32 bit Start, Start Address 0x80000003, Data Length 8388607 !

 SEMC SDRAM Read 32 bit Data Start, Start Address 0x80000003, Data Length 8388607 !

 SEMC SDRAM 32 bit Data Write and Read Compare Succeed!

 SEMC SDRAM Write 16 bit Start, Start Address 0x80000000, Data Length 16777215 !

 SEMC SDRAM Read 16 bit Data Start, Start Address 0x80000000, Data Length 16777215 !

 SEMC SDRAM Write 16 bit Start, Start Address 0x80000001, Data Length 16777215 !

 SEMC SDRAM Read 16 bit Data Start, Start Address 0x80000001, Data Length 16777215 !

 SEMC SDRAM 16 bit Data Write and Read Compare Succeed!

 SEMC SDRAM Memory 8 bit Write Start, Start Address 0x80000000, Data Length 33554432 !

 SEMC SDRAM Read 8 bit Data Start, Start Address 0x80000000, Data Length 33554432 !

 SEMC SDRAM 8 bit Data Write and Read Compare Succeed!

 SEMC SDRAM Example End.

4. 总结

默认DDR工作时钟为198Mhz,本文将其修改为148.5Mz.主要是针对SDRAM各参数如何从芯片中获取,取值的约束条件做了详细说明,至于各参数的具体含义可以从DDR的协议规范当中找到,或者芯片手册当中学到。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/260.html

标签: threebsp
分享给朋友:

“嵌入式实操——基于RT1170 使能SEMC配置SDRAM功能(八)” 的相关文章

Linux发行版Debian推出12.2及11.8版本,修复多个安全问题

IT之家 10 月 9 日消息,Debian 是最古老的 GNU / Linux 发行版之一,也是许多其他基于 Linux 的操作系统的基础,包括 Ubuntu、Kali、MX 和树莓派 OS 等,近日 Debian 推出了 12.2 和 11.8 版本,主要修复了多个安全问题。▲ 图源 Debia...

Ubuntu Linux 24.04 LTS发行版现已开放下载

IT之家 4 月 25 日消息,Ubuntu 24.04 长期支持版(LTS)“Noble Numbat” 现已发布,有需要的用户请通过官网下载发行版 ISO 镜像进行安装。Ubuntu 24.04 采用了 Linux 6.8 内核,可利用 Netplan 在桌面上配置网络连接,还配备了现代化的桌面...

java调用API操作GitLab

最近需要在一个WEB项目中集成GitLab,用到了GitLab的API操作,在网上找了很久都是说直接调用GitLab的Http接口,而且API官方只有javadoc没有其它说明文档,特别记录下,以备查询。这里采用Token的认证方式,因此需要先登陆GitLab新建一个Token,创建方式如下:创建完...

有效地简化导航-Part 1:信息架构

「四步走」——理想的导航系统要做一个可用的导航系统,网页设计师必须按顺序回答以下4个问题:1. 如何组织内容?2. 如何解释导航的选项?3. 哪种导航菜单最适合容纳这些选项?4. 如何设计导航菜单?前两个问题关注构建和便签内容,通常称为信息架构。信息架构师通常用网站地图(site map diagr...

别让“跑焦”毁所有!仅需这一项设置,即可显著改善镜头对焦精度

我常常会收到一些摄影爱好者的私信,也一直在努力的帮助大家解决更多摄影中常见问题。在我收到的所有问题中。有一个问题是最麻烦的,那就是“为什么我的图像看起来模糊?”。这个问题几乎每个人都遇到过,究其原因可以说是多种多样相对复杂。起初我一直认为是对焦问题所导致,也就有了我之前所写的“后按对焦”以及“对焦模...

学前端,这30个CSS选择器,你必须熟记

你学会了基本的id,class类选择器和descendant后代选择器,然后就觉得完事了吗?如果这样,你就会错过许多灵活运用CSS的机会。虽然本文提到的许多选择器都属于CSS3,并且只能在现代的浏览器中使用,但学会这些是大有好处的。什么是CSS选择器呢?每一条css样式定义由两部分组成,形式如下:[...