8145|26

55

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于 三星的NAND Flash K9K8G08U0A (8Gbit) [复制链接]

我能够读出它的ID. 与手册上的能够对应上(EC, D3, 51, 95, 58).
但是我进行写数据操作(按页进行),然后读出数据操作(按页进行),我发现读出来的数据并不是我想要的,我读出来的前面很很大部分全部是1E,后面有FF, 都是挨到的相同的(1E 1E ....  1E  1E  

FF FF FF... FF FF FF), 我不知道是写操作有问题,还是读操作有问题,还是两个都有问题,那位大哥弄过了的,帮忙看下.
我的代码如下:

#define FPGA_NAND_IO07          数据线0-7
#define FPGA_NAND_CLE           CLE-Command_Latch Enable
#define FPGA_NAND_ALE           ALE Address Latch Enable
#define FPGA_NAND_CE_           CE  Chip Enable
#define FPGA_NAND_RE_           RE  Read Enable
#define FPGA_NAND_WE_           WE  Write Enable
#define FPGA_NAND_WP_           WP  Write Protect   /*它一直是高电平*/
#define FPGA_NAND_RB_           RB  Ready/Busy_

/**
功能: 发送命令
**/
void NANDFLASH_cmd_Send(unsigned char chCMD)
{
        /*busy check , if low ,busy. if high, ready*/
        while(!FPGA_NAND_RB_);
       
        FPGA_NAND_CE_ = 0;
        NANDFLASH_DelayNS(20); /*20NS*/
       
        FPGA_NAND_CLE = 1;
        FPGA_NAND_ALE = 0;
        FPGA_NAND_RE_ = 1;
        FPGA_NAND_WE_ = 0;
        FPGA_NAND_IO07 = chCMD;    /*放入数据*/
        NANDFLASH_DelayNS(12);  /*12NS*/
        FPGA_NAND_WE_ = 1;
        NANDFLASH_DelayNS(5);/*5NS*/
        FPGA_NAND_CLE = 0;
}

/**
发送地址的五个字节
unsigned int nColAddr        这个是列地址值  它在列地址的低12位.
unsigned int nRowAddr        这个是行地址值  它在行地址的低19位.
1st.  [  7 -  0]
2nd. [11 -  8]

3rd.  [19 -12]
4th.  [27 -20]
5th.  [30-28]
**/
void NANDFLASH_address_Send5(unsigned int nColAddr, unsigned int nRowAddr)
{
        int i;
        unsigned char chAddr;
       
        /*纠错*/
        nColAddr &= 0xfff;
        nRowAddr &= 0x7ffff;

        /*check busy*/
        while(!FPGA_NAND_RB_);
        FPGA_NAND_CE_ = 0;
        NANDFLASH_DelayNS(20);

        FPGA_NAND_CLE = 0;

        for(i=0; i<5; i++)
        {
                /*check busy*/
                while(!FPGA_NAND_RB_);
               
                FPGA_NAND_ALE = 1;
                FPGA_NAND_WE_ = 0;
               
                /*共5次,每次取出数据*/
                switch(i)
                {
                case 0:
                case 1:
                        chAddr = (nColAddr>>(i*8)) & 0xff;
                        break;
                case 2:
                case 3:
                case 4:
                        chAddr = (nRowAddr>>((i-2)*8)) & 0xff;
                        break;
                }
                FPGA_NAND_IO07 = chAddr;   /*写入地址*/
                NANDFLASH_DelayNS(12);
                FPGA_NAND_WE_ = 1;
                NANDFLASH_DelayNS(5);
                FPGA_NAND_ALE = 0;
                NANDFLASH_DelayNS(10);
        }
}

