Hi jeremyzhou,
Now the SDRAM seems to work fine. I used the routines you sent me but I had to change something. I had to force the "add_mapped_p1" value. The routine modified is the following:
EMC_FUNC_CODE EMC_DynMemConfigAM(uint32_t index,
uint8_t addr_bus_width,
uint8_t addr_map,
uint8_t data_bus_width,
uint16_t chip_size)
{
const int chip_max_size = 512;
uint8_t data_bus_max_size = 0;
uint32_t add_mapped_p1 = 0x00, add_mapped_p2 = 0x00, add_mapped_p3 = 0x00;
uint32_t tmp = 16, i = 0, j = 0;
switch(addr_bus_width)
{
case 16:
add_mapped_p3 = 0;
data_bus_max_size = 16;
break;
case 32:
add_mapped_p3 = 1;
data_bus_max_size = 32;
break;
default:
return EMC_FUNC_INVALID_PARAM;
}
add_mapped_p2 = EMC_DYNAMIC_CFG_ADD_MAP_P2(addr_map);
if(chip_size == 16)
{
if (data_bus_width == 8) add_mapped_p1 = 0;
else if(data_bus_width == 16) add_mapped_p1 = 1;
else return EMC_FUNC_INVALID_PARAM;
}
else
{
while(1)
{
i++;
tmp = 16*(0x01 << (i+1));
if(tmp == chip_size)
{
for(j = 0; (8<<j)<=data_bus_max_size;j++)
{
if((8<<j) == data_bus_width) break;
}
if( (8<<j) > data_bus_max_size) return EMC_FUNC_INVALID_PARAM;
add_mapped_p1 = (i<<2) + j;
break;
}
if(tmp >= chip_max_size)
{
return EMC_FUNC_INVALID_PARAM;
}
}
}
add_mapped_p1=13;
switch(index)
{
case 0:
LPC_EMC->DynamicConfig0 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P1_MASK;
LPC_EMC->DynamicConfig0 |= EMC_DYNAMIC_CFG_ADD_MAP_P1(add_mapped_p1);
LPC_EMC->DynamicConfig0 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P2_MASK;
LPC_EMC->DynamicConfig0 |= EMC_DYNAMIC_CFG_ADD_MAP_P2(add_mapped_p2);
LPC_EMC->DynamicConfig0 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P3_MASK;
LPC_EMC->DynamicConfig0 |= EMC_DYNAMIC_CFG_ADD_MAP_P3(add_mapped_p3);
break;
case 1:
LPC_EMC->DynamicConfig1 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P1_MASK;
LPC_EMC->DynamicConfig1 |= EMC_DYNAMIC_CFG_ADD_MAP_P1(add_mapped_p1);
LPC_EMC->DynamicConfig1 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P2_MASK;
LPC_EMC->DynamicConfig1 |= EMC_DYNAMIC_CFG_ADD_MAP_P2(add_mapped_p2);
LPC_EMC->DynamicConfig1 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P3_MASK;
LPC_EMC->DynamicConfig1 |= EMC_DYNAMIC_CFG_ADD_MAP_P3(add_mapped_p3);
break;
case 2:
LPC_EMC->DynamicConfig2 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P1_MASK;
LPC_EMC->DynamicConfig2 |= EMC_DYNAMIC_CFG_ADD_MAP_P1(add_mapped_p1);
LPC_EMC->DynamicConfig2 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P2_MASK;
LPC_EMC->DynamicConfig2 |= EMC_DYNAMIC_CFG_ADD_MAP_P2( add_mapped_p2);
LPC_EMC->DynamicConfig2 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P3_MASK;
LPC_EMC->DynamicConfig2 |= EMC_DYNAMIC_CFG_ADD_MAP_P3(add_mapped_p3);
break;
case 3:
LPC_EMC->DynamicConfig3 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P1_MASK;
LPC_EMC->DynamicConfig3 |= EMC_DYNAMIC_CFG_ADD_MAP_P1(add_mapped_p1);
LPC_EMC->DynamicConfig3 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P2_MASK;
LPC_EMC->DynamicConfig3 |= EMC_DYNAMIC_CFG_ADD_MAP_P2(add_mapped_p2);
LPC_EMC->DynamicConfig3 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P3_MASK;
LPC_EMC->DynamicConfig3 |= EMC_DYNAMIC_CFG_ADD_MAP_P3(add_mapped_p3);
break;
default:
return EMC_FUNC_INVALID_PARAM;
}
return EMC_FUNC_OK;
}
The original routine calculated:
add_mapped_p1=17
add_mapped_p2=0
add_mapped_p3=1
but using add_mapped_p1=17 the SDRAM doesn't work fine. I have to force
add_mapped_p1=13
In this way the SDRAM works fine. Why your routine doesn't calcule the right add_mapped_p1 value?
The SDRAM timing I used are the following:
config.ChipSize = 512;
config.AddrBusWidth = 32;
config.AddrMap = EMC_ADD_MAP_ROW_BANK_COL;
config.CSn = 0;
config.DataWidth = 16;
config.TotalSize = 536870912;
config.CASLatency = 2;
config.RASLatency = 1;
config.Active2ActivePeriod = 10;
config.ActiveBankLatency = 2;
config.AutoRefrehPeriod = 10;
config.DataIn2ActiveTime = 5;
config.DataOut2ActiveTime = 5;
config.WriteRecoveryTime = 2;
config.ExitSelfRefreshTime = EMC_NS2CLK(70);
config.LoadModeReg2Active = 2;
config.PrechargeCmdPeriod = 3;
config.ReadConfig = 1;
config.RefreshTime = EMC_SDRAM_REFRESH(64);
config.Active2PreChargeTime = 7;
config.SeftRefreshExitTime = EMC_NS2CLK(70);
The configuration
add_mapped_p1=13
add_mapped_p2=0
add_mapped_p3=1
correspond to

Your previous suggestion was

I am a little bit confuse..
. Can you explain me?
Many thanks
Regards