TI论坛
直播中

李伟嘉

7年用户 177经验值
私信 关注
[问答]

TMS320C5517 片上ROM中的bootloader问题,求解决

我用的TMS320C5517的评估板,配置文件如下
-boot
-v5505
-serial8

-reg_config 0x1c02,0x0000
-reg_config 0x1c03,0x0000
-reg_config 0x1c1f,0x0000
-reg_config 0x1c20,0x1000
-reg_config 0x1c21,0x0005
-reg_config 0x1c23,0x0000
-reg_config 0x1c22,0x0010
-reg_config 0x1c20,0x6300
-delay 0xfffe
-reg_config 0x1c1f,0x0001

-reg_config 0x1c00,0x1400
-reg_config 0x1c1e,0x0001
-delay 0xffff
-reg_config 0x1c04,0x0020
-reg_config 0x1c05,0x0002
-delay 0x200
-reg_config 0x1c1e,0x0001
-reg_config 0x1c33,0x0000
-reg_config 0x1020,0x4510
-reg_config 0x1021,0x3911
-reg_config 0x103c,0x000b
-reg_config 0x100c,0x030d
-reg_config 0x1008,0x4720
-reg_config 0x1009,0x0001
-delay 0x200
-reg_config 0x100c,0x030d
-delay 0x200
-b
-o .CSL_I2S_AudioCodec_DMA.bin
.CSL_I2S_AudioCodec_DMA.out
我将生成的bin文件烧到了到了板子上的mcspi_flah上,bootloader无法正常加载程序,但是将配置文件里的-reg_config 0x1c05,0x0002去掉,也就是不复位EMIF接口,就可以正常工作,这是为什么啊?

补充一下,因为以后想在外部的SDRAM运行程序,所以需要在bootloader中将,EMIF接口配置好。但是发现只要在配置文件中一复位EMIF接口,bootloader就无法加载映像文件,使用给的bootdemo的例子也试过只要在配置文件中复位EMIF接口就无法正常加载,使用仿真看过bootload一直在下面的程序中循环:

