TI中文支持网
TI专业的中文技术问题搜集分享网站

SDRAM-DDR2-IS43DR16160A内存初始化代码

各位专家好

我们在一家公司做毕设,主板是公司自己设计的,使用的是AM3505的处理器,搭载一片32M SDRAM, 型号是IS43DR16160A-5BBLI,我们自己写了初始化该内存的代码,但是好像不能工作,调试的时候代码不能下载到内存中, 实在是找不出哪里有问题了,以下是我的内存初始化代码,求各位专家指正。附件里有内存的datasheet

 

#    Configure EMIF to Access Micron DDR2

#Step1: Setup DDR PHY control registers

 0x6D0000E4 = 0x04     #DDR_PHY_CTRL_1

 0x6D0000E8 = 0x04    #DDR_PHY_CTRL_1_SHDW

 0x6D0000EC = 0x0    # DDR_PHY_CTRL_2

 

# Step2: Reset the PHY (using IODFT_TLGC) and wait till complete

0x6D000060 = 0x2411 #IODFT_TLGC

sleep 20

 

#Step3: Configure EMIF

#3.1 Setup timing registers (SDRAM_TIM_xxx)

 0x6D000018 = 0x04447289 #SDRAM_TIM_1

 0x6D00001C = 0x04447289 #SDRAM_TIM_1_SHDW

 0x6D000020 = 0x141031CA #SDRAM_TIM_2

 0x6D000024 = 0x141031CA #SDRAM_TIM_2_SHDW

 0x6D000028 = 0xE7 #SDRAM_TIM_3

 0x6D00002C = 0xE7 #SDRAM_TIM_3_SHDW

#3.2 Setup Power control reg (PWR_MGMT_CTRL)

 0x6D000038 = 0x80000000 #PWR_MGMT_CTRL

 0x6D00003C = 0x80000000 #PWR_MGMT_CTRL_SHDW

#3.3 Setup refresh rate (SDRAM_REF_CTRL)

 0x6D000010 = 0x618 #SDRAM_REF_CTRL

 0x6D000014 = 0x618 #SDRAM_REF_CTRL_SHDW

3.4 Setup SDRAM configuration register (SDRAM_CONFIG)

 0x6D000008 = 0x40804C21 #SDRAM_CONFIG

 

内存的电路图如下:


 

 

Yaoming Qin:

你参考 processors.wiki.ti.com/index.php, 在对照着AM35x的technical reference manual看看,多调试下。另外,系统起不来不一定是ddr的原因。

Fangbo Xu:

回复 Yaoming Qin:

这些SDRAM的配置是我们根据这个TI的wiki(processors.wiki.ti.com/…/Setting_up_AM35x_SDRC_registers )写的,我们之前用eclipse在craneboard上调试成功过, 使用的是相同的代码,配置文件只有SDRAM的初始化不一样。您认为除了SDRAM,还有哪些因素可能导致数据不能下载到SDRAM中去呢?

以下是Jtag的配置代码:

target remote localhost:2331

# Set JTAG speed to 30 kHz

monitor speed 30

# Set GDBServer to little endian

monitor endian little

# Reset the chip to get to a known state.

monitor reset

# Disable watchdog

#    enable Interface clock

monitor writeu32 0x48004C10 = 0x20

#    enable functional clock

monitor writeu32 0x48004C00 = 0x20

monitor sleep 10

#    Disable 32Khz watchdog timer

monitor writeu32 0x48314048 = 0x0000AAAA

monitor sleep 10

#    Disable 32Khz watchdog timer

monitor writeu32 0x48314048 = 0x00005555

#Select 26MHz clock (PRM_CLKSEL_REG)

monitor writeu32 0x48306D40 = 0x03

# Set JTAG speed to 1000 kHz

monitor speed 1000

#Setup_ClockConfig_IIA

#   Put DPLL into bypass

monitor writeu32 0x48004D00 = 0x00110011

monitor sleep 10

#   Configure clock ratios for all L3, L4 targets

monitor writeu32 0x48004A40 = 0x032A

#   /*Configure M, N and FreqSel values*/

#   setDpllConfigValues(CORE_DPLL, CORE_CFG2A, *PRM_CLKSEL_REG);

#     DPLL_MULT_VALUE = 332;

#     DPLL_DIV_VALUE = 25;

#     DPLL_FREQ_SEL_VALUE = 0x3;

#     nM2Div = 1;

#   lockCoreDpll(nM2Div /*in_M2Div*/);

#*CM_CLKSEL1_PLL_REG = ((in_M2Div << 27) | (DPLL_MULT_VALUE << 16) | (DPLL_DIV_VALUE << 8) | (0 << 5) | (0 << 3));

monitor writeu32 0x48004D40 = 0x094C1900

monitor writeu32 0x48004D44 = 0x00006019

monitor writeu32 0x48004D48 = 0x00000002

monitor writeu32 0x48004D00 = 0x00370037

monitor sleep 100

