基于RT1052的SEMC的SDRAM读写测试

基于RT1052的SEMC的SDRAM读写测试
注:1、对 SDRAM 存储空间的数据操作都要在 SDRAM_Init 初始化 SEMC 之后
2、当前这种方式不适用于系统启动后就需要 SDRAM 的应用
在这里插入图片描述

/*
bsp_sdram.c
*/
#include "bsp_sdram.h"
//SDRAM起始地址 
#define SEMC_SDRAM_START_ADDRESS   (0x80000000U)
//SDRAM大小,32M字节
#define SEMC_SDRAM_MEM_LENGTH      (32*1024*1024)
//读和写的数据的长度
#define SEMC_SDRAM_WRDATALEN    (0x1000U)
//读和写次数
#define SEMC_SDRAM_WRTIMES      (1000U)
uint32_t sdram_writeBuffer[SEMC_SDRAM_WRDATALEN];
uint32_t sdram_readBuffer[SEMC_SDRAM_WRDATALEN];
//SEMC_SDRAM_START_ADDRESS+SEMC_SDRAM_MEM_LENGTH都表示SDRAM的存储空间,访问这些地址就能直接访问SDRAM
//指针方式访问SDRAM
/*
 *      uint32_t temp;
 *      向SDRAM写入8位数据
 *      *(uint8_t*)(SEMC_SDRAM_START_ADDRESS) = (uint8_t)0xAA;
 *      从SDRAM读数据
 *      temp = *(uint8_t*)(SEMC_SDRAM_START_ADDRESS);
 *      写/读16位数据
 *      *(uint16_t*)(SEMC_SDRAM_START_ADDRESS+10) = (uint16_t)0xAABB;
 *      temp = *(uint16_t*)(SEMC_SDRAM_START_ADDRESS+10);
 *      写/读16位数据
 *      *(uint32_t*)(SEMC_SDRAM_START_ADDRESS+20) = (uint32_t)0xAABBCCDD;
 *      temp = *(uint32_t*)(SEMC_SDRAM_START_ADDRESS+20);
*/
// /* 绝对定位方式访问 SDRAM, 这种方式必须定义成全局变量 */
// 必须在函数外把它定义成全局变量,才可以存储到指定地址上
/*
    uint8_t testValue __attribute__((at(SDRAM_START_ADDRESS)));//使用关键字“__attribute__((at()))”来指定变量的地址  
    testValue = 0xDD;
*/

//初始化SDRAM相关IOMUXC的MUX复用配置
static void SDRAM_IOMUXC_Config(void)
{
    //所有引脚均不开启SION功能
    //DATA信号线DATA00-DATA15
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DATA04,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DATA05,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DATA06,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DATA07,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DATA08,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DATA09,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DATA10,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DATA11,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DATA12,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DATA13,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DATA14,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DATA15,0);
    //DQS信号线 必须使能SION功能
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_39_SEMC_DQS,1);
    //ADDR信号线 ADDR00-ADDR12
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_SEMC_ADDR00,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_10_SEMC_ADDR01,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_11_SEMC_ADDR02,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_12_SEMC_ADDR03,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_13_SEMC_ADDR04,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_14_SEMC_ADDR05,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_15_SEMC_ADDR06,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_16_SEMC_ADDR07,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_17_SEMC_ADDR08,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_18_SEMC_ADDR09,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_23_SEMC_ADDR10,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_19_SEMC_ADDR11,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_20_SEMC_ADDR12,0);
    //BA0 BA1
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_21_SEMC_BA0,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_22_SEMC_BA1,0);
    //RAS CAS信号
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_25_SEMC_RAS,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_24_SEMC_CAS,0);  
    //WE CS0信号
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_28_SEMC_WE,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_29_SEMC_CS0,0);   
    //DM0 DM1信号
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_08_SEMC_DM00,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_38_SEMC_DM01,0);
    //CLK CKE信号
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_26_SEMC_CLK,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_27_SEMC_CKE,0);
}
static void SDRAM_IOMUXC_PAD_Config(void)
{
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_00_SEMC_DATA00,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_01_SEMC_DATA01,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_02_SEMC_DATA02,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_03_SEMC_DATA03,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_04_SEMC_DATA04,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_05_SEMC_DATA05,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_06_SEMC_DATA06,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_07_SEMC_DATA07,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_30_SEMC_DATA08,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_31_SEMC_DATA09,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_32_SEMC_DATA10,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_33_SEMC_DATA11,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_34_SEMC_DATA12,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_35_SEMC_DATA13,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_36_SEMC_DATA14,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_37_SEMC_DATA15,SEMC_SDRAM_PAD_CONFIG_DATA);

    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_39_SEMC_DQS,SEMC_SDRAM_PAD_CONFIG_DATA);

    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_09_SEMC_ADDR00,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_10_SEMC_ADDR01,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_11_SEMC_ADDR02,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_12_SEMC_ADDR03,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_13_SEMC_ADDR04,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_14_SEMC_ADDR05,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_15_SEMC_ADDR06,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_16_SEMC_ADDR07,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_17_SEMC_ADDR08,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_18_SEMC_ADDR09,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_23_SEMC_ADDR10,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_19_SEMC_ADDR11,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_20_SEMC_ADDR12,SEMC_SDRAM_PAD_CONFIG_DATA);

    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_21_SEMC_BA0,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_22_SEMC_BA1,SEMC_SDRAM_PAD_CONFIG_DATA);

    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_25_SEMC_RAS,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_24_SEMC_CAS,SEMC_SDRAM_PAD_CONFIG_DATA);

    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_28_SEMC_WE,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_29_SEMC_CS0,SEMC_SDRAM_PAD_CONFIG_DATA);

    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_08_SEMC_DM00,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_38_SEMC_DM01,SEMC_SDRAM_PAD_CONFIG_DATA);

    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_26_SEMC_CLK,SEMC_SDRAM_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_27_SEMC_CKE,SEMC_SDRAM_PAD_CONFIG_DATA);
}

