This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于AM1808的PLL0的问题

Other Parts Discussed in Thread: AM1808, SYSCONFIG

我是用openocd调试AM1808,在init文件里面初始化PLL0和PLL1,初始化PLL0时,发现设置PLLCMD的GO位时,仿真器死机了,

提示如下

Warn : Bad value '01C11104' captured during DR or IR scan:

Warn :  check_value: 0x00000009

Warn :  check_mask: 0x00000009 Error: JTAG error while reading cpsr

我设置PLLM=24,PLLPOSTDIV=1,PLL的频率为600M,输出为300M

我把这个配置数据加载到PLL1,可以正常输出300M

 

我开始做了第二个实验

我把PLLCMD的GO位不操作,因为我用的缺省的DIV数据,但是执行PLLCTL里面的PLLEN位时,仿真器同样死机,提示一样

附上我的ocd命令

大家帮我看看

 

PLL1可以设置成功,PLL0不行

帮我找找原因

 

#************************************************************************* # gdb port #*************************************************************************

telnet_port 8023

gdb_port 1000

 

#*************************************************************************

# interface

#*************************************************************************

interface ft2232

ft2232_device_desc "USB<=>JTAG&RS232 A"

ft2232_layout jtagkey

ft2232_vid_pid 0x1457 0x5118

adapter_khz 500

 

#*************************************************************************

# chip name

#*************************************************************************

if { [info exists CHIPNAME] } {

   set _CHIPNAME $CHIPNAME

} else {

   set _CHIPNAME omapl138

}

 

source [find target/icepick.cfg]

 

# Subsidiary TAP: ARM ETB11, with scan chain for 4K of ETM trace buffer

if { [info exists ETB_TAPID] } {

   set _ETB_TAPID $ETB_TAPID

} else {

   set _ETB_TAPID 0x2B900F0F

}

jtag newtap $_CHIPNAME etb -irlen 4 -irmask 0xF -expected-id $_ETB_TAPID -disable

jtag configure $_CHIPNAME.etb -event tap-enable "icepick_c_tapenable $_CHIPNAME.jrc 3"

 

# Subsidiary TAP: ARM926ejs with scan chains for ARM Debug, EmbeddedICE-RT, ETM.

if { [info exists CPU_TAPID] } {

   set _CPU_TAPID $CPU_TAPID

} else {

   set _CPU_TAPID 0x07926001

}

jtag newtap $_CHIPNAME arm -irlen 4 -irmask 0xF -expected-id $_CPU_TAPID -disable

jtag configure $_CHIPNAME.arm -event tap-enable "icepick_c_tapenable $_CHIPNAME.jrc 2"

 

# Primary TAP: ICEpick-C (JTAG route controller) and boundary scan

if { [info exists JRC_TAPID] } {

   set _JRC_TAPID $JRC_TAPID

} else {

   set _JRC_TAPID 0x0b7d102f

}

jtag newtap $_CHIPNAME jrc -irlen 6 -irmask 0x3F -expected-id $_JRC_TAPID -ignore-version

jtag configure $_CHIPNAME.jrc -event setup "jtag tapenable $_CHIPNAME.etb; jtag tapenable $_CHIPNAME.arm"

 

set _TARGETNAME $_CHIPNAME.arm

 

target create $_TARGETNAME arm926ejs -chain-position $_TARGETNAME

# $_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 0x2000

$_TARGETNAME configure -work-area-phys 0xFFFF0000 -work-area-size 0x2000

 

$_TARGETNAME configure -event "reset-start" { adapter_khz 500 }

 

arm7_9 fast_memory_access enable

arm7_9 dcc_downloads enable

 

etm config $_TARGETNAME 16 normal full etb

etb config $_TARGETNAME $_CHIPNAME.etb

 

gdb_breakpoint_override hard

arm7_9 dbgrq enable

 

reset_config trst_and_srst separate

proc mrw {reg} {

 set value ""

 mem2array value 32 $reg 1

 return $value(0)

}

 

#*************************************************************************

# phyaddr define

#*************************************************************************

global AM1808

set AM1808 [ dict create ]

 

dict set AM1808 pllc1      0x01C11000

dict set AM1808 pllc2      0x01E1A000

dict set AM1808 psc0      0x01C10000

dict set AM1808 psc1      0x01E27000

 

