各位专家们,请教个问题:
硬件平台:6670,软件平台:CCS5.5
板子是自制的6670板子,硬件采用nor flash的spi启动加载方式,DDR为2GB
CORE外部参考时钟:96MHZ,DDR外部参考时钟:96MHZ,EVM的DDR为2GB,所以针对这个,gel文件中的DDR初始化代码有改写过。
1、在no boot模式下,加载gel文件,DDR初始化和测试可以通过,text段放在DDR上,程序能正常运行,说明gel文件的DDR初始化和DDR相关的硬件没有问题
2、在spi boot模式下,加载gel文件,DDR初始化和测试失败
问题:同一个gel文件,同一个板子,为什么在no boot模式下,一切都正常,但是在spi boot模式下,DDR初始化失败?这个问题困扰很久了,希望大牛们能帮忙指导下。
谢谢了
noaming:
你好,如果spi boot模式下启动,而没有正确的boot代码运行到用户程序的话,是会出现连不上仿真器的情况。一般使用仿真器调试代码,都建议使用no boot模式的。
atower geng:
回复 noaming:
谢谢您的回复,现在的情况是可以connect上,但是gel加载的时候,DDR初始化和测试通不过。
我在spi boot模式下加载gel,是想验证spi boot下,DDR是否可以正确初始化,因为我把带RBL程序中DDR初始化的用户程序下载到nor flash(text段定义到DDR中),启动后,程序起不来,但是所以段都定义在L2上时,程序是可以正常从nor flash 通过spi 加载起来的
Andy Yin1:
回复 atower geng:
gel中会根据boot mode进行初始化,应该是只在no boot mode下才会执行DDR初始化,你可以查看gel文件获知。
在使用CCS JTAG load程序测试时,建议你不使用gel,通过将DDR初始化代码load到DSP运行进行DDR的初始化及测试,看DDR测试能否通过,如果DDR测试还是有问题,建议可以参考STK例程中的memory test程序更新DDR的初始化进行测试。
另外你说的将DDR初始化程序text段定义到DDR下载到nor flash进行加载测试,这肯定是起不来的,因为DDR都没有初始化;注意在使用DDR之前需要先对DDR初始化。
STK:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx
atower geng:
回复 Andy Yin1:
Andy Yin1,你好:
现在的应用场景是:
1、代码段和数据段定义在DDR上
2、上电后需要通过spi从nor flash 加载程序
在no boot模式下,将工具生产的dat文件通过nor write程序烧写到nor flash,然后断电转换到spi boot模式下,连接仿真器,通过memory browser查看0x80000000地址区域的数据,发现数据确实是代码段的数据了,但是不稳定,每在地址窗口按一次回车键,0x80000000后面的某些数据就变成红色,值也跟着变换,我推测是不是RBL中的DDR初始化没有完全成功,起先以为是在配置DDR的PLL时,配置的时钟过高,我在ddr configuration table中,降低pll Mul值,可这样还是没有作用。
同样的程序和流程,在EVM板上是正常启动的,通过对比自制板和EVM板,发现spi boot模式下上电启动后,EVM板的DDR3PLLCTL0寄存器的bit23为1,而自制板的DDR3PLLCTL0寄存器的bit23为0。此bit位表示Enable bypass mode ,0 = Bypass disabled, 1 = Bypass enabled,会不会是这个导致自制板的DDR初始化不成功?还望高手们指导指导,谢谢了
Andy Yin1:
回复 atower geng:
在加载程序到DDR之前,你的DDR初始化是在哪一步做的,具体是怎么做的?感觉你在加载程序到DDR之前没有初始化DDR。
上电后默认情况下RBL不会对DDR进行初始化,如果要将程序下载到DDR,在spi boot mode下,可以分两级加载,先加载第一个程序到LL2或SL2进行DDR的初始化,然后重新进入RBL加载另一组spi boot parameter及image到DDR运行。推荐参考如下流程进行DDR初始化及程序加载:
1、首先是处理2段程序的boot参数表,将第1个程序的boot参数表放在NOR FLASH的0x00~0x7f,第2个程序的boot参数表放在NOR FLASH的0x80~0xff,2个参数表中需要定义好各自应用程序在FLASH中放置的入口地址。
2、按照第1步中的各段地址空间的设置,将boot参数表和应用程序烧写到对应的FLASH空间上。
3、DSP硬件复位时,设置GPIO为0001 0100 0000 1101,这样可以让RBL首先加载第1个程序的boot参数表,且正确启动第1个应用程序。
4、第一个应用程完成的功能是初始化DDR控制器、设置DEVSTAT寄存器、清零boot magic地址以及跳转到RBL入口,这个过程注意的是设置DEVSTAT寄存器时,必须正确设置 DEVSTAT[7:6],使得RBL能正确加载到第2个boot参数表,由于我的第2个boot参数表是放置在 0x80~0xff上的,因此对 DEVSTAT[7:6]设置为01,boot参数表的地址与 DEVSTAT[7:6]的关系式 address = DEVSTAT[7:6] x 128。
通过以上几点,就能可以让第2个应用程序,也就是我们真正要运行的应用程序可以放在DDR中运行了。
其他SPI boot例程:
SPI boot例程:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/46608.aspx
SPI DDR boot:http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/p/229915/839499.aspx#839499
atower geng:
回复 Andy Yin1:
Andy Yin1 ,你好,谢谢的回复。
hex6x simple.rmdAddDdrTable6670 simple.btblb2i2c_ex simple.btbl simple.btbl.i2cb2ccs_ex simple.btbl.i2c simple.i2c.ccsromparse nysh.spi.mapmodify i2crom.ccs spirom_le.dat
这是我的bat批处理文件,AddDdrTable6670 simple.btbl,这一步,是将ddr configuration table写到Boot Table文件里,也就是用ddr configuration table的参数来对DDR做初始化,AddDdrTable6670 这个exe文件,是我在网上找的,根据我们板子上DDR的情况,更改源码后,重新生成的exe文件。
对于 Andy Yin1你上面讲的那种方法,有些地方不是很明白,是否有类似的例程可做参考。
谢谢了
atower geng:
回复 Andy Yin1:
有些不理解的地方:
1、首先是处理2段程序的boot参数表,将第1个程序的boot参数表放在NOR FLASH的0x00~0x7f,第2个程序的boot参数表放在NOR FLASH的0x80~0xff,2个参数表中需要定义好各自应用程序在FLASH中放置的入口地址。
疑问:怎么将第1个程序的boot参数表放在NOR FLASH的0x00~0x7f,第2个程序的boot参数表放在NOR FLASH的0x80~0xff?是否需要将两个程序合并成一个文件再烧写到flash中去?
4、第一个应用程完成的功能是初始化DDR控制器、设置DEVSTAT寄存器、清零boot magic地址以及跳转到RBL入口,这个过程注意的是设置DEVSTAT寄存器时,必须正确设置 DEVSTAT[7:6],使得RBL能正确加载到第2个boot参数表,由于我的第2个boot参数表是放置在 0x80~0xff上的,因此对 DEVSTAT[7:6]设置为01,boot参数表的地址与 DEVSTAT[7:6]的关系式 address = DEVSTAT[7:6] x 128。
疑问:必须正确设置 DEVSTAT[7:6],这是需要在第一个程序中,用代码来设置吗?我查看了文档,DEVSTAT[7:6],这个域是干嘛用的,文档中的描述如下:
指的是Parameter Table Index这个字段吗?
希望Andy Yin1或其他专家们多多指导,谢谢
Andy Yin1:
回复 atower geng:
1. 在烧写flash时,可以指定flash地址,两个boot parameter table可以合在一起,也可以单独烧写;
2 DEVSTAT[7:6]是parameter table index,用来指定计算spi 读取boot parameter table的地址=parameter table index * 128B,这是参考RBL源码得到的,与user guide不匹配,以RBL源码为准,RBL源码:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/6352.aspx