/**
读取状态
读取状态寄存器.
unsigned char chCmd command 它只能是0x70, or 0x7b;
0x70 Read Status
0x7b Read EDC Status
**/
unsigned char NANDFLASH_ReadStatus(unsigned char chCmd)
{
        unsigned char chData;

        /*0x70 or 0x7b*/
        NANDFLASH_cmd_Send(chCmd);

        NANDFLASH_DelayNS(60);/*60*/
        FPGA_NAND_RE_ = 0;
        NANDFLASH_DelayNS(5);/*5*/
        chData = FPGA_NAND_IO07;
        FPGA_NAND_RE_ = 1;
        NANDFLASH_DelayNS(15);/*15*/
        return chData;
}

/**
读取器件ID:        ReadID
**/
unsigned int NANDFLASH_ReadIDOperation()
{
        int i;
        unsigned char chtemp[5];

        memset(chtemp, 0, 5);
        /*Send command 90*/
        NANDFLASH_cmd_Send(0x90);
        /*地址1*/
        chtemp[0] = 0;
        NANDFLASH_address_Send_N(chtemp, 1);

        FPGA_NAND_CLE = 0;
        FPGA_NAND_CE_ = 0;
        FPGA_NAND_WE_ = 1;
        FPGA_NAND_ALE = 0;
        NANDFLASH_DelayNS(10);

        /*0=makecode 1=DeviceCode 2=3rdcyc. 3=4thcyc. 4=5thcyc.*/
        for(i=0; i<5; i++)
        {       
                NANDFLASH_DelayNS(10);
                FPGA_NAND_RE_ = 0;
                while(!FPGA_NAND_RB_);
                chtemp = FPGA_NAND_IO07;
                FPGA_NAND_RE_ = 1;       
        }

        printf("Compare ID: EC D3 51 95 58\n");
        printf("Read ID Operation\nCurrent: ");
        /*这里是EC D3 51 95 58*/
        for(i=0; i<5; i++)
        {       
                printf("%02X ", chtemp);
        }
        
        printf("\n");
}


/**
功    能: 写一页的数据到FLASH中
输入参数:
unsigned int nPageIndex  页索引.  范围:   0-512k.   512K = 2的19次方
unsigned char *pData          写入的数据
返 回 值:
0 成功
非0 失败  
**/
unsigned char NANDFLASH_Page_WriteData(unsigned int nPageIndex, unsigned char *pData)
{
        unsigned int i;
        unsigned char chtemp;

        if(!pData)
                return 1;
        if(nPageIndex >= 0x80000)  /**/
                return 2;

        /*发送命令 80H*/
        NANDFLASH_cmd_Send(0x80);
        /*发送地址 col.addr and row.addr*/
        NANDFLASH_address_Send5(0, nPageIndex);  /*第一个参数是列地址A11-A0, 第二个参数是行地址A30-A12*/
       
        FPGA_NAND_CLE = 0;
        FPGA_NAND_CE_ = 0;
        FPGA_NAND_ALE = 0;
        FPGA_NAND_RE_ = 1;
        NANDFLASH_DelayNS(10);
        for(i=0; i<2112; i++)   /*一页= 2112字节*/
        {
                FPGA_NAND_WE_ = 0;
                FPGA_NAND_IO07 = pData;   /*写入数据*/
                NANDFLASH_DelayNS(10);
                FPGA_NAND_WE_ = 1;
                NANDFLASH_DelayNS(10);
        }
        /*发送命令 10h*/
        NANDFLASH_cmd_Send(0x10);
        while(!FPGA_NAND_RB_);

        /*读状态寄存器0x70*/
        NANDFLASH_DelayNS(10);
        chtemp = NANDFLASH_ReadStatus(0x70);
        /*检查I/O_0 是否为0 */
        if((chtemp&0x1) == 0)  
                return 0;

        printf("\nWrite Error:%02X\n", chtemp);
        return 1;
}

