4531|8

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

关于 三星的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;
}

最新回复

是一个项目中的一小部分的小部分  详情 回复 发表于 2009-1-18 01:01
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
格式没有排好,重新排.
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
SLC, 8Gbit(1GB), 2048Bytes/page。好像发了两遍?

你是用FPGA做nand控制器?还是使用了一个包含NAND接口IP核的FPGA?研究所的?学校的?实际项目中很少看到用FPGA的。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
1Device = 8192 Blocks
1Block = 64Pages
1Page = 2112 Bytes.
我是在ARM上操控FPGA,而NAND FLASH 引脚是接在FPGA上的.恩就是,这个缩进没有排好.不大好看代码
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 ylmszhanghua 的回复:
1Device = 8192 Blocks
1Block = 64Pages
1Page = 2112 Bytes.
我是在ARM上操控FPGA,而NAND FLASH 引脚是接在FPGA上的.恩就是,这个缩进没有排好.不大好看代码


你不是搞定了吗?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
另外我看你结的那个帖子说擦除不是以块为单位擦除的?
我们是以块为单位擦除的,难道你的flash比我们高级那么多,可以只擦除我们要改变的页而已?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
呵呵,谢谢关心,已经搞定了,在另外一个帖子,这个是我最先发的帖子,但是因为缩进没有弄好,所以我从新发了一帖子,这个没来得级结贴,
我说过擦除不按块???
有人说写之前必须要擦出,我说写之前不用擦除。因为我写的是页,而擦除是块,并且我已经试验过,不需要擦除。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 2 楼 shuiyan 的回复:
SLC, 8Gbit(1GB), 2048Bytes/page。好像发了两遍?

你是用FPGA做nand控制器?还是使用了一个包含NAND接口IP核的FPGA?研究所的?学校的?实际项目中很少看到用FPGA的。



我NAND FLASH是接在FPGA上的,而我是在ARM上去控制FPGA里的地址去控制FLASH,因为ARM和FPGA都要对FLASH进行访问,当然FPGA并不是只是去控制FLASH ,不然就成了 用牛刀杀小鸡,FPGA还有做其他事情,访问FLASH只是里面很小的一个内容
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

9
 
是一个项目中的一小部分的小部分
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表