查看: 4070|回复: 1

[原创] 【野火i.MX RT1052】6.i.Maxrt1052之外部SDRAM(2)

[复制链接]
  • TA的每日心情
    擦汗
    2019-6-26 20:59
  • 签到天数: 235 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2018-6-7 18:29:54 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 小马哥-1650185 于 2018-6-7 18:41 编辑

    rt1052集成了外部存储控制器(SEMC) , SEMC 是针对高性能和低引脚数而优化的多标准内存控制器。 它可以在共享地址和数据引脚的同一应用中支持多个外部存储器。 支持的接口包括 SDRAM, NOR Flash, SRAM 和 NANDFlash 以及 8080 显示接口。  

    特性
        存储空间最多支持 9 个内存区;
     支持 AXI 从属接口, 8/16 位完全转移的写入和读取;
     支持 IP 总线接口,可进行内部配置寄存器访问;
     支持 SDRAM 接口,单个器件最高存储可达 512Mb;
     支持 NAND Flash 接口;
     支持 NOR Flash 接口,单个器件最高存储可达 128Mb;
     支持 SRAM 接口,单个器件最高存储可达 128Mb;
     支持 8080 显示接口;
     动态 I / O 共享,可同时启用多个外部存储设备;
     最多 5 个片选(CS)信号;
     能够通过单独的熔丝位禁用 SDRAM 和 NAND 控制器;
     支持 SRAM / NOR 器件的地址锁存使能。

    配置步骤:
     配置引脚复用功能;
     选择 SEMC 外设时钟源;
     配置外设时钟分频;
     配置 SEMC 选通模式;
     配置 SEMC 命令执行超时周期;
     配置总线超时周期;
     使能 SEMC 模块;
     利用 SEMC 初始化外部存储器件 。
    框图:
    QQ截图20180607183124.jpg
    例程首先需要初始化sdram
    1.     /* 初始化SDRAM */
    2.     if (SDRAM_Init() != kStatus_Success)
    3.     {
    4.         RGB_LED_COLOR_RED;
    5.         PRINTF("\r\n SEMC SDRAM Init Failed\r\n");
    6.     }
    复制代码

    通过函数SDRAM_Init()配置SDRAM时钟,初始化sdram的引脚功能,初始化SDRAM相关的SEMC配置
    1. status_t SDRAM_Init(void)
    2. {
    3.   
    4.   /* 配置SDRAM时钟 */
    5.   CLOCK_SetMux(kCLOCK_SemcMux, 1);
    6.   CLOCK_SetDiv(kCLOCK_SemcDiv, 2);

    7.   SDRAM_IOMUXC_MUX_Config();
    8.   SDRAM_IOMUXC_PAD_Config();
    9.   return SDRAM_SEMC_Config();
    10. }
    复制代码

    初始化SDRAM相关IOMUXC的MUX复用配置
    1. static void SDRAM_IOMUXC_MUX_Config(void)
    2. {
    3.   /* 所有引脚均不开启SION功能 */
    4.   /* DATA信号线DATA00~DATA15 */  
    5.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U);                                    
    6.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01, 0U);                                    
    7.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02, 0U);                                    
    8.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03, 0U);                                    
    9.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DATA04, 0U);                                    
    10.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DATA05, 0U);                                    
    11.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DATA06, 0U);                                    
    12.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DATA07, 0U);                                    
    13.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DATA08, 0U);                                    
    14.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DATA09, 0U);                                    
    15.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DATA10, 0U);                                    
    16.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DATA11, 0U);                                    
    17.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DATA12, 0U);                                    
    18.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DATA13, 0U);                                    
    19.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DATA14, 0U);                                    
    20.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DATA15, 0U);  

    21.   /* ADDR信号线ADDR00~ADDR12 */  
    22.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_SEMC_ADDR00, 0U);                                    
    23.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_10_SEMC_ADDR01, 0U);                                    
    24.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_11_SEMC_ADDR02, 0U);                                    
    25.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_12_SEMC_ADDR03, 0U);                                    
    26.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_13_SEMC_ADDR04, 0U);                                    
    27.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_14_SEMC_ADDR05, 0U);                                    
    28.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_15_SEMC_ADDR06, 0U);                                    
    29.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_16_SEMC_ADDR07, 0U);                                    
    30.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_17_SEMC_ADDR08, 0U);                                    
    31.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_18_SEMC_ADDR09, 0U);                                    
    32.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_23_SEMC_ADDR10, 0U);                                    
    33.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_19_SEMC_ADDR11, 0U);                                    
    34.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_20_SEMC_ADDR12, 0U);

    35.   /* BA0、BA1信号 */  
    36.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_21_SEMC_BA0, 0U);                                    
    37.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_22_SEMC_BA1, 0U);  

    38.   /* RAS、CAS信号 */  
    39.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_25_SEMC_RAS, 0U);                                    
    40.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_24_SEMC_CAS, 0U);   

    41.   /* WE、CS0信号 */  
    42.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_28_SEMC_WE, 0U);                                    
    43.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_29_SEMC_CS0, 0U);   

    44.   /* DM0、DM1信号 */  
    45.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_08_SEMC_DM00, 0U);                                    
    46.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_38_SEMC_DM01, 0U);   

    47.   /* CLK、CKE信号 */  
    48.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_26_SEMC_CLK, 0U);                                    
    49.   IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_27_SEMC_CKE, 0U);  
    50. }
    复制代码
    初始化SDRAM相关IOMUXC的PAD属性配置
    1. static void SDRAM_IOMUXC_PAD_Config(void)
    2. {
    3.   /* 所有引脚均使用同样的PAD配置 */
    4.    /* DATA信号线DATA00~DATA15 */  
    5.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_00_SEMC_DATA00, SDRAM_PAD_CONFIG_DATA);  
    6.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_01_SEMC_DATA01, SDRAM_PAD_CONFIG_DATA);                           
    7.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_02_SEMC_DATA02, SDRAM_PAD_CONFIG_DATA);                             
    8.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_03_SEMC_DATA03, SDRAM_PAD_CONFIG_DATA);                           
    9.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_04_SEMC_DATA04, SDRAM_PAD_CONFIG_DATA);                             
    10.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_05_SEMC_DATA05, SDRAM_PAD_CONFIG_DATA);                             
    11.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_06_SEMC_DATA06, SDRAM_PAD_CONFIG_DATA);                           
    12.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_07_SEMC_DATA07, SDRAM_PAD_CONFIG_DATA);  
    13.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_30_SEMC_DATA08, SDRAM_PAD_CONFIG_DATA);         
    14.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_31_SEMC_DATA09, SDRAM_PAD_CONFIG_DATA);                           
    15.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_32_SEMC_DATA10, SDRAM_PAD_CONFIG_DATA);                             
    16.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_33_SEMC_DATA11, SDRAM_PAD_CONFIG_DATA);                             
    17.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_34_SEMC_DATA12, SDRAM_PAD_CONFIG_DATA);                             
    18.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_35_SEMC_DATA13, SDRAM_PAD_CONFIG_DATA);                             
    19.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_36_SEMC_DATA14, SDRAM_PAD_CONFIG_DATA);                             
    20.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_37_SEMC_DATA15, SDRAM_PAD_CONFIG_DATA);                             
    21.   
    22.   /* ADDR信号线ADDR00~ADDR12 */               
    23.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_09_SEMC_ADDR00, SDRAM_PAD_CONFIG_DATA);                           
    24.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_10_SEMC_ADDR01, SDRAM_PAD_CONFIG_DATA);                             
    25.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_11_SEMC_ADDR02, SDRAM_PAD_CONFIG_DATA);                             
    26.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_12_SEMC_ADDR03, SDRAM_PAD_CONFIG_DATA);                             
    27.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_13_SEMC_ADDR04, SDRAM_PAD_CONFIG_DATA);                             
    28.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_14_SEMC_ADDR05, SDRAM_PAD_CONFIG_DATA);                             
    29.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_15_SEMC_ADDR06, SDRAM_PAD_CONFIG_DATA);                             
    30.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_16_SEMC_ADDR07, SDRAM_PAD_CONFIG_DATA);                             
    31.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_17_SEMC_ADDR08, SDRAM_PAD_CONFIG_DATA);                           
    32.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_18_SEMC_ADDR09, SDRAM_PAD_CONFIG_DATA);                           
    33.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_23_SEMC_ADDR10, SDRAM_PAD_CONFIG_DATA);  
    34.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_19_SEMC_ADDR11, SDRAM_PAD_CONFIG_DATA);                             
    35.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_20_SEMC_ADDR12, SDRAM_PAD_CONFIG_DATA);  
    36.   
    37.   /* BA0、BA1信号 */  
    38.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_21_SEMC_BA0, SDRAM_PAD_CONFIG_DATA);                             
    39.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_22_SEMC_BA1, SDRAM_PAD_CONFIG_DATA);                           
    40.   
    41.   /* RAS、CAS信号 */  
    42.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_25_SEMC_RAS, SDRAM_PAD_CONFIG_DATA);                          
    43.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_24_SEMC_CAS, SDRAM_PAD_CONFIG_DATA);  
    44.   
    45.   /* WE、CS0信号 */  
    46.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_28_SEMC_WE, SDRAM_PAD_CONFIG_DATA);                           
    47.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_29_SEMC_CS0, SDRAM_PAD_CONFIG_DATA);  

    48.   /* DM0、DM1信号 */  
    49.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_08_SEMC_DM00, SDRAM_PAD_CONFIG_DATA);                                    
    50.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_38_SEMC_DM01, SDRAM_PAD_CONFIG_DATA);

    51.   /* CLK、CKE信号 */  
    52.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_26_SEMC_CLK, SDRAM_PAD_CONFIG_DATA);                             
    53.   IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_27_SEMC_CKE, SDRAM_PAD_CONFIG_DATA);   
    54. }
    复制代码
    初始化SDRAM相关的SEMC配置
    1. static status_t SDRAM_SEMC_Config(void)
    2. {  
    3.     semc_config_t config;
    4.     semc_sdram_config_t sdramconfig;
    5.     uint32_t clockFrq = EXAMPLE_SEMC_CLK_FREQ;

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

    9.     /* Initialize SEMC. */
    10.     SEMC_GetDefaultConfig(&config);
    11.     SEMC_Init(SEMC, &config);

    12.     /* Configure SDRAM. */
    13.     sdramconfig.csxPinMux = kSEMC_MUXCSX0;
    14.     sdramconfig.address = 0x80000000;
    15.     sdramconfig.memsize_kbytes = 32 * 1024; /* 32MB = 32*1024*1KBytes*/
    16.     sdramconfig.portSize = kSEMC_PortSize16Bit;
    17.     sdramconfig.burstLen = kSEMC_Sdram_BurstLen8;
    18.     sdramconfig.columnAddrBitNum = kSEMC_SdramColunm_9bit;
    19.     sdramconfig.casLatency = kSEMC_LatencyThree;
    20.     sdramconfig.tPrecharge2Act_Ns = 18;   /* Trp 18ns */
    21.     sdramconfig.tAct2ReadWrite_Ns = 18;   /* Trcd 18ns */
    22.     sdramconfig.tRefreshRecovery_Ns = 67; /* Use the maximum of the (Trfc , Txsr). */
    23.     sdramconfig.tWriteRecovery_Ns = 12;   /* 12ns */
    24.     sdramconfig.tCkeOff_Ns = (1000000000 / clockFrq);
    25.     sdramconfig.tAct2Prechage_Ns = 42; /* Tras 42ns */
    26.     sdramconfig.tSelfRefRecovery_Ns = 67;
    27.     sdramconfig.tRefresh2Refresh_Ns = 60;
    28.     sdramconfig.tAct2Act_Ns = 60;
    29.     sdramconfig.tPrescalePeriod_Ns = 160 * (1000000000 / clockFrq);
    30.     sdramconfig.refreshPeriod_nsPerRow = 64 * 1000000 / 8192; /* 64ms/8192 */
    31.     sdramconfig.refreshUrgThreshold = sdramconfig.refreshPeriod_nsPerRow;
    32.     sdramconfig.refreshBurstLen = 1;
    33.     return SEMC_ConfigureSDRAM(SEMC, kSEMC_SDRAM_CS0, &sdramconfig, clockFrq);

    34. }
    复制代码
    测试方式和上一帖子一样,以32、16、8位的方式对SDRAM进行读写测试,
    1. bool SEMC_SDRAMReadWriteTest(void)
    2. {
    3.   bool result;
    4.   
    5.         /* 32Bit数据读写测试*/
    6.         result = SEMC_SDRAMReadWrite32Bit();
    7.   if(!result) return result;
    8.   
    9.         /* 16Bit数据读写测试 */
    10.         result = SEMC_SDRAMReadWrite16Bit();
    11.   if(!result) return result;

    12.         /* 8Bit数据读写测试 */
    13.         result = SEMC_SDRAMReadWrite8Bit();

    14.   return result;
    15. }
    复制代码
    测试结果和上一帖子也是一样的

    QQ截图20180607184011.jpg
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-8-4 22:53
  • 签到天数: 37 天

    连续签到: 2 天

    [LV.5]常住居民I

    发表于 2018-6-13 21:11:30 | 显示全部楼层
    学习下,                     
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 01:00 , Processed in 0.117443 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.