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;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