|  | 
| 2# machoe 
 
 首先谢谢回复,
 1顺序读取怎么理解?
 2ID 的问题发出命令之后再 NFDAT寄存器里是0x9510DAEC  EC为三星公司的标志应该没错的!那么 DA就应该是DEVICE ID 了
 3 代码如下 在天嵌公司的TQ2440里 我又加了一个小的测试函数
 #include <string.h>
 
 #include "def.h"
 #include "2440addr.h"
 #include "2440lib.h"
 #include "2440slib.h"
 #include "Nand.h"
 
 char        pMID;// 厂商号
 char        pDID;//设备号 device ID
 char        nBuff;//保留字节
 char        n4thcycle;//多层操作码
 int        i;
 U32 ID=0x0;
 
 //
 //  Reset the chip
 //
 static void rNF_Reset()
 {
 NF_CE_L();//片选
 NF_CLEAR_RB();//清状态位
 NF_CMD(CMD_RESET);//复位
 NF_DETECT_RB();  //直到成功
 NF_CE_H();       //取消片选
 }
 
 
 static void rNF_Init(void)
 {
 rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
 //CLE和ALE时间 1 (1-CLK)  4(4+1)   0(0+1?
 //   1+5+1=7*10ns=70ns
 //要求写时间要大于50ns
 rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
 //                                          6: Lock spare ECC
 //                                          5: Unlock main data area ECC generation
 //                                          4: Initialize ECC decoder
 //                                          1: Chip select
 //                                          0;NAND flash controller enable
 
 rNFSTAT = 0;//装态位清零 只读位不能发生变化
 rNF_Reset();//重启
 }
 
 static U32 rNF_ReadID()
 {
 
 
 NF_nFCE_L();    //片选
 NF_CLEAR_RB();   //清状态/就绪位
 NF_CMD(CMD_READID);        // read id command 0x90
 NF_ADDR(0x0);
 //for ( i = 0; i < 100; i++ );
 
 pMID = NF_RDDATA8();
 
 pMID = NF_RDDATA8();
 pDID = NF_RDDATA8();
 
 nBuff     = NF_RDDATA8();
 n4thcycle = NF_RDDATA8();
 
 //ID = NF_RDDATA();
 NF_nFCE_H();//取消片选
 
 // return ID;
 return (pDID);
 }
 
 
 static void rSB_ReadPage(U32 addr, unsigned char * to)
 {
 U32 i;
 
 rNF_Reset();
 
 //  Enable the chip
 NF_nFCE_L();
 NF_CLEAR_RB();
 
 // Issue Read command
 NF_CMD(CMD_READ);//Ox00
 
 //  Set up address
 NF_ADDR(0x00);
 NF_ADDR((addr) & 0xff);
 NF_ADDR((addr >> 8) & 0xff);
 NF_ADDR((addr >> 16) & 0xff);
 
 
 NF_DETECT_RB();                // wait tR(max 12us)
 
 for (i = 0; i < 512; i++)
 {
 to =  NF_RDDATA8();
 }
 
 NF_nFCE_H();
 
 }
 
 static void rLB_ReadPage(U32 addr, unsigned char * to)
 {
 U32 i;
 
 rNF_Reset();
 
 //  Enable the chip
 NF_nFCE_L();
 NF_CLEAR_RB();
 
 // Issue Read command
 NF_CMD(CMD_READ);
 
 //  Set up address
 NF_ADDR(0x00);
 NF_ADDR((addr>>9) & 0xff);
 NF_ADDR((addr >> 17) & 0xff);
 NF_ADDR((addr >> 25) & 0xff);
 
 NF_CMD(CMD_READ3);
 
 NF_DETECT_RB();                // wait tR(max 12us)
 
 for (i = 0; i < 2048; i++)
 {
 to =  NF_RDDATA8();
 }
 
 NF_nFCE_H();
 
 }
 
 
 void RdNF2SDRAM( )
 {
 U32 i;
 U32 start_addr = 0x0;
 unsigned char * to = (unsigned char *)0x30000000;
 U32 size = 0x100000;
 rNF_Init();
 switch(rNF_ReadID())
 {
 case 0x76:
 for(i = (start_addr >> 9); size > 0; )
 {
 rSB_ReadPage(i, to);
 size -= 512;
 to += 512;
 i ++;
 }
 break;
 case 0xf1:
 case 0xda:
 case 0xdc:
 case 0xd3:
 for(i = (start_addr >> 11); size > 0; )
 {
 rLB_ReadPage(i, to);
 size -= 2048;
 to += 2048;
 i ++;
 }
 break;
 }
 }
 
 void testNandFlash(void)
 {
 U32 pID,addr;
 unsigned char *temp;
 int i;
 addr=0x30000000;
 rNF_Reset();
 rNF_Init();
 pID= rNF_ReadID();
 Uart_Printf("\nmenufactory ID is:");
 Uart_Printf("%X",pID);
 rLB_ReadPage(addr,temp);
 Uart_Printf("\n");
 for(i=0;i<512;i++)
 Uart_Printf("%c",temp);
 
 }
 | 
 |