//初始化SDRAM相关的SEMC配置
static status_t SDRAM_SEMC_Config(void)
{
    status_t status=kStatus_Fail;
    semc_config_t config;
    semc_sdram_config_t sdramconfig;
    uint32_t clockFrq = SEMC_SDRAM_CLK_FREQ;
    //清空结构体
    memset(&config,0,sizeof(semc_config_t));
    memset(&sdramconfig,0,sizeof(semc_sdram_config_t));

    //使用默认配置初始化SEMC
    SEMC_GetDefaultConfig(&config);
    config.dqsMode = kSEMC_Loopbackdqspad;
    SEMC_Init(SEMC,&config);

    //配置SDRAM
    sdramconfig.csxPinMux = kSEMC_MUXCSX0;
    sdramconfig.address = SEMC_SDRAM_START_ADDRESS;
    sdramconfig.memsize_kbytes = 32*1024;
    sdramconfig.portSize = kSEMC_PortSize16Bit;
    sdramconfig.burstLen = kSEMC_Sdram_BurstLen8;
    sdramconfig.columnAddrBitNum = kSEMC_SdramColunm_9bit;
    sdramconfig.casLatency = kSEMC_LatencyTwo;
    sdramconfig.tPrecharge2Act_Ns = 15;
    sdramconfig.tAct2ReadWrite_Ns = 15;
    sdramconfig.tRefreshRecovery_Ns = 72;
    sdramconfig.tWriteRecovery_Ns = 2 * (1000000000/clockFrq);
    sdramconfig.tCkeOff_Ns = 1 * (1000000000/clockFrq);
    sdramconfig.tAct2Prechage_Ns = 42;
    sdramconfig.tSelfRefRecovery_Ns = 72;
    sdramconfig.tRefresh2Refresh_Ns = 60;
    sdramconfig.tAct2Act_Ns = 60;
    sdramconfig.tPrescalePeriod_Ns = 160 * (1000000000/clockFrq);
    sdramconfig.refreshPeriod_nsPerRow = 64*1000000/8192;
    sdramconfig.refreshUrgThreshold = sdramconfig.refreshPeriod_nsPerRow;
    sdramconfig.refreshBurstLen = 1;
    status = SEMC_ConfigureSDRAM(SEMC,kSEMC_SDRAM_CS0,&sdramconfig,clockFrq);
    return status;
}
//这种初始化方式 不适合 于系统启动后就需要 SDRAM 的应用
status_t SDRAM_SEMC_Init(void)
{
    status_t status=kStatus_Fail;
    //配置SDRAM的时钟
     /* 0: Periph_clk
        1: SEMC alternative clock
        使用 SEMC alternative clock */
    CLOCK_SetMux(kCLOCK_SemcMux,1);
    /* 0: PLL2 PFD2   PLL2 PFD2 will be selected as alternative clock for SEMC root clock
        1: PLL3 PFD1   PLL3 PFD1 will be selected as alternative clock for SEMC root clock
        alternative clock 使用 PLL2 PFD2 */
    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);
    /* 分频后得到 SEMC_CLK_ROOT,
        SEMC_CLK_ROOT = PLL2 PFD2/(1+1) */  // fSEMC_CLK_ROOT = fPLL2 PFD2/(1+1)=528*18/30/2=158.4MHz
    CLOCK_SetDiv(kCLOCK_SemcDiv,1);
    SDRAM_IOMUXC_Config();
    SDRAM_IOMUXC_PAD_Config();
    status = SDRAM_SEMC_Config();
    return status;
}
//使用32bit指针进行访问SDRAM测试
//注意对 SDRAM 存储空间的数据操作都要在 SDRAM_Init 初始化 SEMC 之后,否则数据是无法正常存储的
void SEMC_SDRAMReadWrite32Bit(void)
{
    uint32_t index;
    uint32_t datalen = SEMC_SDRAM_WRDATALEN;
    /*
        指向SDRAM测试的起始地址
        对该指针指向的地址赋值会触发向SDRAM的写入
        对该指针指向的地址赋值会触发向SDRAM的读取
    */
    uint32_t *sdram = (uint32_t*)SEMC_SDRAM_START_ADDRESS;
    bool result = true;

    PRINTF("Write data in 32-bit mode The starting address 0x%x  Write the length %d\r\n",sdram,datalen);
    //向SDRAM写入数据
    for(index = 0; index<datalen;index++){
        sdram_writeBuffer[index] = index;
        sdram[index] = sdram_writeBuffer[index];
    }
    PRINTF("Read data in 32-bit mode The starting address 0x%x  Read the length %d\r\n",sdram,datalen);
    for(index = 0; index<datalen;index++){
        sdram_readBuffer[index] = sdram[index];
    } 
    PRINTF("Start comparing written and read data\r\n");
    while(datalen--){
        if(sdram_writeBuffer[datalen]!=sdram_readBuffer[datalen]){
            result = false;
            break;
        }
    } 
    if(result){
        PRINTF("Consistent read and write results\r\n");
    }else{
        PRINTF("The read/write result is inconsistent\r\n");
    }
}
/*
bsp_sdram.h
*/
#ifndef __BSP_SDRAM_H__
#define __BSP_SDRAM_H__
#include "fsl_debug_console.h"
#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "fsl_gpio.h"
#include "pad_config.h"
#include "fsl_semc.h"
//SEMC_CLK_ROOT频率
#define SEMC_SDRAM_CLK_FREQ      CLOCK_GetFreq(kCLOCK_SemcClk)