proc pll0_setup {pll_addr mult} {

    mdw 0x01C11000

    #############################################################

    # init pll_ctrl_addr

    set pll_ctrl_addr [expr $pll_addr + 0x100]

 set pll_ctrl [mrw $pll_ctrl_addr]

 

 #############################################################

    # 1 - clear CLKMODE (bit 8) iff using on-chip oscillator

 # NOTE: this assumes we should clear that bit

    set pll_ctrl [ expr $pll_ctrl  & ~0x100 ]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear CLKMODE BIT8"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 2 - clear EXTCLKSRC (bit 9) for Use OSCIN for the PLL bypass clock

 set pll_ctrl [expr $pll_ctrl & ~0x0200]

 mww $pll_ctrl_addr $pll_ctrl

    echo "EXTCLKSRC BIT9"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 3 - clear PLLENSRC BIT5 for This bit must be cleared before the PLLEN bit will have any effect

 set pll_ctrl [expr $pll_ctrl & ~0x0020]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear PLLENSRC (bit 5)"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 4 - clear PLLEN BIT0 enter bypass mode

 set pll_ctrl [expr $pll_ctrl & ~0x0001]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear PLLEN (bit 0) for bypass"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 5 - wait at least 4 refclk cycles

 sleep 1

 

 #############################################################

    # 6 - clear PLLRST BIT3 for PLL0 reset is asserted

 set pll_ctrl [expr $pll_ctrl & ~0x0008]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear PLLRST BIT3 reset"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 8 - clear PLLPWRDN BIT1 for PLL0 is operating

 set pll_ctrl [expr $pll_ctrl & ~0x0002]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear PLLPWRDN BIT1 run"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 10 write prediv, postdiv, and pllm

    set div [expr 0x8000 | 0]

    mww [expr $pll_addr + 0x0114] $div

    echo "set prediv"

    mdw [expr $pll_addr + 0x0114]

   

    #############################################################

    # 10 write pllm

 mww [expr $pll_addr + 0x0110] [expr ($mult - 1) & 0xFF]

    echo "set pllm"

    mdw [expr $pll_addr + 0x0110]

   

    #############################################################

    # 10 write postdiv

    set div [expr 0x8000 | 1]

    mww [expr $pll_addr + 0x0128] $div

    echo "set postdiv"

    mdw [expr $pll_addr + 0x0128]

    mdw [expr $pll_addr + 0x0118]

    mdw [expr $pll_addr + 0x011C]

    mdw [expr $pll_addr + 0x0120]

    mdw [expr $pll_addr + 0x0160]

    mdw [expr $pll_addr + 0x0164]

    mdw [expr $pll_addr + 0x0168]

    mdw [expr $pll_addr + 0x016C]

 

   

    #############################################################

    # write go CMD

 # mww [expr $pll_addr + 0x0138] 0x01

    # sleep 800

    # echo "set CMD go"

    # mdw [expr $pll_addr + 0x0138]

 

 #############################################################

    # 11 - wait at least 5 usec for reset to finish

    sleep 20

 

 #############################################################

    # 12 set PLLRST BIT3

 set pll_ctrl [expr $pll_ctrl | 0x0008]

 mww $pll_ctrl_addr $pll_ctrl

    echo "set PLLRST BIT3 out reset"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 13 - wait at least 8000 refclk cycles for PLL to lock

 sleep 800

 

 #############################################################

    # 14 - set PLLEN BIT0 leave bypass mode

 set pll_ctrl [expr $pll_ctrl | 0x0001]

 mww $pll_ctrl_addr $pll_ctrl

    echo "step set PLLEN BIT0 enable PLL"

    mdw $pll_ctrl_addr

}

 

