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.

C6713 BOOT引导失败,诡异不断,请求指点!



项目中使用的是EMIF CS1上面的一个Flash,其中地址A20~A23使用GPIO方式控制,不过因为这段程序只有38KB,所以这几个地址均为0,A24的话是因为板卡上面有两个Flash,通过CPLD进行片选使能,我的BOOT程序放到了Flash0上面,也就是A24应该为0。这块Flash为16位宽。因此我在boot_loop的时候,都是按16位宽从Flash中读数,然后又以16位宽的方式写到了RAM中去。

BOOT部分占用IRAM前1024字节,因此在Flash和IRAM中,我都是从各自0x400的地址搬移数据,然后跳转到c_int地址去运行。

因为只用到了CE1,以后可能会使用下CE0上面的CPLD在引导时做些状态标记,所以EMIF初始化部分只进行了CE0和CE1的初始化工作。代码实现如下:

;
;  ======== boot_c671x.s62 ========
;
            .title  "Flash bootup utility"
            .option D,T
            .length 130
            .width  140
; global EMIF symbols defined for the c671x family
            .include  boot_c671x.h62
			.sect ".boot_load"
			.global _boot
			.ref _c_int00

;Flash Boot配置信息相关定义
FLASH_BOOT_COPY_STARTADDR	.equ 0x90000400
FLASH_BOOT_BINSIZE			.equ 0x000FFC00
RAM_BOOT_COPY_STARTADDR		.equ 0x00000400

CPLD_CFG_LED_ADDR			.equ 0x80180020
CPLD_CFG_LED_LIGTHON		.equ 0x00000000
CPLD_CFG_LED_LIGTHOFF		.equ 0x000000ff

_boot:      
;************************************************************************
;* CONFIGURE EMIF
;************************************************************************

        ;****************************************************************
        ; *EMIF_GCTL = EMIF_GCTL_V;
        ;****************************************************************
            mvkl  EMIF_GCTL,A4		;将EMIF全局控制寄存器基地址低16位写入A4寄存器低16位,
									;因mvkl带符号位扩展,因此该语句必须先于mvkh
      ||    mvkl  EMIF_GCTL_V,B4	;将EMIF全局控制寄存器配置参数低16位写入B4寄存器低16位

            mvkh  EMIF_GCTL,A4		;将EMIF全局控制寄存器基地址高16位写入A4寄存器高16位
      ||    mvkh  EMIF_GCTL_V,B4	;将EMIF全局控制寄存器配置参数高16位写入B4寄存器高16位
									;两条指令并行执行
									
            stw   B4,*A4			;将B4值写入A4指向地址存储空间

        ;****************************************************************
        ; *EMIF_CE0 = EMIF_CE0_V
        ;****************************************************************

            mvkl  EMIF_CE0,A4       ;将EMIF CE0寄存器地址低16位写入A4寄存器低16位
      ||    mvkl  EMIF_CE0_V,B4     ;将EMIF CE0寄存器配置参数低16位写入B4寄存器低16位
									;两条指令并行执行
									
            mvkh  EMIF_CE0,A4		;将EMIF CE0寄存器地址高16位写入A4寄存器高16位
      ||    mvkh  EMIF_CE0_V,B4		;将EMIF CE0寄存器配置参数高16位写入A4寄存器高16位
									;两条指令并行执行
									
            stw   B4,*A4			;将B4值写入A4指向地址存储空间

        ;****************************************************************
        ; *EMIF_CE1 = EMIF_CE1_V (setup for 16-bit async flash)
        ;****************************************************************

            mvkl  EMIF_CE1,A4       ;参上
      ||    mvkl  EMIF_CE1_V,B4

            mvkh  EMIF_CE1,A4
      ||    mvkh  EMIF_CE1_V,B4

            stw   B4,*A4

;**********************************************************************
;	通过配置GPIO引脚完成:Flash A20~A23为低电平, A24 Flash片选为低电平
;**********************************************************************
	; GPIO Enable Register (GPEN) config
		mvkl	GPEN,A4		;
	||	mvkl	GPEN_V,B4	;
		
		mvkh	GPEN,A4		;
	||	mvkh	GPEN_V,B4	;
	
		stw		B4,*A4

	; GPIO Direction Register (GPDIR)
		mvkl	GPDIR,A4	;
	||	mvkl	GPDIR_V,B4	;
		
		mvkh	GPDIR,A4	;
	||	mvkh	GPDIR_V,B4	;
	
		stw		B4,*A4	
		
	; GPIO Direction Register (GPDIR)
		mvkl	GPVAL,A4	;
	||	mvkl	GPVAL_V,B4	;
		
		mvkh	GPVAL,A4	;
	||	mvkh	GPVAL_V,B4	;
	
		stw		B4,*A4			

;**********************************************************************
;Flash程序读取、写入地址、入口地址赋值...
;**********************************************************************
		mvkl FLASH_BOOT_COPY_STARTADDR,A4 ;BOOT文件Flash基地址
	||	mvkl RAM_BOOT_COPY_STARTADDR,B5 ;RAM拷贝地址

		mvkh FLASH_BOOT_COPY_STARTADDR,A4
	||	mvkh RAM_BOOT_COPY_STARTADDR,B5	
		
		mvkl FLASH_BOOT_BINSIZE,B0	;BOOT程序拷贝长度
		mvkh FLASH_BOOT_BINSIZE,B0

	mvkl .S2 _c_int00,B7			;BOOT程序入口地址
	mvkh .S2 _c_int00,B7