#define SEMC_SDRAM_PAD_CONFIG_DATA     (SRE_1_FAST_SLEW_RATE | \
                                 DSE_7_R0_7 | \
                                 SPEED_3_MAX_200MHz | \
                                 ODE_0_OPEN_DRAIN_DISABLED | \
                                 PKE_1_PULL_KEEPER_ENABLED | \
                                 PUE_0_KEEPER_SELECTED | \
                                 PUS_0_100K_OHM_PULL_DOWN | \
                                 HYS_1_HYSTERESIS_ENABLED)

status_t SDRAM_SEMC_Init(void);
void SEMC_SDRAMReadWrite32Bit(void);
#endif

//main.c
...
	SDRAM_SEMC_Init();
    SEMC_SDRAMReadWrite32Bit();
...
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
i.MX-RT1052+SDRAM智能面板方案设计软硬件资料(包括RT1052主板+语音识别板+电源板 3款ALTIUM设计的硬件工程文件,smart_panel-1.0.2软件源码),硬件包括完整的原理图PCB文件。 基于高性能ARM Cortex-M7内核的RT1052处理器开发设计,为系统提供强悍的性能; 支持Wi-Fi联网,可实现数据与ZLG云、阿里云等云端平台交互、手机APP控制等功能; 支持蓝牙Mesh联网,实现与区域内各节点Mesh设备组网,实现无线控制; 板载4.0寸高分辨率电容触摸屏; 内置TOF 1D距离传感器,实现“人近屏亮、人走屏灭”,适用于低功耗控制场合。 基于86盒的标准硬件结构,可进行多种安装环境的无缝结合; 内置AC-DC模块,电源管理更加高效安全; 集成多个220V交流控制继电器,轻松实现电气设备的连接与控制; 集成485总线控制,可挂靠多个485总线设备; 集成的语音识别,实现语音识别与控制; 01. PPT 02. 演示视频 03. 86盒智能面板语音词条 04. 硬件设计源文件资料 05. 软件设计源文件资料 01. 工程文件 02. 封装库 03. PDF原理图及丝印 04. BOM 05. 关键器件资料 01. MAIN.SchDoc 02. PWR_3.3V_MP1653_ZL6205A33.SchDoc 03. PWR_1.8V_ZL6205A18.SchDoc 04. i.MX-RT1052_PWR.SchDoc 05. i.MX-RT1052_BOOT.SchDoc 06. i.MX-RT1052_RST.SchDoc 07. i.MX-RT1052_SEMC.SchDoc 08. i.MX-RT1052_Peripherals.SchDoc 09. QSPI-Flash_IS25LP064A.SchDoc 10. SDRAM_IS42S16160J.SchDoc 11. LCD_TFT4.0.SchDoc 12. WIFI_NM372SM.SchDoc 13. BLE_BT11P.SchDoc 14. TOF_TMF8701.SchDoc 15. Audio_BEEP_SPK_ASR.SchDoc 16. RTC_PCF85063.SchDoc 17. THS_AHT10_NTC.SchDoc 18. Port_Connecter.SchDoc Smart-Panel_RT1052 Rev.A.PcbDoc Smart-Panel_RT1052 Rev.A.PrjPcb

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值