/**
功能: 读取一页数据到BUFFER中.
unsigned int nPageIndex,   页索引, 取值范围: 0-512K
unsigned char *pData        读出来放入的内容
success: 0
falied:        !0
**/
unsigned char NANDFLASH_Page_ReadData(unsigned int nPageIndex, unsigned char *pData)
{
        unsigned int i;

        if(!pData)
                return 1;
        if(nPageIndex >= 0x80000)
                return 2;

        /*发送命令 00H*/
        NANDFLASH_cmd_Send(0);
        /*发送地址col.addr  and row.addr*/
        NANDFLASH_address_Send5(0, nPageIndex);/*第一个参数是列地址A11-A0, 第二个参数是行地址A30-A12*/
        /*发送命令  30H*/
        NANDFLASH_cmd_Send(30);
        /*等待空闲*/
        while(!FPGA_NAND_RB_);

        FPGA_NAND_RE_ = 1;
        FPGA_NAND_CLE = 0;
        FPGA_NAND_CE_ = 0;
        FPGA_NAND_WE_ = 1;
        FPGA_NAND_ALE = 0;
        NANDFLASH_DelayNS(10);
        for(i=0; i<2112; i++)/*一页数据 = 2112B*/
        {
                FPGA_NAND_RE_ = 0;
                NANDFLASH_DelayNS(10);
                pData = FPGA_NAND_IO07;   /*读取1B*/
                FPGA_NAND_RE_ = 1;
                NANDFLASH_DelayNS(10);
        }
        return 0;
}

void main()
{
        unsigned char szbuf[2112];
        unsigned int i, nret;

        /*准备数据*/
        for(i=0; i<2112; i++)
                szbuf = i%256;
        /*写一页*/
        nret =         NANDFLASH_Page_WriteData(0, szbuf); /*写第0页*/
        if(nret)
                printf("写入失败\n");
        else
                printf("写入成功");

        memset(szbuf, 0, 2112);
        /*读取一页*/
        nret = NANDFLASH_Page_ReadData(0, szbuf);
        if(nret)
        {
                printf("读取失败\n");
                return;
        }
        else
                printf("读取成功");
        /*这里打印出来的数据始终是1E 1E ... 1E FF FF ... FF  并不是我想要的内容*/
        for(i=0; i<2112; i++)
        {
                if((i%16) == 0)   /*每行16个*/
                        printf("\n");
                printf("%02X ", szbuf);
        }
        return;
}

最新回复

大侠,能告诉我是怎么解决的嘛  我现在这也差不多有同样的问题,我页写后读出来的全是0xFF,帮帮忙啊  详情 回复 发表于 2009-7-29 16:48
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
在线等待......解决了还可以加分.....
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个是MLC的?
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 gooogleman 的回复:
这个是MLC的?


不知道是SLC还是MLC...
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
那个资料里我没去看到底是他里面的NAND Cell内容
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
有没有那位哥哥曾经弄过了的哦.帮忙看下...
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
这个,恩,友情帮顶:)
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
555555555555555555555555555, help
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

9
 
这么大的容量没有做过。O(∩_∩)O哈哈~靠你自己了。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 
这个是SLC的。
你写数据前有Erase吗?
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
能读出ID说明操作时序是没问题的。
在main里面,还是需要Erase的。写之前必须擦除。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

12
 
我试一下看看.

还有就是里面有个reset操作,问下,那些情况下需要reset哦.
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 10 楼 shuiyan 的回复:
能读出ID说明操作时序是没问题的。
在main里面,还是需要Erase的。写之前必须擦除。

试过了,还是不行......

