如题,系统 : dsp 是通过fifo采集数据,两者之间有一个数据锁存器。dsp 利用GPIO 来实现控制采集传输数据从FIFO到dsp ,但是通过串口下载固件后。EMIFA工作不正常。 采集数据全为零 。用示波器检查,数据锁存器有数据经过。所以肯定是DSP EMIFA 工作不正常导致, 挂着仿真器,一切正常。求教如何配置固件EMIFA .
Tony Tang:
检查一下EMIFA的pinmux配置(可以对照gel文件里相应的配置部分)
yang jing:
回复 Tony Tang:
您好,pinmux检查过了。没有问题。是通过AISGEN for D800K003这个软件调试的bin文件。然后通过串口下载固件到dsp。在这个AISGEN 配置文件中,PLL PINMUX 串口都配置正常。唯一不正常的就是EMIFA . 在我的项目中, emifA 连接的不是SDRAM ,仅仅是 一个锁存器,在锁存器另一端是FIFO 。所以在aisgen 中没有配置EMIFA . 是否应该配置呢???此外只要dsp挂着仿真器,就一切正常。
Tony Tang:
回复 yang jing:
PSC里使能EMIF了吗?
Jacob1:
回复 Tony Tang:
你好,挂仿真器和脱机是完全不同的。尤其是挂着仿真器的话可以用GEL文件进行初始化,而烧写过程中GEL文件没有任何作用的,需要将这些初始化添加到程序中。
建议你load symble烧写的out文件,单步调试一下看看与仿真情况下的EMIF的寄存器状态是否一样,查找哪里有问题。
yang jing:
回复 Jacob1:
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
}
yang jing:
回复 Tony Tang:
Tony TANG ,您好,
我在程序中已经是能了PSC0-3
whagiew zhang:
回复 yang jing:
时序呢?有没有影响?
yang jing:
回复 whagiew zhang:
受到影响。
yang jing:
回复 Jacob1:
谢谢,您的建议。问题找到了。是硬件问题。已经解决。谢谢大家关注。