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.

6747固件下载后,EMIF读写不正常



如题,系统 : dsp 是通过fifo采集数据,两者之间有一个数据锁存器。dsp 利用GPIO 来实现控制采集传输数据从FIFO到dsp ,但是通过串口下载固件后。EMIFA工作不正常。 采集数据全为零 。用示波器检查,数据锁存器有数据经过。所以肯定是DSP EMIFA 工作不正常导致, 挂着仿真器,一切正常。求教如何配置固件EMIFA .

  • 检查一下EMIFA的pinmux配置(可以对照gel文件里相应的配置部分)

  • 您好,pinmux检查过了。没有问题。是通过AISGEN for D800K003这个软件调试的bin文件。然后通过串口下载固件到dsp。在这个AISGEN 配置文件中,PLL  PINMUX  串口都配置正常。唯一不正常的就是EMIFA . 在我的项目中, emifA 连接的不是SDRAM ,仅仅是 一个锁存器,在锁存器另一端是FIFO 。所以在aisgen 中没有配置EMIFA . 是否应该配置呢???此外只要dsp挂着仿真器,就一切正常。

  • PSC里使能EMIF了吗?

  • 你好,挂仿真器和脱机是完全不同的。尤其是挂着仿真器的话可以用GEL文件进行初始化,而烧写过程中GEL文件没有任何作用的,需要将这些初始化添加到程序中。

    建议你load symble烧写的out文件,单步调试一下看看与仿真情况下的EMIF的寄存器状态是否一样,查找哪里有问题。

  • jacob, 您好

    首先非常感谢您的指教,关于那个烧写后emifA读写不正常。 我已经在程序中配置了各个寄存器。也配置了PSC. 但依然找不到问题的关键。此外,在我的程序中,没有用到GEL文件。一直是手动配置寄存器的。 下面给您附上程序部分代码,求指教。

    #include <stdio.h>

    #include <math.h>

    #include <c6x.h>

    #include <ti/pspiom/cslr/cslr_cache.h>

    #include <ti/pspiom/cslr/csl_types.h>

    #include <ti/pspiom/cslr/cslr_dspintc.h>

    #include <ti/pspiom/cslr/soc_C6747.h>

    #include <ti/pspiom/cslr/cslr_uart.h>

    #include <ti/pspiom/cslr/cslr_syscfg_C6747.h>

    #include <ti/pspiom/cslr/cslr_psc_C6747.h>

    #include <ti/pspiom/cslr/cslr_gpio.h>

    #include <ti/pspiom/cslr/cslr_pllc_C6747.h>

    #include <ti/pspiom/cslr/cslr_spi.h>

    #include <ti/pspiom/cslr/cslr_emifa2.h>

    #define AEMIF_AWCCR             (*( unsigned int* )( 0x68000004 ))

    #define AEMIF_A1CR              (*( unsigned int* )( 0x68000010 ))

    #define AEMIF_A2CR              (*( unsigned int* )( 0x68000014 ))

    #define AEMIF_A3CR              (*( unsigned int* )( 0x68000018 ))

    #define AEMIF_A4CR              (*( unsigned int* )( 0x6800001C ))

    #define AEMIF_NANDFCR           (*( unsigned int* )( 0x68000060 ))

    CSL_SyscfgRegsOvly   sysRegs  = (CSL_SyscfgRegsOvly)(CSL_SYSCFG_0_REGS);

    CSL_PscRegsOvly      psc0Regs = (CSL_PscRegsOvly)(CSL_PSC_0_REGS);

    CSL_PscRegsOvly      psc1Regs = (CSL_PscRegsOvly)(CSL_PSC_1_REGS);                                                                                              

    CSL_UartRegsOvly     uartRegs = (CSL_UartRegsOvly)(CSL_UART_1_REGS);

    CSL_EmifaRegsOvly    emifaRegs = (CSL_EmifaRegsOvly)(CSL_EMIFA_0_REGS);

    void device_init(void)

    {

       //-----------------------------PSC---------------------------------//

       // TURN ON POWER SLEEP CONTROL BY EMIFA

    psc0Regs->MDCTL[CSL_PSC_EMIFA] = CSL_FMKT( PSC_MDCTL_NEXT, ENABLE )

                               | CSL_FMKT( PSC_MDCTL_LRST, DEASSERT );

    psc0Regs->PTCMD = CSL_FMKT(  PSC_PTCMD_GO0, SET );

    while ( CSL_FEXT( psc0Regs->MDSTAT[CSL_PSC_EMIFA], PSC_MDSTAT_STATE )

          != CSL_PSC_MDSTAT_STATE_ENABLE );

    // TURN ON POWER SLEEP CONTROL BY UART

    psc1Regs->MDCTL[CSL_PSC_UART1] = CSL_FMKT( PSC_MDCTL_NEXT, ENABLE )

                               | CSL_FMKT( PSC_MDCTL_LRST, DEASSERT );

    psc1Regs->PTCMD = CSL_FMKT(  PSC_PTCMD_GO0, SET );

    while ( CSL_FEXT( psc1Regs->MDSTAT[CSL_PSC_UART1], PSC_MDSTAT_STATE )

          != CSL_PSC_MDSTAT_STATE_ENABLE );

    // TURN ON POWER SLEEP CONTROL BY GPIO

    psc1Regs->MDCTL[CSL_PSC_GPIO] = CSL_FMKT( PSC_MDCTL_NEXT, ENABLE )

                               | CSL_FMKT( PSC_MDCTL_LRST, DEASSERT );

    psc1Regs->PTCMD = CSL_FMKT(  PSC_PTCMD_GO0, SET );

    while ( CSL_FEXT( psc1Regs->MDSTAT[CSL_PSC_GPIO], PSC_MDSTAT_STATE )

          != CSL_PSC_MDSTAT_STATE_ENABLE );

       //----------PIN MUX-----------//

    sysRegs->KICK0R = 0x83e70b13;

    sysRegs->KICK1R = 0x95A4F1E0;    

    sysRegs->PINMUX0  = 0x00000011;  

    sysRegs->PINMUX1  = 0x88888888;  

    sysRegs->PINMUX2  = 0x00888888;  

    sysRegs->PINMUX5  = 0x88888880;  

    sysRegs->PINMUX6  = 0x88888888;  

    sysRegs->PINMUX7  = 0x00000008;

    sysRegs->PINMUX8  = 0x20011000;  

    sysRegs->PINMUX9  = 0x00000002;  

    sysRegs->PINMUX11 = 0x00001100;  

    sysRegs->PINMUX13 = 0x11000000;

    sysRegs->PINMUX14 = 0x11111111;  

    sysRegs->PINMUX15 = 0x11111111;

    sysRegs->PINMUX16 = 0x11111111;  

    sysRegs->PINMUX17 = 0x11111111;

    sysRegs->PINMUX18 = 0x11111111;  

    sysRegs->PINMUX19 = 0x00000001;

       //--------REGISTER EMIFA--------//

    emifaRegs->AWCC      = 0xff;

    emifaRegs->CE2CFG    = 0x00300601;

    emifaRegs->NANDF1ECC = 0x01;

    }

    void main ()

    {

       device_init();

       init_gpio();

       init_uart();

    while (1)

    {

        CMain();

     } //end while

    }

  • Tony TANG ,您好,

     我在程序中已经是能了PSC0-3

  • 时序呢?有没有影响?

  • 你好,直接看代码看不出什么的,还是我说的建议你load symble烧写的out文件,单步调试一下看看与仿真情况下的EMIF的寄存器状态是否一样,查找哪里有问题。

    一定要单步调试看看。

  • 谢谢,您的建议。问题找到了。是硬件问题。已经解决。谢谢大家关注。

  • 你好,硬件的问题?是FLASH相关的硬件有问题吗?

  • 不是,是我reset 搞错了。多焊了一个0电阻。咔咔咔咔。。。

  • 楼主您好,我是初学,我想知道您主函数上面的那些器件初始化程序是自己写的还是有库?还有那些include的头文件在哪里呢?什么时候用?我的安装目录怎么没有那些文件呢?希望能麻烦您回答我问题一下。谢谢了

  • 您可以帮助我吗?谢谢了,就是我问楼主的问题

  • 楼主用的是PSP的driver, 可从这里下载:http://www.ti.com/tool/biossw-c6747

    如果不是太熟悉PSP,可以用BSL提供的基本函数。C6747的BSL及EVM的其它资料可以从可以从这里下载:

    http://support.spectrumdigital.com/boards/evmomapl137/revg/