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.

TMS320VC5509通过EHPI 下载程序的问题,求教!!

通过EHPI接口下载程序到5509a,项目中CPU和c5509a之间是16位的HPI接口,非复用模式。

下载程序的过程基本上是按照SPRA375F的顺序来做的:

1.将5509a芯片复位:reset引脚拉高;

2.通过EHPI接口将bin文件写入到EHPI接口可以操作的DRAM中:通过仿真器看memory view,从入口地址开始一个个字节比对,是写成功的。

3.将程序入口地址和非0等待标志写入0x60、0x61地址处。

现在的问题是在第3步:

从memory view上,看到0x60地址值是0x0000,0x0000。
用仿真器跟踪,程序也是一直在如下循环里。
FF80EE a4c0                     MOV @#60h,T0
FF80F0 7dff0044                 AND #65280,T0,T0
FF80F4 0404f7                   BCC #0xff80ee,T0 == #0

但是我bin文件是有写进去的。
我map文件中是 ENTRY POINT SYMBOL: "_c_int00"  address: 00002300
从仿真器看0x2300地址开始的值,一个个字节比较过去,和我的bin文件是一致的。

但是0x60地址的值却没有写进入,这是为什么呢?

我是一名新手,还希望论坛里的高手能够指点一下!万分感谢!

  • 我向0x60写入的是0xff00,向0x61写入的是0x2300.
    我目前的bin文件只有八百多字节(只是点亮led测试下)。

  • 我不确定字节序是不是对的,我的bin文件开头的几字节是 00 00 23 00 00 00 00 01
    从memory view上看到0x2300地址开始的值是 0000 2300 0000 0001

  • “从memory view上,看到0x60地址值是0x0000,0x0000。”说明host没有成功把entry point写到0x60,0x61地址,建议检查一下host那边。
  • Thanks Shine.

    (1)连上仿真器,看CCS memory view,程序从FF8000开始执行的时候,0x60地址处的值是0xff00 0x2300.
    然而执行到FF801F这步的时候,0x60地址处的值就变成了0x0000 0x0000.

    FF8000 ec314e000090 AMAR *(#00090h),XSP
    FF8006 ec315e000080 AMAR *(#00080h),XSSP
    FF800C ec316e000000 AMAR *(#00000h),XDP
    FF8012 4653 BSET ST1_C54CM
    FF8014 46b3 BSET ST1_INTM
    FF8016 4682 BCLR ST1_SXMD
    FF8018 46e2 BCLR ST1_CPL
    FF801A 3c01 MOV #0,AC1
    FF801C ebc018 MOV AC1,dbl(@#60h)--------经过这步0x60地址处的值就变成了0x0000 0x0000.
    FF801F e651103401 MOV #16,port(#03401h)
    FF8024 e651103400 MOV #16,port(#03400h)
    FF8029 a7513401 MOV port(#03401h),T3

    我操作步骤是:开机让Host加载完毕并往0x61处写0x2300、往0x60处写0xff00后,然后再连仿真器并选择CCS的connect,这个步骤对吗?
    如果反过来,先连仿真器并选择CCS的connect,再Host加载完毕并往0x61处写0x2300、往0x60处写0xff00,会出现Host HPI写失败。


    (2)由于执行到FF801F这步的时候,0x60地址处的值就变成了0x0000 0x0000.所以我直接操作CCS的Edit memory,将0x61h写入0x2300,将0x60h写入0xff00,
    然后F10单步运行,可以跑到_c_int00、_args_main,但是跑到002421这步的时候,PC突然被赋值为45cd51,程序跑飞了.

    00240C _args_main:
    00240C 5e80_5f80 NOP_16 || NOP_16
    002410 000000 RPTCC #0, AC0 == #0
    002413 3a00 POP AC0,AC0
    002415 00258a RPTCC #138, T1 < #0
    002418 000100 RPTCC #0, AC1 == #0
    00241B 127a00 CMPOR T3 >= AC0, TC1, TC1
    00241E 000000 RPTCC #0, AC0 == #0
    002421 020012 RETCC AC0 == #0-------------跑到这步时,PC跑飞了
    002424 bc00 MOV HI(AC0),@#00h
    002426 000000 RPTCC #0, AC0 == #0
    002429 000002 RPTCC #2, AC0 == #0
    00242C 0012be RPTCC #190, AC2 != #0
    00242F 000000 RPTCC #0, AC0 == #0
    002432 000000 RPTCC #0, AC0 == #0
    002435 020012 RETCC AC0 == #0
    002438 c000 MOV AC0,@#00h
    00243A 000024 RPTCC #36, AC0 == #0
    00243D 0a0002 RPTBLOCAL #0x002442
    002440 0012c2 RPTCC #194, AC2 != #0
    002443 000000 RPTCC #0, AC0 == #0
    002446 240a ADD AC0,AR2

    想问下:
    为什么跑到_args_main,执行RETCC AC0 == #0这条命令后,程序就跑飞了,是什么原因呢?

  • 没有vectors.asm这个文件,会导致执行RETCC AC0 == #0这条命令后,程序跑飞吗?
    还是我的堆栈没有初始化好呢?
  • 先连仿真器,然后在判断0x60,0x61是否为非0值的地方设个断点运行,host往DSP加载代码,看断点处能否停下来。
  • 工程里没有vectors.asm?
  • Thanks Shine.

    1.先连仿真器,然后在判断0x60,0x61是否为非0值的地方设个断点运行,host往DSP加载代码,看断点处能否停下来。
    --断点处全速运行,在host加载完之后,ccs会弹出一个出错界面"仿真器连接失败,超时",然后仿真器就disconnect了。

    2.我的工程里没有vectors.asm.

    3.想问下_args_main()里运行到RETCC后跑飞,是什么原因呢?
  • Thanks Shine.

    我现在改用-a ASCII格式,生成的ehpi16.asc总共2622字节,我去掉了最开头的5个字节,将后面的2617个字节加载到5509中。

    连仿真器,通过CCS跟踪,按照如下的顺序一路跑下来:
    002300 _c_int00, __text, .text:
    00233B exit:
    00239B atexit:
    0023F1 abort:
    0023F2 C$$EXIT:
    0023F8 $vectors.asm:67:69$:
    0023FA _register_unlock:
    002402 _register_lock:
    00240A _nop:
    00240C _args_main:
    002448 _auto_init:
    0024AA DSPRunLed:
    0024DB C$L1:
    0024DD main:
    0024EC C$L2, C$DW$L$_main$2$B:
    0024F1 C$DW$L$_main$2$E:
    0024F2 __etext, etext:
    最后停在002D39这步,并一直循环执行这步:002D39 00921d RPTCC #29, AC2 != #0

    我计算了下:002D39-002300 = 000A39 = 2617,正好是我下载的总字节数。

    我有三个问题:
    (1)ASCII文件第一行是地址信息, 不用加载,那么:应该从asc文件的第几个字节开始加载?
    (2)我的main()是一个while(1)循环,但是从仿真器跟踪结果是:这个while(1)循环只执行了一遍就跳出来了,
    我还是试了下把while(1)改成for()循环,也是只执行了一遍,为什么循环不起作用呢?
    (3)我是在main()中循环调用DSPRunLed(),但是从仿真器跟踪结果是:先跑了DSPRunLed(),再跑main(),这个顺序完全是按照段的地址顺序。从仿真器看main这段的汇编,并没有类似call DSPRunLed,函数的调用关系为什么失效呢?

  • 请求支援!
    实在是不知道可以怎么调了,仿真器跟踪的从入口点开始的每条命令都是boot命令生成的asc文件,而boot命令是完全按照spra375f来的。贵司5509真的支持hpi口引导吗?
  • ascii的格式描述在汇编器手册上有讲13.13.1 ASCII-Hex Object Format (--ascii Option)。
    www.ti.com/.../spru280i.pdf

    看一下编译工程的时候,不要使用-cr选项。
  • 非常感谢您的回复!
    1. 从spru280i文档来看,应该是将asc文件的前11个字节截掉,同时把最后一个字节截掉,中间的部分加载进去,对吧?
    2.我用的是ccs3.3, 没有-cr选项呢
  • 用-b -boot选项生成bin是相对简洁的。

    另外,对照一下从CCS 下载后的memory值与从HPI下载后memory的值,看binary转换是否有问题。

  • user5871948 说:
    贵司5509真的支持hpi口引导吗?

    确定真的支持,好多用C5509的用的是HPI boot.

  • 我将asc文件的前11字节去掉,把最后一个字节去掉,中间的部分加载就去,结果还是一样呢,main()不会调用DSPRunLed().
    我的ccs3.3的编译选项是-g -fr"$(Proj_dir)\Debug" -d"_DEBUG" -ml
    链接选项是-c -m".\Debug\Led.map" -o"\Debug\Led.out" -w -x
  • user5871948 说:
    然后在判断0x60,0x61是否为非0值的地方设个断点运行

    host访问这两个地址应该要乘以2, 即0xC0, 0xC2

  • 另外,对照一下从CCS 下载后的memory值与从HPI下载后memory的值,看binary转换是否有问题。
    -------我没看懂这句话,"从CCS下载"是file->load program??

    我没有从CCS 下载到memory。调试过程是:把仿真器连上,选择debug->Reset CPU。查看PC寄存器地址应该在0xff8000,这是bootloader源代码在ROM中的位置,选择file->load symbols->load symbols only,然后选择out文件,这样只载入符号定义,便于调试,然后单步执行(F11),就可以跟踪整个boot过程
  • host访问这两个地址应该要乘以2, 即0xC0, 0xC2
    -----host访问是word address,而非byte address吧。我从CCS view memory 0x60看到的是0xff00 2300
    应该没有错吧
  • user5871948 说:
    我没有从CCS 下载到memory。调试过程是:把仿真器连上,选择debug->Reset CPU。查看PC寄存器地址应该在0xff8000,这是bootloader源代码在ROM中的位置,选择file->load symbols->load symbols only,然后选择out文件,这样只载入符号定义,便于调试,然后单步执行(F11),就可以跟踪整个boot过程

    那就按我说的做一下吧。从CCS load program,大概记一下_c_int00位置,以及main位置的内存的值。再从host 通过hpi加载后,再连接仿真器看一下相应位置的值,看是否一致。

  • user5871948 说:
    我从CCS view memory 0x60看到的是0xff00 2300
    应该没有错吧

    我看你前面的贴子不是说看到的是0吗?

    你在map文件里看的entry point是byte address吧。而在CCS memory view里如果是在数据空间看则是word address,从程序空间看才是byte address。

    这个C5000的空间老是把我搞晕。

    你是用的数据地址复用模式,还是非复用模式?

  • 不一致

    (1)从CCS load program,_c_int00和main位置的值是:

    002300          _c_int00, __text, .text:
    002300 ec314e000900             AMAR *(#00900h),XSP
    002306 ec315e001100             AMAR *(#01100h),XSSP
    00230C f406f91f_98              AND #63775,mmap(@ST1_55)
    002311 f5064100_98              OR #16640,mmap(@ST1_55)
    002316 f496fa00_98              AND #64000,mmap(@ST2_55)
    00231B f5968000_98              OR #32768,mmap(@ST2_55)
    002320 4656                     BCLR ST3_SATA
    002322 4617                     BSET ST3_SMUL
    002324 160000                   MOV #0,DPH
    002327 160001                   MOV #0,MDP05
    00232A 160002                   MOV #0,MDP67
    00232D 6c002448                 CALL _auto_init
    002331 6c00240c                 CALL _args_main
    002335 3c19                     MOV #1,AR1
    002337 6c00233b                 CALL exit

    0024DD          main:
    0024DD 4eff                     AADD #-1,SP
    0024DF 763401b8                 MOV #13313,AR3
    0024E3 a961_99                  MOV port(*AR3),AR1
    0024E6 ec0c90                   BSET @#06h,AR1
    0024E9 c961_9a                  MOV AR1,port(*AR3)


    (2)而我的ehpi16.bin文件开头是
    00 00 23 00 00 00 00 00 00 00 01 00 00 00 22 00
    CA 00 23 00 5E 80 5F 80 EA 00 23 F8 5E 80 5F 80
    这些字节会写到5509的入口地址0x2300处。也就是说从host 通过hpi加载后,再连接仿真器看到的值是这个。

    002300          _c_int00, __text, .text:
    002300 000023                   RPTCC #35, AC0 == #0
    002303 000000                   RPTCC #0, AC0 == #0
    002306 000000                   RPTCC #0, AC0 == #0
    002309 000100                   RPTCC #0, AC1 == #0
    00230C 000022                   RPTCC #34, AC0 == #0
    00230F 00ca00_2300              RPTCC #0, AR2 > #0 || MOV AC0,AC0
    002314 5e80_5f80                NOP_16 || NOP_16
    002318 ea0023                   MOV HI(AC0 << #-29),@#00h
    00231B f85e805f                 MACMKR T3 = @#2fh,#-128,AC1,AC1
    00231F 80ea00_23f8              MOV dbl(*AR7-),dbl(*AR4) || MOV AR7,AR0
    002324 5e80_5f80                NOP_16 || NOP_16
    002328 ea0023                   MOV HI(AC0 << #-29),@#00h
    00232B f85e805f                 MACMKR T3 = @#2fh,#-128,AC1,AC1
    00232F 80ea00_23f8              MOV dbl(*AR7-),dbl(*AR4) || MOV AR7,AR0
    002334 5e80_5f80                NOP_16 || NOP_16
    002338 ea0023                   MOV HI(AC0 << #-29),@#00h


    0024DD          main:
    0024DD 6400                     BCC #0x0024e7,AC0 == #0
    0024DF ed31080012bc             MOV dbl(*(#012bch)),AC0
    0024E5 9200                     CALL AC0
    0024E7 ed31080012c2             MOV dbl(*(#012c2h)),AC0

    (3)生成bin的命令是:
    -boot
    -v5510:2
    -memwidth 8
    -romwidth 16
    -map ehpi16.mxp
    Led.out
    -b
    -o ehpi16.bin

    (4)我使用的hex55的版本号是TMS320C55x COFF/Hex Converter v3.3.2

  • 从上面看,bin文件不对, 还是加一个-parallel16选项吧,反正是生成一个boot table,与具体选择的哪种模式没有关系。加-boot ,-b的转换结果应该00 23开头,然后是长度,再是数据,长度,数据这样的一张表,最后以0000结尾。

    方便把.out贴上来我转一下试试。

  • 选择插入文件。

  • 这里有个工具用来转换的。

  • 由于Led.out这个后缀我上传失败,所以我把Let.out这个文件后缀名改了下,改为了Led.pdf,就是Led.out哈。

    还请帮忙转一下,谢谢!

  • 见下图我通过工具与hex55x转换的bin的对比,内容是一样的。注意大小端数序,以及文件格式

  • 再进一步看这个bin, _c_int00的位置:

  • 所以应该从文件哪个位置开始,写入到5509的哪个地址呢?
    如果还是像之前一样,从文件的最开始第一个字节,往5509 入口地址0x2300写入的话,那么程序运行到地址002300的时候,就是机器码002300,而不是ec314e000900

  • 图中已有文件格式信息了。再仔细看一下。
  • 上图是我的调试窗口,如果是把bin文件的第一个字节写入5509程序入口地址0x2300. 结果就是运行到002300的时候,机器码是000023

  • 难道是从bin文件的第16个字节开始往5509的0x2200地址开始写?
  • 你好!bin文件格式我大概能看明白,段长度,段起址,段数据的格式。

    但是bin文件从哪开始,加载到哪个地址,我还是不太明白。ec314e000900是在bin文件的第0x015a个字节处,如果要使2300地址的机器码为ec314e000900,那我应该把bin文件加载到0x2300-0x015a处?

  • 还是我要解析bin文件的各个段的长度、起址,然后根据每个段的起址和长度写到5509的相应地方?可是spec上没有这么写呀
  • 搞定了,是把boot命令改成bootorg

    感谢贵司的support!

  • user5871948 说:
    bin文件格式我大概能看明白,段长度,段起址,段数据的格式。

    段地址就是要加载到的目的地址。

  • 好的,谢谢!
    通过比较从CCS load program后的memory值和bin文件对比,以及实测结果,发现编译选项-cr成功,-c反而失败。
    此问题已解决,感谢贵司的帮助!