哥们我也是第一次正儿八经搞NIOSII,很多奇怪的问题都被俺碰上了,从头到尾一共花了将近一个月,终于把NIOS给活生生跑起来了。虽然浪费了很多时间,但经验值了提高了一些。
现在把FLASH的问题写一下给大家分享,希望能对各位有点帮助。
NIOSII的手册说的很明白,只支持具有CFI接口的FLASH器件。用AMD和INTEL的肯定没有错,都可以支持的。但是还有一种FLASH大家也常用的,那就是SST的。NIOSII对SST的支持就很让人不清楚了。我查阅flash programer user guide这个手册,看到SST39VF200-400-800是明确写出来支持的,但是现在大家用的都是160-320-640了,这些是不是支持呢。
我使用的是SST39VF6401B,SST网站上红字写着与AMD兼容,因此我选了这个。谁知道问题就出现在这里了,经过调试发现,SST39VF6401B工作完全正常,我自己写的代码可以读写它,但IDE的 flash progammer就是说什么地址空间不对(不是说没有CFI接口,说明识别到了),反正不支持。晕死。
后来我不死心,经过仔细查阅altera声明支持的SST39VF800的datasheet和我使用的SST39VF6401B究竟有什么不同。一番折腾后,找到了原因。这个原因就是SST这次特别推出号称与AMD兼容的6401B这个芯片把一条块擦除指令改成与AMD一样了。但是没有改彻底,CFI信息表那里没有把块定义改过来,于是如果按照CFI定义的块大小来擦除就出问题了。
原来SST还有一款是SST39VF6401,不带B字母的,那个是沿袭它自己的指令的,虽然不跟AMD兼容,但是与以前800是一样的,我断定肯定可以在NIOSII里使用。
大家注意选型的时候可要注意了,要不带B的那种,千万不要以为跟AMD兼容更好用。
不过,我不管那么多了,我换成AMD(现在叫SPANSION)了。
用户1371621 2009-11-15 17:55
用户1042794 2007-10-16 11:38
想向你请教一下!
我用的芯片是DSPIC30F6014,片外FLASH为SST39VF400A(4MBIT)
要实现单片机读写FLASH的功能。
根据FLASH的读写时序编写了读写的程序,我的考虑是先写入一组数据到FLASH中,然后读出FLASH数据,读出后做一个简单的运算(取反),然后通过UART传送到PC上显示出来,从而判断是否读写正确。
问题是读写不成功时,怎么判断是写入不成功还是读出不成功???不知道大家有没有好的建议!
unsigned int ReadFlash ( long inADDR )
{
unsigned int value;
DIR_ADDR_16L=0X0000;
DIR_DATA=0XFFFF;
WE=1;
CE=1;
DELAYnop
OE=1;
ADDR_16L=inADDR&0X0FFFF;
CE=0;
DELAYnop
OE=0;
DELAYnop
value=DATA;
DELAYnop
CE=1;
OE=1;
return value;
}
写程序:
void WriteFlash (long inDATA, long inADDR) /*WE CONTROL WRITE A WORD */
{
DIR_ADDR_16L=0X0000;
DIR_DATA=0X0000;
OE=1;
CE=0;
ADDR_16L=0x5555;
DATA=0x00AA;
WE=0;
DELAYnop
WE=1;
ADDR_16L=0x2AAA;
DATA=0x0055;
WE=0;
DELAYnop
WE=1;
ADDR_16L=0x5555;
DATA=0x00A0;
WE=0;
DELAYnop
WE=1;
ADDR_16L=(inADDR&0X0FFFF);
DATA=inDATA;
WE=0;
DELAYnop
WE=1;
delay();
}
不知道是我的写时序不对还是读时序不对???
ash_riple_768180695 2007-10-12 15:26
是不是你自己写的代码用的是与AMD兼容的擦除指令,块大小也与AMD擦除指令相同;而IDE通过读取CFI信息表,获得的是SST原来指令的块大小,与AMD是不同的。