#Setup_MPUConfig_OPP3

#   Put DPLL into bypass

#   CM_CLKEN_PLL_MPU_REG

monitor writeu32 0x48004904 = 0x0015

monitor sleep 10

#/*Configure M, N and FreqSel values*/

#setDpllConfigValues(MPU_DPLL, MPU_OPP3, *PRM_CLKSEL_REG);

#   DPLL_MULT_VALUE = 250;

#   DPLL_DIV_VALUE = 12;

#   DPLL_FREQ_SEL_VALUE = 0x7;

#   nM2Div = 1;

#lockMpuDpll(nM2Div /*in_M2Div*/);

#CM_CLKSEL2_PLL_MPU_REG

monitor writeu32 0x48004944 = 0x01

#CM_CLKSEL1_PLL_MPU_REG = ((2 << 19) | (DPLL_MULT_VALUE << 8) | (DPLL_DIV_VALUE << 0));

monitor writeu32 0x48004940 = 0x0010FA0C

#   CM_CLKEN_PLL_MPU_REG

monitor writeu32 0x48004904 = 0x0077

monitor sleep 100

#Configure Micron DDR2

#   Changing muxmode for cke0 & cke1

monitor writeu32 0x48002264 = 0x00

#    Configure EMIF to Access Micron DDR2

#Step1: Setup DDR PHY control registers

monitor writeu32 0x6D0000E4 = 0x04

monitor writeu32 0x6D0000E8 = 0x04

monitor writeu32 0x6D0000EC = 0x0

# Step2: Reset the PHY (using IODFT_TLGC) and wait till complete

monitor writeu32 0x6D000060 = 0x2411

monitor sleep 10

#Step3: Configure EMIF

#3.1 Setup timing registers (SDRAM_TIM_xxx)

monitor writeu32 0x6D000018 = 0x04447289

monitor writeu32 0x6D00001C = 0x04447289

monitor writeu32 0x6D000020 = 0x141031CA

monitor writeu32 0x6D000024 = 0x141031CA

monitor writeu32 0x6D000028 = 0xE7

monitor writeu32 0x6D00002C = 0xE7

#3.2 Setup Power control reg (PWR_MGMT_CTRL)

monitor writeu32 0x6D000038 = 0x80000000

monitor writeu32 0x6D00003C = 0x80000000

#3.3 Setup refresh rate (SDRAM_REF_CTRL)

monitor writeu32 0x6D000010 = 0x618

monitor writeu32 0x6D000014 = 0x618

#3.4 Setup SDRAM configuration register (SDRAM_CONFIG)

monitor writeu32 0x6D000008 = 0x40804C21

Yaoming Qin:

回复 Fangbo Xu:

你现在确定片子起来了么? 你当前板子是个什么状态,你打算怎么干?

Fangbo Xu:

回复 Yaoming Qin:

我先声明我想干什么:

我现在使用的是公司自己设计的主板,搭载AM3505处理器,内存大小型号已经在上面提到了。 我们的任务是负责把自己开发的内核和linux内核移植到这块板子上去。分两阶段进行,

第一阶段:移植自己的内核

第二阶段:移植linux内核

交叉编译环境我们使用的是windows7+eclipse+yagarto+Jlink

第一阶第一步,我们在craneboard上调试自己的内核,GDB初始化AM3505内存寄存器的那些值都是从TI提供的x-loader中淘出来的,调试是成功的,我们通过Jtag把我们的内核下载到SDRAM中并跑起来了。

第一阶段第二部: 在我们自己的板子上尝试(内存芯片的型号和craneboard不一样),我们根据TI wiki(processors.wiki.ti.com/…/Setting_up_AM35x_SDRC_registers )写了AM3505内存寄存器的初始化代码,jtag的配置和craneboard的配置一样,调试的时候没有数据下载到sdram中。我想应该是内存初始化出问题了。

另外请教一个问题,TI在写X-loader的时候使用什么工具来debug的。

我们现阶段使用的交叉编译环境(windows7+eclipse+yagarto+Jlink)编译不了X-loader, 需要改动的地方太多了, 更别说调试了,我想请教一下,通过Jlink有没有可能在linux下debug  x-loader? 如果可以,您能不能把相关文档发给我们?先感谢了。

Fangbo Xu:

回复 Fangbo Xu:

我把详细的文档列在一下网址了,供大家参考

sites.google.com/…/2012-04-15

Jian Feng1:

回复 Fangbo Xu:

你好 我也是用的ISSI的DDR2  现在也是DDR2有问题,能跟你交流一下吗

Fangbo Xu:

回复 Jian Feng1:

没问题,发邮件到我的邮箱xufangbox@gmail.com

Fangbo Xu:

回复 Jian Feng1:

没问题,发邮件到我的邮箱xufangbox@gmail.com

赞(0)
未经允许不得转载:TI中文支持网 » SDRAM-DDR2-IS43DR16160A内存初始化代码
分享到: 更多 (0)