本帖最后由 YXQWXN 于 2014-5-1 17:47 编辑
最近学习EMIF_SDRAM,虽然已经成功,但是其中出现的问题是在是令我难以理解和解释,希望各位同僚能够抛砖引玉。
现在是全局定义。
错误的原因就是三个定义的位置,datacount是将0到1000个数字写入到SDRAM的一个变量,databuffer数组是用来接受从SDRAM中读取的数据的,剩下的两个,一个是SDRAM的首地址,一个是尾地址。
一、现在是正确的情况,运行之后,error=0,标志位i=1;
二、当把定义位置1、2调换以后
运行之后就不能正确的读取SDRAM中的数据了error=3(说明有三次读取的数据有错误),i=2
三、因为这三个的定义我只是在主函数中使用,所以我便将这三个定义转移到了main函数中,作为局部定义使用,同样也会出现和二一样的错误。
求解啊!!!
下面是我的程序:
# include "csl.h"
# include "csl_pll.h"
# include "csl_emif.h"
# include "csl_chip.h"
# include "stdio.h"
# include "csl_gpio.h"
unsigned int datacount=0;
int databuffer[1000]={0};
int *souraddr,*deminaddr;
PLL_Config PLL_SETTING={
0,
1,
6,
0
};
EMIF_Config EMIF_SETTING={
0x221,
0xFFFF,
0x3FFF,
0xFFFF,
0x00FF,
0x3FFF,
0xFFFF,
0x00FF,
0x1FFF,
0xFFFF,
0x00FF,
0x1FFF,
0xFFFF,
0x00FF,
0x2911,
0x0410,
0x07FF,
0x0131
};
void main ()
{
unsigned int error=0;
int i=0;
CSL_init ();
CHIP_RSET (XBSR,0X0A01);
PLL_config (&PLL_SETTING);
EMIF_config (&EMIF_SETTING);
souraddr=(int*)0x40000;
deminaddr=(int *)0x41000;
while (souraddr<deminaddr)
{
*souraddr++=datacount;
datacount++;
}
souraddr=(int *)0x40000;
datacount=0;
while (souraddr<deminaddr)
{
databuffer[datacount++]=*souraddr++;
if (databuffer[datacount-1]!=(datacount-1))
{
error++;
}
}
if (error==0)
{
GPIO_RSET(IODIR,0XFF);
GPIO_RSET(IODATA,0X80);
i=1;
}
else
{
GPIO_RSET(IODIR,0XFF);
GPIO_RSET(IODATA,0X00);
i=2;
}
while (1);
}
什么意思,我看了TI的手册关于这个5509a的,datasheet上写着CE0空间地址是从0x40000开始的,我的SDRAM是用的正好是CE0,这个应该是没有错误的。
应该不会吧,这个是预编译的,不再主函数的内部!
这个蛋疼的问题在今天终于给完成了。主要问题是这个样子的。
地址是从0x40000到0x41000,总共放的数据是4096个,而我只定义了1000个,明显是放不下的,因此导致的了错误。
另外这个问题纠正以后出现了一个新的问题,就是这三个定义不能放在主函数里面,我仿真了好几次都是有错误的,后来我将这三个定义的前面加了一个static(主要是那个数组),将它们定义为静态的,居然来没有问题了。我想了想觉得无论是定义静态的还是动态的都不应该错,后来我做了很多次的实验,我猜想是因为仿真的缘故,如果直接下载到芯片里面进行运行的话动态和静态都应该是没有问题的。如果路过有知道的话望指导一二。
一周热门 更多>