您好,
最近在调试C6678 的SPI BOOT时遇到了一些问题,我用的是自己开发的板子,C6678是PG1.0的,下面是我的加载步骤:
1.编写待烧写程序,程序中专门写了一段.bootload段,分配在L2的起始地址0x00800000,此段代码的作用就是将Nor Flash(N25Q128A11)中烧写的应用代码按段读到L2中,最后再跳转到入口地址处.
2.将上面程序的.out文件用工具转换。(没有加boot parameter table).
3.将程序烧写到Nor Flash中后,BOOTMODE[12:0]=0b0000000100110.
但是,上电后,PC指针始终指向boot rom,SPI的寄存器表示SPI没有在复位状态,处于使能状态。
请问,上述步骤哪一步有问题啊?
SPI BOOT 不需要PLL fix吧?(因为 PLL 是bypass mode).
到底需不需要加bootparameter table啊?这个事情始终搞不清楚,我看Rom bootloader 中的源代码时,发现默认状态下有一个boot parameter table,但是在这个table中的option的值是0,代表boot parameter table,也就是说仍然需要用户再编写一个boot parameter table,我这样理解正确吗?
如果需要boot parameter table ,那我的参数表的格式是什么样的呢?能不能给我发一份?
由于我们的板子上没有I2C EEPROM,并且EMIF也没有外接Flash,因此目前就SPI BOOT 这种方式可行,有些着急,还请各位高手指教一下!谢谢啦!
King Wang1:
你好,
SPI BOOT不需要PLL,boot parameter table的主要目的是配置一些需要的参数,如果boot parameter table中的参数你都可以使用默认值,那么就不需要配置。
你用工具转换后的是boot table,你应该将这些table烧写到特定的位置,如I2C Boot中应该烧写在EEPROM中的(0x80 * parameter Index)的地址。其中parameter Index是在BOOTMODE中配置的。SPI的地址我没有在文档中看到,不过建议你可以按照I2C的地址去尝试。
启动Boot之后,SPI会自动从地址去读取table。然后按照Table的类型去解析Table,最后当BOOTROM侦测到MAGIC_ADDRESS不为零的时候就会结束boot。
tthnny:
回复 King Wang1:
"1.编写待烧写程序,程序中专门写了一段.bootload段,分配在L2的起始地址0x00800000,此段代码的作用就是将Nor Flash(N25Q128A11)中烧写的应用代码按段读到L2中,最后再跳转到入口地址处."
这是应用程序代码,它本身就是要从Nor flash中加载的程序吧? 为什么它还需要一个.bootload段?(将Nor Flash(N25Q128A11)中烧写的应用代码按段读到L2中,最后再跳转到入口地址处)
xiaoyan Bian:
回复 tthnny:
您好tthnny,
我们用EMIF 加载(也是外挂Nor Flash)时,这个.bootload段加上之后才能加载成功,这段代码是用汇编编写的,相当于一段引导代码,目的就是将Nor Flash中的代码按段读到DSP的L2中,并跳到入口地址处。
请问,你们板子上的SPI 加载成功了吗?如果成功了,能否给我发一份整个加载所需的东西,谢谢啦!
xiaoyan Bian:
回复 King Wang1:
您好King Wang,
我试过不加boot parameter table,直接烧写应用程序,但是不成功,如果确定可以不加boot parameter table,那这个烧写的代码应该就没有问题,问题在其他方面,我的bootmodepin[12:0]=0b0000000100110,这个设置应该也没有啥问题,因为上电之后,我用示波器测SPI管脚,有时钟信号,并且数据线也有数据,说明spi接口是正常工作的,还有就是烧写过程,这个就是将代码烧写到Nor Flash,然后再读出比较,错误数为0,这个也没有问题,三个方面都没有问题,但是加载就是不成功,请问还有什么建议吗?
Andy Yin1:
回复 xiaoyan Bian:
您好,
可以通过CCS链接看一下此时的PC寄存器指向的地方,查看相应memory看程序是否已经load成功,核实此时DSP的状态,同时对照bootloader code看一下是否理解有误,我这边也花时间对照看看再答复你。
King Wang1:
回复 Andy Yin1:
你好,
你可以使用如下方法解决:
1)查询加载后0x00800000是否有你要的代码内容。
2)查询MAGIC_ADDRESS是否为非空值。
如果两个都不是你想要的内容,那么应该是你转换成boot table或者放置到FLASH的地址不对,你可以将你转换的方式大概描述一下,或者将转换后的内容发上来大家一起讨论下!
谢谢!
xiaoyan Bian:
回复 King Wang1:
您好King Wang,
您提供的上述两种方法我都试过了,0x00800000没有我想要的内容,MAGIC_ADDRESS不是0,但也不是入口地址,这就奇怪了。
我的烧写代码如下格式:
0x00500000(boot parameter table)
0x00320000
0x40200002
0x00010018
0x00040000
0x00000000
0x03200000
0x01f40000
0x04000000
0x00000000
0x00000000
。
。
。
0x0080a050(偏移地址为0x400)
0x0080ce60(boottable)
0x00000940
0x00800230
。
。
。
上述格式是小端的格式,我试过改成大端的,还是不行(在EVM板上使用大端格式是可以加载的),这个是由TI提供的工具转换来的,偏移地址0x400处的的数据不太懂。
King Wang1:
回复 xiaoyan Bian:
你能将整个加载文档发出来么,生成文档的脚本也可以拿出来看下。比如下面的脚本(I2C out文件生成加载的脚本)
@REM generate boot table in CCS format
hex6x simple.rmd
bconvert64x -le simple.btbl simple.btbl.be
b2i2c simple.btbl.be simple.btbl.i2c
b2ccs simple.btbl.i2c simple.i2c.ccs
@REM generate the complete I2C image(I2C parameter + boot table)
myparser simple.i2c.ccs i2cconfig.txt i2cromfara.ccs
xiaoyan Bian:
回复 King Wang1:
不好意思,有事耽误了一会儿,下面附件中C6678_SPI文件夹是烧写的工程,SPIBootutility文件是转换工具,i2crom.dat是烧写的代码,烧到Nor FLASH的起始地址0x00000000.
tthnny:
回复 xiaoyan Bian:
你好,Xiaoyan Bian
根据你的描述,我觉得你的做法应该没有问题。magic address不为0,具体是多少呢?我曾经遇到类似的情况。
建议你把应用程序的.cmd修改一下,不要从L2起始地址开始映射,不妨从0x00830000开始存放程序,然后再把转换后的代码烧写到flash中,看一看结果如何?
谢谢!