DSP

TMS320C6455之DDR2内存控制器

2019-07-13 11:56发布

基于TMS320C6455DDR2内存控制器的介绍 前言:         DDR2内存控制器是连接DDR2内存设备的接口,内存的类型有DDR1 SDRAM,DDR2 SDRAM,并且内存设备要符合JESD79-2B 标准。SDR SDRAM、SBSRAM和异步存储器, 不支持。DDR2内存控制器的内存可用于存储程序和数据。         DDR2控制器支持功能:(1)符合JESD79-2B标准的DDR2内存设备                                                    (2)512Mbyte内存空间                                                    (3)16位或32位数据总线宽度
                                                        (4)2,3,4,5个CAS延迟
                                                        (5)1,2,4,8个内部内存库                                                         (6)256,512,1024,2048页面大小                                                         (7)小段和大端存储的转换                                                         (8)可编程的定时参数                                                         (9)自刷新模式 等等 注意:本文以TMS320C6455的DDR2内存控制器为例讲解

1.DDR2接口信号图
部分信号说明: DED[31:0]        双向数据总线。输入数据读取和输出数据写入; DEA[13:0]        外部地址输出; DBA[2:0]          内存库地址控制输出;
2.EMIF片选信号及映射情况
3.DDR2控制器与DDR2设备连接原理图 C6455:
DDR2:

4.DDR2寄存器的配置           (1)连接方式
          (2)配置DDR2内存控制器           (3)配置SDCFG(页面大小,数据位宽等)                 (4)配置SDRFC(刷新时间)            (5)配置SDTIM1和SDTIM2
5.给出DDR2驱动代码(与上面配置存在小差异)       说明:               此例程是在CSL基础上写的,有关CSL的讲解请查看http://blog.csdn.net/mdqaq/article/details/53941808 DDR2初始化: #include #include #include #include #include #include #include #include #include #define ADDR_BASE 0xE0000000 #define SDRAM_REFRESH_RATE_DEFAULT (0x0000073Bu) void ddr2_init(void) { volatile Uint32 result, index; CSL_Ddr2Obj ddr2Obj; CSL_Status status; CSL_Ddr2HwSetup hwSetup ; CSL_Ddr2Timing1 tim1 = {0x23, 0x4,0x4, 0x4, 0x0B, 0x0F, 0x2,0x2}; CSL_Ddr2Timing2 tim2 = {0x2,0x25,0xDC, 0x2, 0x04}; CSL_Ddr2Settings set = CSL_DDR2_SETTING_DEFAULTS; CSL_Ddr2Handle hDdr2; /* Enable the ddr2 */ CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG1, DEV_PERCFG1_DDR2CTL, ENABLE); /* Clear local data structures */ memset(&ddr2Obj, 0, sizeof(CSL_Ddr2Obj)); memset(&hwSetup, 0, sizeof(CSL_Ddr2HwSetup)); set.casLatncy = CSL_DDR2_CAS_LATENCY_5; set.ibank = CSL_DDR2_8_SDRAM_BANKS; set.ddrDrive = CSL_DDR2_NORM_DRIVE; set.pageSize = CSL_DDR2_1024WORD_10COL_ADDR; set.narrowMode = CSL_DDR2_NORMAL_MODE; /* setup the hardware parameters */ hwSetup.refreshRate = SDRAM_REFRESH_RATE_DEFAULT; hwSetup.timing1Param = &tim1; hwSetup.timing2Param = &tim2; hwSetup.setParam = &set; /* Initialize DDR2 CSL module */ status = CSL_ddr2Init(NULL); if (status != CSL_SOK) { printf("DDR2 EMIF: Initialization error. "); printf(" Reason: CSL_ddr2Init [status = 0x%x]. ", status); return; } else { printf("DDR2 EMIF: Module Initialized. "); } /* Opening the DDR2 instance */ hDdr2 = CSL_ddr2Open(&ddr2Obj, CSL_DDR2, NULL, &status); if ((status != CSL_SOK) || (hDdr2 == NULL)) { printf("DDR2 EMIF: Error opening the instance. [status = 0x%x, hDdr2 = 0x%x] ", status, hDdr2); return; } else { printf("DDR2 EMIF: Module instance opened. "); } /* Setting up configuration parameter using HwSetup */ status = CSL_ddr2HwSetup(hDdr2, &hwSetup); if (status != CSL_SOK) { printf("DDR2 EMIF: Error in HW Setup. "); printf("Read write operation fails "); return; } else { printf("DDR2 EMIF: Module Hardware setup is successful. "); } }

DDR2测试代码: /********************************************************************************* ** ** 功能: DDR2写数据函数 ** 函数名: ddr_write ** *********************************************************************************/ void ddr2_write(Uint32 addr, Uint32 data) { *((Uint32*) (ADDR_BASE + addr)) = data; } /********************************************************************************* ** ** 功能: DRR2读数据函数 ** 函数名: ddr_read ** *********************************************************************************/ Uint32 ddr2_read(Uint32 addr) { Uint32 data = 0; data = *((Uint32*) (ADDR_BASE + addr)); return data; } /****************************************************************************** ** 功能: DDR2 测试函数 ** 参数: len - 要测试的ddr的空间大小取0~ 512M ** 返回: 测试DDR2读写正常返回 0, 否则返回 -1 *******************************************************************************/ int ddr2_test(Uint32 startAddr, Uint32 startVal, Uint32 len) { Uint32 inI; Uint32 retVal; for(inI = 0; inI < len / 4; inI++) { ddr2_write(startAddr + inI * 4, startVal); retVal = ddr2_read(startAddr + inI * 4); if(retVal != startVal) { printf("ddr2 test error addr = %d ", startAddr + inI*4); return -1; } startVal++; } printf("ddr2 test is 0k! "); return 0; }