ff4709: a9511815 MOV port(#01815h),AR1
ff470d: 5290 MOV AR1,HI(AC0)
ff470f: da51001814 OR port(#01814h),AC0,AC0
ff4714: 0410f2 BCC #0xff4709,AC0 != #0

回帖(17)

余少虹

2018-7-30 08:27:50
ROM bootloader初始化时会enable timer, 在reset EMIF口的同时,也reset了timer, 所以会一直在上面那段读timer寄存器的代码里运行。这个要写二次bootloader来避免。请参考下面的E2E上的帖子。
https://e2e.ti.com/support/dsp/c5000/f/109/p/148852/539641#539641
https://e2e.ti.com/support/dsp/c5000/f/109/p/132583/480099#480099
举报

李伟嘉

2018-7-30 08:37:07
引用: vuywsdfwf 发表于 2018-7-30 08:27
ROM bootloader初始化时会enable timer, 在reset EMIF口的同时,也reset了timer, 所以会一直在上面那段读timer寄存器的代码里运行。这个要写二次bootloader来避免。请参考下面的E2E上的帖子。
https://e2e.ti.com/support/dsp/c5000/f/109/p/148852/539641#539641
https://e2e.ti.com/support/dsp/c5000/f/109/p/132583/480 ...

我写过一个二次bootloader,是用C语言写的,仿真的时候后可以正常的引导我烧到mcspi flash中的bin文件,但是我把这个二次bootloader的bin文件烧到nor flash中,然后用ROM的中的bootloader加载二次bootloader再加载mcspi flash中的bin程序就出错了,后来发现是ROM中的bootloader加载二次bootloader后,二次bootloader运行出错,程序一运行到二次bootloader的mcspi初始化程序就会出错,不进行mcspi 初始化程序,二次bootloader可以正常运行,但是由于没有初始化mcspi所以也不会正确加载mcspi中的bin文件,但是二次bootloader确实正确运行起来了。这个很奇怪,我仿真的时候二次bootloader是可以正常工作的,我的mcspi初始化如下:

#define SYS_PRCNTR *(volatile ioport Uint16*)(0x1c04)
#define SYS_PRCNTRLR *(volatile ioport Uint16*)(0x1c05)
#define MCSPI_BASE                  0x3400
#define MCSPI_MODULCTRLL *(volatile ioport Uint16*)( MCSPI_BASE + 0x128 )
#define MCSPI_CH0CONFL *(volatile ioport Uint16*)( MCSPI_BASE + 0x12C )
#define MCSPI_CH0CONFU *(volatile ioport Uint16*)( MCSPI_BASE + 0x12D )
void spirom_init( )
[
volatile unsigned int i;
/* Reset SPI */

SYS_PRCNTR = 0x20;
SYS_PRCNTRLR |= 0x0020;
for(i = 0; i < 0x200; i++)
asm(" nop");
/* Configure MCSPI Module */
MCSPI_MODULCTRLL = 0
| ( 0 << 8 ) // Data managed by MCSPI_TX(i) and MCSPI_RX(i) registers
| ( 0 << 7 ) // Multiple word access disabled
| ( 0 << 4 ) // No delay for first spi transfer
| ( 0 << 3 ) // Functional mode
| ( 0 << 2 ) // Master
| ( 0 << 1 ) // SPIEN is used as a chip select
| ( 1 << 0 );// Only one channel will be used in master mode


MCSPI_CH0CONFL = 0
| ( 0 << 15 ) // DMA Read Request disabled
| ( 0 << 14 ) // DMA Write Request disabled
| ( 0 << 12 ) // Transmit and Receive mode
| ( 7 << 7 ) // SPI word length = 8
| ( 1 << 6 ) // SPIEN is held high during the active state
| ( 8 << 2 ) // CLKD = 8 Clock devider
| ( 0 << 1 ) // SPICLK is held high during the active state
| ( 0 << 0 );// Data are latched on even numbered edges of SPICLK

MCSPI_CH0CONFU = 0
| ( 0 << 13 ) // Clock divider granularity of power of two
| ( 1 << 12 ) // The buffer is used to receive data
| ( 1 << 11 ) // The buffer is used to transmit data
| ( 1 << 9 ) // 1.5 cycles between CS toggling and first or last edge of SPI clock
| ( 0 << 8 ) // Start bit polarity
| ( 0 << 7 ) // Disable start bit
| ( 0 << 4 ) // SPIEN active between SPI words
| ( 0 << 3 ) // Turbo is deactivated
| ( 1 << 2 ) // Data Line0 selected for reception
| ( 1 << 1 ) // Data Line1 selected for transmission
| ( 0 << 0 );// No transmission on Data Line0

/* Enable MCSPI channel */
MCSPI_MODULCTRLL = 0x01; // Enable Channel
举报

余少虹

2018-7-30 08:46:28
引用: 脑洞大赛2 发表于 2018-7-30 08:37
我写过一个二次bootloader,是用C语言写的,仿真的时候后可以正常的引导我烧到mcspi flash中的bin文件,但是我把这个二次bootloader的bin文件烧到nor flash中,然后用ROM的中的bootloader加载二次bootloader再加载mcspi flash中的bin程序就出错了,后来发现是ROM中的bootloader加载二次bootloader后,二次bootloader运行出 ...

建议用汇编写二次bootloader,应用程序中的_c_int00中才会建立C语言环境。
举报

李伟嘉

2018-7-30 09:06:04
引用: vuywsdfwf 发表于 2018-7-30 08:46
建议用汇编写二次bootloader,应用程序中的_c_int00中才会建立C语言环境。

好的,我试一试,多谢帮助
举报

更多回帖

发帖
×
20
完善资料,
赚取积分