现正在调试NAND FLASH,型号(MT29F2G08ABBEA3W),
首先配置了EMIF16的一些参数比如sstrobe,wrsetup等,还有一个关于wait0polality,wait1polality不知具体是何意义??
配置完了之后,按照文档上所说的操作,先向flash写入reset指令(0xFF),然后等R/B置1,为啥R/B一直为0????
既然我这样我就先把这部分注释掉,不等R/B信号,然后读ID不对,擦除也不对,难道我的操作顺序不对吗???
感谢大牛们帮忙看下,小弟感激不尽!1谢谢。
King Wang1:
去看例子程序,没有这么复杂的操作。配置好EMIF16后,直接地址访问就行了。
user1746900:
回复 King Wang1:
谢谢您的回答!
我是看着例子程序编的,NAND Flash访问没那么简单吧,我现在配置完EMIF16后,写读ID命令能读出正确的数,但是擦除,读写好像不对,因为nandflash没法直接地址查看,所以我也看不出哪一步不对现象是擦完了,写数,然后读出来,结果和写进去的不一样,无论写什么,读出来都是30.
King Wang1:
回复 user1746900:
不好意思,我看错了,以为是NOR Flash的访问。
NAND的访问时按照NAND手册里面来的,你先看看你的NAND状态块信息能不能读出来,比如说size,page, block等信息,这些操作成功了在去尝试擦除和读写操作。
user1746900:
回复 King Wang1:
我用的NAND是MT29F2G08ABBEA3W,属于ONFI,所以可以读出状态信息,size,page,都和文档是一样的,读出的ID号manID一样,但deviceID却和文档不同,我也不知道为啥?您说的上面的操作算是成功了,但是擦的时候,写完命令,后读状态,一直都是60,按理说擦除的时候是一个值,擦完的时候又是一个值吧,那这种情况我也不知道是属于在处理什么,文档也没说各个状态是什么数值。
另外,我就当其擦完了,然后我就直接写读,发现一个有趣的问题:我最初把r_strobe设成默认最大,0x3F,结果无论写什么,读出来的结果都是前28个字节为0,其余为FF,接着我把r_strobe调小,改成0x20,结果读出来值都为0x30。
我都纳闷了,怎么会这样呢,如果我时序设的不对,或者配置配的不对,为啥能读出状态块信息,擦读写却不行呢??而且我都不确定读出来的数都是啥玩意,迷惑迷惑。
King Wang1:
回复 user1746900:
能否上电后先执行NAND RESET命令,保证RESET命令成功后再去执行其他的操作。(得到信号返回1)(如果没有返回1, 查看CLE位是否设置正确)
另外,对于strobe,setup和hold时间的配置,可先按照最大的时间去设置。看看这样操作能成功不?
user1746900:
回复 King Wang1:
后来我把strobe,setup和hold时间的配成最大值,然后执行了NAND RESET命令,你说的信号返回时指读status的状态还是R/B#的值?
我现在的情况,将R/B#那条线拉出来用示波器量,然后写命令的时候会有低电平出现,表示确实写进去了,处于BUSY状态,但是写地址的时候不会有低电平出现,是意味着没写成功吗?
现在是一套指令执行下来,写指令读参数没问题,擦除时读的状态依然是0x40,且一直不变,没搞明白。然后写数,读数,显示读出来的都是FF。以前调得NAND不会出现这样的情况,不知调6678的NAND咋出现这种问题。。。。。
King Wang1:
回复 user1746900:
信号返回是指R/B#值,对应NANDFSR寄存器。
R/B#只有在指令执行完毕之后才会被拉低,比如擦除只有在发出D0命令字后才会拉低,然后如果NAND执行完毕就会恢复。
建议你观察是否有这样的现象,你必须先保证度参数正确,然后确保擦除正确,再去写NAND然后回读。
还有就是建议你换个板子看看,这个是自己的板子还是TI的EVM板子?
user1746900:
回复 King Wang1:
是自己的板子,现在读参数正确,然后按照文档说明执行擦除过程:写命令时拉低然后恢复,接着写block地址(没有拉低现象),再写一个命令拉低然后恢复。接着写读状态命令70,读出来的都是40,是不是意味着没擦除成功?block地址就是从0开始写的,写3个字节。