下面是我的擦除代码.
/***************************************************************************
功    能:        擦除块.
输入参数:        unsigned int nBlockIndex 所在块的索引  0-8191.  1Device = 8192 Blocks
返 回 值:        擦除是否成功 非0有错误
                        0        成功
                        !0        失败   -1参数错误. 1  擦除失败
***************************************************************************/
int NANDFLASH_Block_Erase(unsigned int nBlockIndex)               
{
        unsigned int ntemp;
        unsigned char chtemp;
        unsigned int nRowAddr, nColAddr;
       
        /*传入参数检测错误*/
        if(nBlockIndex >= 8192)
                return -1;

        /*发命令60H*/
        NANDFLASH_cmd_Send(0x60);

        /*得到行列地址*/
        nColAddr = 0;  /*这个不用发送*/
        nRowAddr = nBlockIndex * 64;
        
        /*发送行地址,3个字节 rowaddr*/
        NANDFLASH_address_Send3(nRowAddr);  
        
        /*发送命令  D0H*/
        NANDFLASH_cmd_Send(0xd0);
  
        NANDFLASH_DelayNS(200);/*200.   1.5ms, */

        /*check busy*/
        while(!FPGA_NAND_RB_);

        /*read status register 0x70*/
        chtemp = NANDFLASH_ReadStatus(0x70);

        if((chtemp & 0x1) == 0)
                return 0;
        printf("EraseError:0x[%02x]", chtemp);
        return 1;  
}
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 
感觉好像没什么问题,Flash的问题很难调试啊。
多试试,看看往其他页写完再读是什么情况。
读出有什么1E的数据的页之后用Erase擦除后不要写直接读看看数据和之前的是否一样。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 
放在ADS下使用仿真器,调试较方便,直接放到wince下很是郁闷的。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 13 楼 gsymichael 的回复:
感觉好像没什么问题,Flash的问题很难调试啊。
多试试,看看往其他页写完再读是什么情况。
读出有什么1E的数据的页之后用Erase擦除后不要写直接读看看数据和之前的是否一样。



往其他页写也是一样的.

我这样做: 擦除->写 -> 读  (还是0x1E)
         读(还是0x1E) -> 擦除->写 -> 读  (还是0x1E)
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

17
 
不懂,up
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

18
 
不懂,up
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 15 楼 ylmszhanghua 的回复:

往其他页写也是一样的.

我这样做: 擦除->写 -> 读  (还是0x1E)
        读(还是0x1E) -> 擦除->写 -> 读  (还是0x1E)

你擦除后不要写,直接读,看看还是不是0x1E.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

20
 
/*************************************************************************
功能: 读取一页数据到BUFFER中.
nPageIndex 范围:
success:                 0
falied:        !0
*************************************************************************/
unsigned char NANDFLASH_Page_ReadData_bak_2(unsigned int nPageIndex, unsigned char *pData)
{
             int i;
             unsigned char szbuf[5];

             if(!pData)
                          return 1;
             if(nPageIndex >= 0x80000)
                          return 2;
             memset(szbuf, 0, 5);
             /*send command 0*/
             NANDFLASH_cmd_Send(0);
             /*send addr*/
             szbuf[0] = 0;
             szbuf[1] = 0;
             szbuf[2] = nPageIndex & 0xff;
             szbuf[3] = (nPageIndex>>8) & 0xff;
             szbuf[4] = (nPageIndex>>16) & 0x7;
             NANDFLASH_address_Send_N(szbuf, 5);

             /*send command 30h*/
             NANDFLASH_cmd_Send(0x30);
             /*wait for ready*/
             while(!FPGA_NAND_RB_);

             FPGA_NAND_CE_ = 0;
             NANDFLASH_DelayNS(60);
             FPGA_NAND_CLE = 0;
             FPGA_NAND_WE_ = 0;
             FPGA_NAND_ALE = 0;
             FPGA_NAND_RE_ = 1;
             NANDFLASH_DelayNS(60);
             for(i=0; i<2112; i++)
             {
                          FPGA_NAND_RE_ = 0;
                          NANDFLASH_DelayNS(60);
                          pData = FPGA_NAND_IO07;
                          NANDFLASH_DelayNS(60);
                          FPGA_NAND_RE_ = 1;
                          NANDFLASH_DelayNS(60);
             }
             return 0;
}
以上代码,读出来是这样的(每行16个16进制).  我估计是我的读时序问题.
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30
32 30 32 32 32 32 32 30 36 34 34 36 36 36 36 36
36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36
36 36 36 36 36 36 36 36 36 36 36 36 36 B6 B6 B6
B6 B6 B7 B7 B7 B7 B7 B7 B7 B7 B7 F7 F7 F7 F7 F7
F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
同上
F7 F7 F7 F7 F7 F7 F7 F7 FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
同上
同上
同上
同上
同上
同上
同上
同上(后面全部)
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表