【认识 i.MX RT】RT1060 外挂 SDRAM

        前一篇博文介绍了RT1060 外挂 Nor Flash 的设计,接下来我们再来看看RT1060 的外挂 SDRAM 是如何使用的吧。

       
首先我们来看RT1062 内部集成的RAM。RT1062 内部集成了 1MB 的内存(On-chip RAM,OCRAM),其中 512KB 可以配置为紧耦合内存(Tightly Coupled Memory,TCM)。这些 RAM 空间对于一些应用就够用了,如果还是不够用,那么我们可以通过 SEMC 接口控制器外扩 RAM。

        SEMC 全名叫 Smart External Memory Controller,是一种能支持多个标准的、并行的存储控制器。支持的并行存储器种类包括:SDRAM、NOR Flash、SRAM、NAND Flash 等,还可兼容 8080 显示器接口。SEMC 最大工作频率可以达到 166MHz。可通过两种总线方式来访问外部存储器:AXI总线和 IP 总线。对于控制 SDRAM,SEMC 的数据总线支持 8-bit 或 16-bit 两种模式,有 4 根片选信号线,每片 SDRAM 的容量可以达到 512Mb。

        SEMC 的结构图如下所示:

        下面我们来看看 RT1062 与 SDRAM 的硬件连接。我手上有一块 RT1062 的板子,它的 SDRAM 采用的是 Winbond 的 W9825G6KH-6I。这颗 SDRAM 的存储容量是 32MB,16-bit 总线,最高工作频率为 166MHz。那么,RT1060 与 W9825G6KH-6I 硬件是如何连接的?我们来看看它们的管脚对应关系:


        RT1062 的原理图如下所示:


        W9825G6KH 的原理图如下所示:


        在 PCB Layout 时,需要注意合理布线,要做信号线的等长处理,长度差不大于 ±50mil。信号线的阻抗匹配在 50 Ω 左右。

        接下来,我们再来看看 RT1062 驱动外部 SDRAM 的软件部分是怎么实现的。我分别从时钟配置、管脚配置、功能初始化配置以及数据传输这几个部分来说明。

  1. 时钟配置(详见 RT1060 参考手册的第 14 章 Clock Control Module(CCM) )

        SEMC 的时钟配置主要是由 Clock Control Module(CCM) 来调配。我们可以从 CCM Clock Tree 找出 SEMC 的时钟来源,下图截取了 CCM Clock Tree 的 SEMC 部分(参考 RT1060 参考手册中的 Figure 14-2. Clock Tree)。


        从上图可以看出,SEMC 的时钟源可以选择 PLL2(系统 PLL,528MHz)的 PFD2 或者 PLL3(USB1 PLL,480MHz) 的 PFD1,也可以直接选择 PERIPH CLK。其中,PFD(Phase Fractional Dividers)是 System PLL 和 USB1 PLL 的输出时钟,PFD 频率的计算公式为:FVCO * 18 / N,其中 N 的取值范围:12~35。所以从上图中我们可以配置出 SEMC 的工作频率。比如,要配置 166MHz 时,时钟源选取 PLL2 的 PFD2 ,则设置如下:

              ①  PFD2 的频率 = FVCO * 18 / N = 528 * 18 / 29 = 327.7 MHz;

              ②  CCM_CBCDR 寄存器设置:SEMC_CLK_SEL(bit6) = 1,SEMC_ALT_CLK_SEL(bit7) = 0,SEMC_PODF(bit18-16) = 1;

              则 SEMC 频率 = FPFD2 / (PODF+1) = 327.7 / 2 = 163.86 MHz。

  1. 管脚配置(详见 RT1060 参考手册的第 11 章 IOMUX Controller)

        SEMC 的管脚配置要做两步:

              第一步是把相应的 IO 映射到 SEMC 的相应功能上,比如把 GPIO_EMC_00(管脚号: E3)映射到 SEMC_DATA00 上,则设置 IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_00(寄存器地址:0x401F8014)的 MUX_MODE(bit[2:0]) = 0。


              第二步是设置管脚的配置,比如设置上拉/下拉电阻、开漏、转换速度等等。具体请参考 RT1060 的参考手册。



  1. 功能初始化配置(详见 RT1060 参考手册的第 25 章 Smart External Memory Controller (SEMC))

        这里主要是对 SEMC 模块的初始化,包括时钟使能、电源使能、模块使能、SDRAM 参数配置等等。SDRAM 参数配置的数据要查看 SDRAM 的数据手册得出。具体的设置可参考 SDK -> driver_examples -> SEMC 例程里的 BOARD_InitSEMC() 函数。

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_PortSize16Bit;
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 = 67; /* 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 = 67;
sdramconfig.tRefresh2Refresh_Ns = 60;
sdramconfig.tAct2Act_Ns = 60;
sdramconfig.tPrescalePeriod_Ns = 160 * (1000000000 / clockFrq);
sdramconfig.refreshPeriod_nsPerRow = 64 * 1000000 / 8192; /* 64ms/8192 */
sdramconfig.refreshUrgThreshold = sdramconfig.refreshPeriod_nsPerRow;
sdramconfig.refreshBurstLen = 1;
return SEMC_ConfigureSDRAM(SEMC, kSEMC_SDRAM_CS0, &sdramconfig, clockFrq);
}

 

  1. 数据传输

        RT1060 可以通过 AXI 总线和 IP 总线两种方式访问 SDRAM。

        AXI 总线主要用于读/写数据,软件上只需要先定义一个指针指向 SDRAM 的地址(SDRAM 的首地址是:0x8000 0000)。读取指针地址上的数据即通过 AXI 总线读 SDRAM 数据。

        IP 总线既可以用于读/写数据,也可以做其它控制操作。这时需要使用 IP 命令来操作,SDRAM 的 IP 命令包括:READ(0X8)、WRITE(0X9)、MODESET(0XA)、ACTIVE(0XB)、AUTO REFRESH(0XC)、SELF REFRESH(0XD)、PRECHARGE(0XE)、PRECHARGE ALL(0XF)。

        以上是我对 RT1060 外挂 SDRAM 设计方面的一些理解,希望对有这方面了解需求的你有些帮助。如果要获得更详尽的信息,可以参考 NXP 官网的 RT1060 参考手册和 W9825G6KH 的数据手册。如果您还有更多的疑问,欢迎在下面评论区评论。

        在后续的博文中,我会继续写一些关于 RT1060 的设计笔记,请多多来大大通关注我哦。

参考资料

  1. i.MX RT1060 Processor Reference Manual - https://www.nxp.com.cn/products/processors-and-microcontrollers/arm-microcontrollers/i-mx-rt-crossover-mcus/i-mx-rt1060-crossover-mcu-with-arm-cortex-m7-core:i.MX-RT1060?tab=Documentation_Tab
  2. W9825G6KH Datasheet

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论