|
初始化如下,只用一片的16bit 32M Bytes的H57V2562,读写测试写一字节,差不多在写0x500000次单字节就会出错,每次出错的字节数不是固定,若是每次按2字节写,差不多在写0x35000次后就出问题,也不是固定次数,若是按4字节写,倒是固定在0x800次后就出错。配置几个关键地方试了不同配置还是不行,不知道还有哪些需要注意。
void SDRAM_32M_16BIT_Init( void )
{
volatile uint32_t i;
volatile unsigned long Dummy;
// Init SDRAM controller
LPC_SC->PCONP |= 0x00000800;//使能emc模块
PINSEL_ConfigPin(2,16,1); /* P2.16 - /EMC_CAS */
PINSEL_ConfigPin(2,17,1); /* P2.17 - /EMC_RAS */
PINSEL_ConfigPin(2,18,1); /* P2.18 - EMC_CLK[0] */
PINSEL_ConfigPin(2,20,1); /* P2.20 - EMC_DYCS0 */
PINSEL_ConfigPin(2,24,1); /* P2.24 - EMC_CKE0 */
PINSEL_ConfigPin(2,28,1); /* P2.28 - EMC_DQM0 */
PINSEL_ConfigPin(2,29,1); /* P2.29 - EMC_DQM1 */
PINSEL_ConfigPin(4,25,1); /* P4.25 - /EMC_WE */
for(i = 0; i < 16; i++)
{
PINSEL_ConfigPin(3,i,1); /* P3.0-P3.15 - EMC_D[0-15] */
}
for(i = 0; i < 15; i++)
{
PINSEL_ConfigPin(4,i,1); /* P4.0-P4.14 - EMC_A[0-14] */
}
//设置命令延迟时间 芯片数据手册上有标准
LPC_SC->EMCDLYCTL |= (8<<0);
//设置输入数据采样延迟
LPC_SC->EMCDLYCTL |=(8<<8);
//设置时钟输出延迟
LPC_SC->EMCDLYCTL |= (0x08 <<16);
LPC_SC->EMCDLYCTL=0x4|(0x4<<8)|(0x4<<16)|(0x4<<24);
//使能emc 正常地址映射 正常模式非低功耗模式
LPC_EMC->Control =1;
//读取配置设置为命令延迟策略
LPC_EMC->DynamicReadConfig = 1;
//设置ras延时为3个clk cas延时为3 以下设置都需要根据SDRAM数据手册来设置
LPC_EMC->DynamicRasCas0 = 0;
LPC_EMC->DynamicRasCas0 |=(3<<8);
LPC_EMC->DynamicRasCas0 |= (3<<0);
LPC_EMC->DynamicRP = P2C(SDRAM_TRP);
LPC_EMC->DynamicRAS = P2C(SDRAM_TRAS);
LPC_EMC->DynamicSREX = P2C(SDRAM_TXSR);
LPC_EMC->DynamicAPR = SDRAM_TAPR;
LPC_EMC->DynamicDAL = SDRAM_TDAL+P2C(SDRAM_TRP);
LPC_EMC->DynamicWR = SDRAM_TWR;
LPC_EMC->DynamicRC = P2C(SDRAM_TRC);
LPC_EMC->DynamicRFC = P2C(SDRAM_TRFC);
LPC_EMC->DynamicXSR =P2C(SDRAM_TXSR);
LPC_EMC->DynamicRRD = P2C(SDRAM_TRRD);
LPC_EMC->DynamicMRD = SDRAM_TMRD;
//选择cs0的配置
/*
16bit 256 Mb (16Mx16), 4 banks, row length = 13, column length = 9*/
LPC_EMC->DynamicConfig0 = 0x0000680;
//时钟受高电平驱动,clkout持续运行 发出nop命令
LPC_EMC->DynamicControl = 0x0183;
//等待一段时间让sdram启动
for(i= 200*40; i;i--);
//发布pall指令,预充电
LPC_EMC->DynamicControl = 0x0103;
//首先设置动态刷新周期为32个clk
LPC_EMC->DynamicRefresh = 2;
//等待至少128个clk
for(i= 256; i; --i); // > 128 clk
//设置新的动态刷新周期
LPC_EMC->DynamicRefresh = P2C(SDRAM_REFRESH) >> 4;
//发布mode指令
LPC_EMC->DynamicControl = 0x00000083;
//进行一次伪读取
Dummy = *((volatile uint32_t *)(SDRAM_BASE_ADDR | (0x33<<12)));
// 进入normal模式 自刷新时钟禁止 空闲时钟禁止 正常操作非掉电
LPC_EMC->DynamicControl = 0x0000;
//使能芯片缓冲
LPC_EMC->DynamicConfig0 |=(1<<19);
for(i = 100000; i;i--);
}
#endif
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|