TA的每日心情 | 擦汗 2019-6-26 20:59 |
---|
签到天数: 235 天 连续签到: 1 天 [LV.7]常住居民III
|
本帖最后由 小马哥-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 初始化外部存储器件 。
框图:
例程首先需要初始化sdram
- /* 初始化SDRAM */
- if (SDRAM_Init() != kStatus_Success)
- {
- RGB_LED_COLOR_RED;
- PRINTF("\r\n SEMC SDRAM Init Failed\r\n");
- }
复制代码
通过函数SDRAM_Init()配置SDRAM时钟,初始化sdram的引脚功能,初始化SDRAM相关的SEMC配置
- status_t SDRAM_Init(void)
- {
-
- /* 配置SDRAM时钟 */
- CLOCK_SetMux(kCLOCK_SemcMux, 1);
- CLOCK_SetDiv(kCLOCK_SemcDiv, 2);
- SDRAM_IOMUXC_MUX_Config();
- SDRAM_IOMUXC_PAD_Config();
- return SDRAM_SEMC_Config();
- }
复制代码
初始化SDRAM相关IOMUXC的MUX复用配置
- static void SDRAM_IOMUXC_MUX_Config(void)
- {
- /* 所有引脚均不开启SION功能 */
- /* DATA信号线DATA00~DATA15 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DATA04, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DATA05, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DATA06, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DATA07, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DATA08, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DATA09, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DATA10, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DATA11, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DATA12, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DATA13, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DATA14, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DATA15, 0U);
- /* ADDR信号线ADDR00~ADDR12 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_SEMC_ADDR00, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_10_SEMC_ADDR01, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_11_SEMC_ADDR02, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_12_SEMC_ADDR03, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_13_SEMC_ADDR04, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_14_SEMC_ADDR05, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_15_SEMC_ADDR06, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_16_SEMC_ADDR07, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_17_SEMC_ADDR08, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_18_SEMC_ADDR09, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_23_SEMC_ADDR10, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_19_SEMC_ADDR11, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_20_SEMC_ADDR12, 0U);
- /* BA0、BA1信号 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_21_SEMC_BA0, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_22_SEMC_BA1, 0U);
- /* RAS、CAS信号 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_25_SEMC_RAS, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_24_SEMC_CAS, 0U);
- /* WE、CS0信号 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_28_SEMC_WE, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_29_SEMC_CS0, 0U);
- /* DM0、DM1信号 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_08_SEMC_DM00, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_38_SEMC_DM01, 0U);
-
- /* CLK、CKE信号 */
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_26_SEMC_CLK, 0U);
- IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_27_SEMC_CKE, 0U);
- }
复制代码 初始化SDRAM相关IOMUXC的PAD属性配置
- static void SDRAM_IOMUXC_PAD_Config(void)
- {
- /* 所有引脚均使用同样的PAD配置 */
- /* DATA信号线DATA00~DATA15 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_00_SEMC_DATA00, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_01_SEMC_DATA01, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_02_SEMC_DATA02, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_03_SEMC_DATA03, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_04_SEMC_DATA04, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_05_SEMC_DATA05, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_06_SEMC_DATA06, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_07_SEMC_DATA07, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_30_SEMC_DATA08, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_31_SEMC_DATA09, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_32_SEMC_DATA10, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_33_SEMC_DATA11, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_34_SEMC_DATA12, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_35_SEMC_DATA13, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_36_SEMC_DATA14, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_37_SEMC_DATA15, SDRAM_PAD_CONFIG_DATA);
-
- /* ADDR信号线ADDR00~ADDR12 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_09_SEMC_ADDR00, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_10_SEMC_ADDR01, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_11_SEMC_ADDR02, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_12_SEMC_ADDR03, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_13_SEMC_ADDR04, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_14_SEMC_ADDR05, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_15_SEMC_ADDR06, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_16_SEMC_ADDR07, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_17_SEMC_ADDR08, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_18_SEMC_ADDR09, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_23_SEMC_ADDR10, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_19_SEMC_ADDR11, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_20_SEMC_ADDR12, SDRAM_PAD_CONFIG_DATA);
-
- /* BA0、BA1信号 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_21_SEMC_BA0, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_22_SEMC_BA1, SDRAM_PAD_CONFIG_DATA);
-
- /* RAS、CAS信号 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_25_SEMC_RAS, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_24_SEMC_CAS, SDRAM_PAD_CONFIG_DATA);
-
- /* WE、CS0信号 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_28_SEMC_WE, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_29_SEMC_CS0, SDRAM_PAD_CONFIG_DATA);
- /* DM0、DM1信号 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_08_SEMC_DM00, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_38_SEMC_DM01, SDRAM_PAD_CONFIG_DATA);
- /* CLK、CKE信号 */
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_26_SEMC_CLK, SDRAM_PAD_CONFIG_DATA);
- IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_27_SEMC_CKE, SDRAM_PAD_CONFIG_DATA);
- }
复制代码 初始化SDRAM相关的SEMC配置
- static status_t SDRAM_SEMC_Config(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);
- 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 = (1000000000 / clockFrq);
- 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);
- }
复制代码 测试方式和上一帖子一样,以32、16、8位的方式对SDRAM进行读写测试,
- bool SEMC_SDRAMReadWriteTest(void)
- {
- bool result;
-
- /* 32Bit数据读写测试*/
- result = SEMC_SDRAMReadWrite32Bit();
- if(!result) return result;
-
- /* 16Bit数据读写测试 */
- result = SEMC_SDRAMReadWrite16Bit();
- if(!result) return result;
- /* 8Bit数据读写测试 */
- result = SEMC_SDRAMReadWrite8Bit();
- return result;
- }
复制代码 测试结果和上一帖子也是一样的
|
|