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.

dsp28346 外部flash自启动问题



专家您好:

       关于28346外部flash自举启动,有几个不确定的地方需要咨询:

        1. bootroom源码判断xint6启动,读取的是0x100000的数据,判断数据是16位引导还是8位引导。但是pdf资料里说的 0x100000 这个地址存放的是跳转地址。这两个地方是不是有矛盾呢?

         2. 跳线选择xint6,片外flash启动的时候,XA15~XA12电平分别为1001。我的板子1是通过接上拉电阻,0是通过直接接地得来的。 这样是不是有些不妥呢,如果直接接地,启动起来以后是不是要拔掉跳线帽才能正常运行?如果不是直接接地,一般这里是如何设置的?

         急切希望您的指点。谢谢。

  • F2834X BootROM User Guide里面写的很明确,Jump to XINTF Zone 6 Configured for 16-bit Data模式时,是跳转到0x100000地址,因此里面应该是指令。

    请问楼主是在什么文件上看到"bootroom源码判断xint6启动,读取的是0x100000的数据,判断数据是16位引导还是8位引导".

    关于引导管脚XA15~XA12电平,建议接上拉或者接下拉。上电时要保证外接电路不影响XA15~XA12的电平。

  • 回复 Johnson Chen  :是我搞混淆了。读取的是0x100000的数据,判断数据是16位引导还是8位引导 这个引导方式是外部并口引导。

      BEGIN  : origin = 0x100000, length = 0x000002     /*Use for codestart*/

      XFLASH6_S0   : origin = 0x100002, length = 0x007FFE

    这个是我的flashcmd文件。做一个点灯的操作。生成.out文件后,我用hex2000提取为.a00文件,然后解析a00文件0x100000对应的跳转地址和其他段地址,生成一个大数组,烧写到片外flash里。跳线跳到1001模式,上电后rst引脚不断有复位脉冲输出。flash启动不起来。

      请问专家,大概问题出自哪里了?

  • 另外,如果xa15~xa12全部拉低,进入ti_test模式,xa15引脚会有脉冲输出。是这样吗?

    我这么做,没有测到脉冲。

    希望专家给予指点。

  • 我抛砖引玉一下。

    "上电后rst引脚不断有复位脉冲输出"是watchdog产生的。

    楼主可以在CCS中看一下,片外的FLASH中的数据是不是您解析出来的那个大数组;0x100000开始的反汇编是否正确。

    关于所有引脚拉低的ti_test,楼主请看一下附件中的程序,相信就会明白。

  • To Forrest:

        谢谢您的回复。flash数据的数组我校验过了,正是我写进去的。至于0x100000反汇编,因为反汇编要在ram里运行才能看到,我的cmd是flash的,不能在ram运行。

      TI_Test_F.c这个文件我看了,正是看了这个文件,所以我才断定所有引脚拉低以后,应该在Gpio87有脉冲输出。

      不过 *(Uint16*)0x09F0) & 0x1F00) 这个地方的具体作用 没有找到相关具体资料。应该是对应结构体 DEV_EMU_REGS。但是这个结构体TI定义只用了前五个字,后面都被保留了。不清楚这里的具体用意。

      希望明示。

  • 另外,如果连接上仿真器,不加载ram的.out文件,28346的片外flash能从memory里读到数据吗?希望有经验的人给个答案。(另:如果加载.out到ram,初始化完毕总线,flash里的数据是可以从memory里观察到的。)

  • 必须要初始化芯片的XINTF和GPIO模块后,才能在view-->memory browser中读到片外存储单元的数据。初始化的过程可以通过“加载ram的.out文件”,也可以通过CCS中的GEL文件。

    既然楼主谈到:”另:如果加载.out到ram,初始化完毕总线,flash里的数据是可以从memory里观察到的。“

    楼主的程序中是如何初始化XINTF模块的?TI的BOOTROM中也初始化了XINTF模块(详见XINTF_Boot.c)。这个初始化和楼主的初始化一样吗?用这个初始化程序,楼主的FLASH是否就无法正常被view-->memory browser读取?

  • To Forrest:

       所有引脚拉低以后,应该在Gpio87有脉冲输出。

     您这么测试过吗?我没测量到脉冲。

     能加一下您的qq吗?我的105694486

  • 哪位高手片外flash启动成功了,能给一个周期操作 GPIO0的.out文件吗?我想测试一下我的板子和烧写flash这块有没有问题。

    谢谢啦。

  • 抱歉,回复迟了。

    我试了,没有脉冲,因为     if( ((*(Uint16*)0x09F0) & 0x1F00) == 0),楼主您也可以试一下,用CCS监视一下程序运行:

     

    上面问楼主的问题楼主试了没有?什么结果?应该是能够看到0x100000中的内容,因为BOOTROM中有初始化XINTF和GPIO模块。

    楼主如果能够看到你的FLASH地址0x100000中的内容,那截个图发上来看看里面的内容。

    楼主可以用CCS一直监视直到跳转到芯片0x100000地址,运行其中的程序:

     

    111.zip
  • 上面问楼主的问题楼主试了没有?什么结果?应该是能够看到0x100000中的内容,因为BOOTROM中有初始化XINTF和GPIO模块。

    这个地方我是这么试的。

    用一个ram.cmd的.out文件下载到dsp中,debug->goto main 结果memory里的0x100000里面全部是0,如果继续运行程序,初始化一下地址数据总线,0x100000能够观察到内容。给我写进去的一致。内容如附件。

    抱歉,您的图片我这边看不了,能发成附件吗。

  • 楼主啊,不要推一推动一动啊。您如果不把情况告诉我,我怎么帮助您啊?

    我上上个帖子的问题您都没有回答。

    楼主的程序中是如何初始化XINTF模块的?TI的BOOTROM中也初始化了XINTF模块(详见XINTF_Boot.c)。这个初始化和楼主的初始化一样吗?用这个初始化程序,楼主的FLASH是否就无法正常被view-->memory browser读取?

    我估计TI  BOOTROM中的初始化和楼主的不一样,用这个初始化程序楼主的FLASH是否就无法正常被view-->memory browser读取,也无法被DSP读取,这可能就是问题的原因。

    图片我放在上个帖子的附件中。

  • 我初始化主要用了 void InitXintf(void)  InitXintf16Gpio(); 这两个函数。XINTF_Boot.c我看了,初始化后的结果是一样的。

    您附件的图片我用ccs3.3做不到。因为28346是外部flash,不能调试。

    我烧写外部flash过程是这样,先把.out提取出大数组,然后建立一个能在ram跑的工程,把大数组写入片外flash中。

    然后拔掉仿真器,重启,通过点灯来看是否启动成功。 所以从flash启动,是观察不到memory窗口的,更不能锁定0x100000这个地址加断点。

  • to  Forrest

    不好意思,刚明白您说的意思。

    你的图片 是 2834x_boot_rom.pjt 从这个工程里面截取的吗?

    我这个工程编译没问你,但是加载 0x3FEB50 报这个地址错误。 所以一直没考虑您这个思路。

  • Load Program肯定是不行的,用Load Symbols,直接用TMS320x2834x_boot_rom_Gold_v1b.out,不要用你编译的。

    另外,还有两个问题,楼主您没有回答我:

    楼主的程序中是如何初始化XINTF模块的?   把程序发上来看看

    用XINTF_Boot.c的初始化程序,楼主的FLASH是否就无法正常被view-->memory browser读取?  楼主试一下。

  • 非常感谢  Forrest 终于有了进展了。再次感谢。
     用XINTF_Boot.c的初始化程序,楼主的FLASH是否就无法正常被view-->memory browser读取?  楼主试一下。
    XINTF_Boot.c 运行完毕以后,0x100000里面的数据是能够正常显示的。
    我断点调试,最终结果如图。

  • 程序最终在这个位置 LRETR

  • 楼主的程序中是如何初始化XINTF模块的?   把程序发上来看看

    调用如下两个函数:

    void InitXintf(void)

    {

       EALLOW;

    // XTIMCLK = SYSCLKOUT/2

       XintfRegs.XINTCNF2.bit.XTIMCLK = 1;

       // No write buffering

       XintfRegs.XINTCNF2.bit.WRBUFF = 0;

       // XCLKOUT is enabled

       XintfRegs.XINTCNF2.bit.CLKOFF = 0;

       // XCLKOUT = XTIMCLK/2

       XintfRegs.XINTCNF2.bit.CLKMODE = 1;

       // XCLKOUT = XTIMCLK/4 (SYSCLKOUT/8)

       XintfRegs.XINTCNF2.bit.BY4CLKMODE = 1;

       XintfRegs.XTIMING6.bit.XWRLEAD = 3;

       XintfRegs.XTIMING6.bit.XWRACTIVE = 7;

       XintfRegs.XTIMING6.bit.XWRTRAIL = 3;

       // Zone read timing

       XintfRegs.XTIMING6.bit.XRDLEAD = 3;

       XintfRegs.XTIMING6.bit.XRDACTIVE = 7;

       XintfRegs.XTIMING6.bit.XRDTRAIL = 3;

       // double all Zone read/write lead/active/trail timing

       XintfRegs.XTIMING6.bit.X2TIMING = 1;

       // Zone will sample XREADY signal

       XintfRegs.XTIMING6.bit.USEREADY = 0;

       XintfRegs.XTIMING6.bit.READYMODE = 1;  // sample asynchronous

       // 1,1 = x16 other values are reserved

       XintfRegs.XTIMING6.bit.XSIZE = 3;

       XintfRegs.XBANK.bit.BANK = 7;

       XintfRegs.XBANK.bit.BCYC = 7;

       EDIS;

      //Force a pipeline flush to ensure that the write to

      //the last register configured occurs before returning.

      InitXintf16Gpio();

    // InitXintf32Gpio();

      asm(" RPT #7 || NOP");

    }

    void InitXintf16Gpio()

    {

        EALLOW;

        SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;

        GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 2;  // XD15

        GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 2;  // XD14

        GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 2;  // XD13

        GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 2;  // XD12

        GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 2;  // XD11

        GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 2;  // XD10

        GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 2;  // XD19

        GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 2;  // XD8

        GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 2;  // XD7

        GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 2;  // XD6

        GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 2;  // XD5

        GpioCtrlRegs.GPCMUX1.bit.GPIO75 = 2;  // XD4

        GpioCtrlRegs.GPCMUX1.bit.GPIO76 = 2;  // XD3

        GpioCtrlRegs.GPCMUX1.bit.GPIO77 = 2;  // XD2

        GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 2;  // XD1

        GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 2;  // XD0

        GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 2;  // XA0 (Note: XWE1n is a seperate pin and not muxed to XA0 in C2834x/C2824x)

        GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 2;  // XA1

        GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 2;  // XA2

        GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 2;  // XA3

        GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 2;  // XA4

        GpioCtrlRegs.GPBMUX1.bit.GPIO45 = 2;  // XA5

        GpioCtrlRegs.GPBMUX1.bit.GPIO46 = 2;  // XA6

        GpioCtrlRegs.GPBMUX1.bit.GPIO47 = 2;  // XA7

        GpioCtrlRegs.GPCMUX2.bit.GPIO80 = 2;  // XA8

        GpioCtrlRegs.GPCMUX2.bit.GPIO81 = 2;  // XA9

        GpioCtrlRegs.GPCMUX2.bit.GPIO82 = 2;  // XA10

        GpioCtrlRegs.GPCMUX2.bit.GPIO83 = 2;  // XA11

        GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 2;  // XA12

        GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 2;  // XA13

        GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 2;  // XA14

        GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 2;  // XA15

        GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 2;  // XA16

        GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 2;  // XA17

        GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 2;  // XA18

        GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 2;  // XA19

        GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 2;  // XREADY

    GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 2;  // XRNW

        GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 2;  // XWE0

        GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 2;  // XZCS0

        GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 2;  // XZCS7

        GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 2;  // XZCS6

    //Disable XINTF pin pull-ups

    GpioCtrlRegs.GPAPUD.all |= 0xF0008FFF;

    GpioCtrlRegs.GPBPUD.all |= 0xFFFFFFF8;

    GpioCtrlRegs.GPCPUD.all |= 0x00FFFFFF;

        EDIS;

    }

  • 这个问题到这里应该就算结束了。

    楼主既然已经看到PC指针指向0X100000,也看到了0X100000中的程序源代码。那接下来,楼主就可以单步,调试在FLASH中的程序,看看是什么问题导致不停地复位,在哪里芯片复位,FLASH中的程序有什么问题。

    通过Load Symbols,来调试0X100000中之后的程序。

    楼主,在单独开一个帖子进行讨论吧。

  • 谢谢Forrest  ,这样我至少能确定硬件没问题了。可以集中找软件原因。