proc pll1_setup {pll_addr mult} {

 mdw 0x01E1A000

    #############################################################

    # PLLC1 init

    set pll_ctrl_addr [expr $pll_addr + 0x100]

 set pll_ctrl [mrw $pll_ctrl_addr]

    mdw $pll_ctrl_addr

 

 #############################################################

    # 1 - clear PLLENSRC (bit 5) for This bit must be cleared before the PLLEN bit will have any effect

 set pll_ctrl [expr $pll_ctrl & ~0x0020]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear PLLENSRC BIT5"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 2 - clear PLLEN (bit 0) ... enter bypass mode

 set pll_ctrl [expr $pll_ctrl & ~0x0001]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear PLLEN BIT0"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 3 - wait at least 4 refclk cycles

 sleep 1

 

 #############################################################

    # 4 - clear PLLRST (bit 3) for PLL0 reset is asserted

 set pll_ctrl [expr $pll_ctrl & ~0x0008]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear PLLRST BIT3 for reset"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 6 - clear PLLPWRDN (bit 1) for PLL0 is operating

 set pll_ctrl [expr $pll_ctrl & ~0x0002]

 mww $pll_ctrl_addr $pll_ctrl

    echo "clear PLLPWRDN BIT1 for powerup"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 8 - optional: write pllm

 mww [expr $pll_addr + 0x0110] [expr ($mult - 1) & 0xFF]

    echo "set PLLM"

    mdw [expr $pll_addr + 0x0110]

    #############################################################

    # 9 optional: write postdiv

    set div [expr 0x8000 | 1]

    mww [expr $pll_addr + 0x0128] $div

    echo "set postdiv"

    mdw [expr $pll_addr + 0x0128]

    mww [expr $pll_addr + 0x0118] 0x8000

    mww [expr $pll_addr + 0x011C] 0x8001

    mww [expr $pll_addr + 0x0120] 0x8002

    mdw [expr $pll_addr + 0x0118]

    mdw [expr $pll_addr + 0x011C]

    mdw [expr $pll_addr + 0x0120]

 

 #############################################################

    # set CMD go

    mww [expr $pll_addr + 0x0138] 0x01

    sleep 8

    echo "set CDM go end"

    mdw [expr $pll_addr + 0x0138]

 

 #############################################################

    #  10 - wait at least 5 usec for reset to finish

 sleep 1

 

 #############################################################

    #  11 - set PLLRST BIT3

 set pll_ctrl [expr $pll_ctrl | 0x0008]

 mww $pll_ctrl_addr $pll_ctrl

    echo "set PLLPWRDN BIT3 for exit reset"

    mdw $pll_ctrl_addr

 

 #############################################################

    # 13 - wait at least 8000 refclk cycles for PLL to lock

 sleep 800

 

 #############################################################

    # 14 - set PLLEN BIT0 ... leave bypass mode

 set pll_ctrl [expr $pll_ctrl | 0x0001]

 mww $pll_ctrl_addr $pll_ctrl

    echo "set PLLEN bit0"

    mdw $pll_ctrl_addr

   

    #############################################################

    # 14 OBSCLK enable

    mww [expr $pll_addr + 0x0148] 0x2

}

 

proc am1808_init {} {

 global AM1808

    echo "Initialize AM1808 board"

    set sysconfig_addr  0x01C14000

    #############################################################

    # unlock sysconfig

    mww [expr $sysconfig_addr + 0x038] 0x83E70B13

    mww [expr $sysconfig_addr + 0x03C] 0x95A4F1E0

    #############################################################

    # setup the CLKOUT pin

    set pinmux13  [mrw [expr $sysconfig_addr + 0x154]]

    set pinmux13 [expr $pinmux13 &~(0xF<<0x4)]

    set pinmux13 [expr $pinmux13 | (0x1<<0x4)]

    mww [expr $sysconfig_addr + 0x154] $pinmux13

    mdw [expr $sysconfig_addr + 0x154]

    #############################################################

    # PLLC0 OBSCLK for PLL1C

    set pll0_base_addr 0x01C11000

    mww [expr $pll0_base_addr + 0x0104] 0x1E

    echo "set PLL0 OBSCLK for"

    mdw [expr $pll0_base_addr + 0x0104]

    #############################################################

    # unclok PLLC1

    set sysconfig_cfg3 [mrw [expr $sysconfig_addr + 0x188]]

    set sysconfig_cfg3 [expr $sysconfig_cfg3 & ~0x20]

    mww [expr $sysconfig_addr + 0x188] $sysconfig_cfg3

    mdw [expr $sysconfig_addr + 0x188]

   

    #############################################################

    # init PLLC1

    set addr [dict get $AM1808 pllc2]

 pll1_setup $addr 25

    #############################################################

    # unclok PLLC0

    set sysconfig_cfg0 [mrw [expr $sysconfig_addr + 0x17C]]

    set sysconfig_cfg0 [expr $sysconfig_cfg0 & ~0x10]

    mww [expr $sysconfig_addr + 0x17C] $sysconfig_cfg0

    mdw [expr $sysconfig_addr + 0x17C]

   

    #############################################################

    # init PLLC0

    set addr [dict get $AM1808 pllc1]

 pll0_setup $addr 25

   

    #############################################################

    # PLLC0 OBSCLK for PLL1C

    set pll1_base_addr 0x01E1A000

    mww [expr $pll1_base_addr + 0x0104] 0x19

    mdw [expr $pll1_base_addr + 0x0104]

}

 

proc gdb { } {

    jtag_reset 0 1

    sleep 2

    jtag_reset 0 0

 halt

 wait_halt

 am1808_init

    reg pc 0x80002000

}

 

  • 上面这些配置看不懂,处理过类似问题是由于CVDD供电不足导致配置PLL0后CVDD电流需求迅速增加,从而导致CVDD不稳,所以导致芯片工作不正常,所以建议修改一下CVDD的供电,或者用一个外部电源供电来验证我的推测。