boot_loop: ;BOOT程序搬移操作
	ldh	*A4++,A7 ;从A4地址所在区域读取1字节数据到 A7寄存器
	sub B0,2,B0 ;decrement counter
	nop 3

	sth A7,*B5++ ;将A7寄存值保存到地址中
	nop 4
		
	[B0] b boot_loop	; setup branch if not done
	[!B0] b .S2 B7		;执行结束,转至入口地址开始执行
	nop 5
boot.rar
  • EMIF寄存器配置参数如下:

    ;
    ;  ======== c6713_emif.s62 ========
    ;
                .title  "Flash bootup utility"
    
    ; global EMIF symbols defined for the c671x family
                .include        boot_c671x.h62
    
    ;EMIF Register Addresses for c671x family  
    EMIF_GCTL       .equ  0x01800000  ;EMIF global control
    EMIF_CE1        .equ  0x01800004  ;address of EMIF CE1 control reg.
    EMIF_CE0        .equ  0x01800008  ;EMIF CE0control
    EMIF_CE2        .equ  0x01800010  ;EMIF CE2control
    EMIF_CE3        .equ  0x01800014  ;EMIF CE3control
    EMIF_SDRAMCTL   .equ  0x01800018  ;EMIF SDRAM control
    EMIF_SDRAMTIM   .equ  0x0180001c  ;EMIF SDRAM timer
    EMIF_SDRAMEXT   .equ  0x01800020  ;EMIF SDRAM extension
    
    ; EMIF Register Values specifically for 6713 DSK
    EMIF_GCTL_V     .equ  0x00003778  ;
    EMIF_CE0_V      .equ  0xffffff13  ;EMIF CE0 SRAM
    EMIF_CE1_V      .equ  0xffffff13  ;EMIF CE1 Flash 16-bit
    EMIF_CE2_V      .equ  0xffffff13  ;EMIF CE2 Daughtercard 16-bit async
    EMIF_CE3_V      .equ  0xffffff23  ;EMIF CE3 Daughtercard 16-bit async
    EMIF_SDRAMCTL_V .equ  0x57116000  ;EMIF SDRAM control
    EMIF_SDRAMTIM_V .equ  0x00000400  ;SDRAM timing (refresh)
    EMIF_SDRAMEXT_V .equ  0x00000000  ;SDRAM extended control
    
    
  • GPIO配置 如下:

    ;
    ;  ======== c6713_emif.s62 ========
    ;
                .title  "Flash bootup utility"
    
    ; global EMIF symbols defined for the c671x family
                .include        boot_c671x.h62
    
    ;GPIO Register Addresses for c671x family  
    GPEN       		.equ	0x01B00000 ; GPIO Enable Register (GPEN)
    GPDIR      		.equ	0x01B00004 ; GPIO Direction Register (GPDIR)
    GPVAL      		.equ	0x01B00008 ; GPIO Value Register (GPVAL)
    
    ; GPIO Register Values specifically for 6713 TS6400
    GPEN_V     		.equ	0x0000AE00 ; GP9,10,11,13,15 Enable
    GPDIR_V    		.equ	0x0000AE00 ; GP9,10,11,13,15 Output
    GPVAL_V    		.equ	0x00000000 ; GP9,10,11,13,15 is low signel
    
    
  • 引导的文件的话是bin文件,使用的转换工具在C6416上面是正确的。

  • 经过硬件测量EMIF CE1上的CS和ROE信号,发现断电上线的方式下,会出现这样的现象:

    1、CS只会有一个大致5ms的下拉,如果我没有计算错的话(EMIF inclk = 25MHz * 7 /3 = 58MHz),而EMIF默认的setup、Strobe、Hold时间都是全FF,这5ms应该是1次传输的时间吧。我接的是16位的NorFlash,这样看CS的话,应该是CPU只读取了2字节的数据就结束了。

    2、ROE引脚在多次断电上线的时候,会观察到超1S的连续读使能信号。

    不管如何,这样的现象肯定是不正常的,在我查看文档时又发现CPU是会不论如何都会从EMIF CE1读取1KB数据到内部RAM 0x0地址的,那么会出现上面的情况是为什么呢?

  • 在文档:《spra544d -TMS320C6000 Tools Vector Table and Boot ROM Creation.pdf》中有如下描述|:

    通过以上描述,CPU应该是没有理由的去搬移数据到内部RAM的。

    在数据手册中,需要完成CPU BOOT模式的配置,

    CLKMODE硬件已经配置为1,HD[4:3]配置为10,HD12为1,HD8为1.

    配置应该是没有错的,但是Why CPU没有去完成1KB的数据搬移工作呢?在发生什么事情的情况下,CPU会只拉一次片选,然后就勿勿停止搬移呢?

  • 是的,只要启动模式配置对了,ROM是无条件DMA 1K byte到片上内存空间的。

    把CE1与AOE两个信号一起量,把图贴上来看一下。

    还有把上电顺序与复位RESET信号也一起量一下。

  • 问题解决了,CPLD进行EMIF总线使用权控制时,有个信号不太对。

    经测试,BOOT代码是正确可引导的。