搜索
bottom↓
回复: 30

S3C6410操作Nand Flash遇到的问题(请大家帮忙看一下)

[复制链接]

出0入0汤圆

发表于 2012-12-18 18:46:08 | 显示全部楼层 |阅读模式
最近开始学ARM,板子是OK6410,256MB DDR,2GB Nand Flash,型号为K9GAG08U0D。
看过韦东山老师的S3C6410视频,看了S3C6410的芯片手册,然后按照讲解来设置Nand Flash控制器,结果设置完成了之后,Nand Flash一直不能继续读写,读出来的数据都是0x30,ASCII码值对应为0。而且写数据也不正确,Read ID操作得到的结果也不正确。调了一天了还是出不来,请大家帮忙看看什么原因。
程序如下:
void Nand_Init(void)                                //Nand Flash控制器初始化
{
        rMEM_SYS_CFG &= ~((1<<1)|(1<<3));
        rNFCONF &= ~((1<<30) | (7<<12) | (7<<8) | (7<<4));
        rNFCONF |= (0<<12)|(2<<8)|(1<<4);        //TACLS=0,TWRPH0=2,TWRPH1=1       
                rNFCONT |= 1;
        Nand_Reset();
}

void Nand_Select(u8 n)                               //使能片选                                                       
{
        rNFCONT &= ~(n<<1);
}

void Nand_Deselect(u8 n)                                                               
{
        rNFCONT |= n<<1;
}

void Nand_Cmd(u8 cmd)                                           //命令寄存器
{
        rNFCMMD = cmd;
}

void Nand_Addr(u8 addr)                                          //地址寄存器
{
        rNFADDR = addr;
}

void Nand_Data(u32 data)                                        //数据寄存器
{
        rNFDATA = data;
}

u8         Nand_Stat(void)                                    //Nand Flash状态检测
{
        if(rNFSTAT&1==0)
                return 0;
        else
                return 1;
}

void Nand_Write(u16 block,u8 page,u16 column,u8 data)
{
        Nand_Select(1);
        Nand_Cmd(0x80);                        //这里将地址都设置为0是试验能否向0地址写入数据
        Nand_Addr(0x00);
        Nand_Addr(0x00);
        Nand_Addr(0x00);
        Nand_Addr(0x00);
        Nand_Addr(0x00);
        rNFDATA = data;
        Nand_Cmd(0x10);
        Nand_Wait();
}

u8         Nand_Read(u16 block,u8 page,u16 column)//Nand_Read未能正确访问Nand Flash,读出数据均为48(0x30)
{
        u8 data;
        Nand_Select(1);
        Nand_Cmd(0x00);                     //这里将地址都设置为0是试验能不能从0地址读出数据
        Nand_Addr(0x00);
        Nand_Addr(0x00);
        Nand_Addr(0x00);
        Nand_Addr(0x00);
        Nand_Addr(0x00);
        Nand_Cmd(0x30);
        Nand_Wait();
        data = rNFDATA&0xFF;
        return data;
}

main()
{
              Nand_Init();
              Nand_Select(1);
              Nand_Write(0,0,0,0xCC);
              Uart_Trans(Nand_Read(0,0,0));     //通过串口发送读到的数据,显示为0,ASCII码值为0x30
}
读出结果一直不正确,写入结果也不正确,另外想问下,Nand Flash接了两个片选Xm0CSn2和Xm0CSn3到底哪个起作用?Nand Flash的Plane是怎么回事?

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-12-19 11:52:08 | 显示全部楼层
我菜鸟,也在学这个。
rMEM_SYS_CFG &= ~((1<<1)|(1<<3));这个不对吧,原理图用到Xm0CSn[2]没用Xm0CSn[3],而且你这样设置后为    bit1和bit3都为0,s3c6410数据手册上没这种配置
你直接把韦东山的代码修改下改成每页4K,时间参数(  //TACLS=0,TWRPH0=2,TWRPH1=1   )先用最大的试,就可以

出0入0汤圆

 楼主| 发表于 2012-12-19 13:07:16 | 显示全部楼层
y249077293 发表于 2012-12-19 11:52
我菜鸟,也在学这个。
rMEM_SYS_CFG &= ~((1

我OK6410的原理图上两个脚都接了,后来我找不到Xm0CSn3应用的地方,就修改了只用Xm0CSn2。
现在我读ID操作终于正确了,方法是发出90h命令和00h地址后马上读NFDATA寄存器,刚开始按Byte和Half word访问还是不对,后来按Word访问才得到正确的结果:ECh,D5h,94h,29h,34h,41h。看到手册上说可以按Byte,Half Word和Word访问,但是搞不清楚NFDATA的访问方式需要设置吗?要不然怎么确定是按哪种方式访问的?

出0入0汤圆

发表于 2012-12-19 19:57:28 | 显示全部楼层
dboyzju 发表于 2012-12-19 13:07
我OK6410的原理图上两个脚都接了,后来我找不到Xm0CSn3应用的地方,就修改了只用Xm0CSn2。
现在我读ID操 ...

6. SFR I/F: Support Byte/half word/word access to Data and ECC Data register, and Word access to other
registers
他只说Data and ECC Data register这两个支持Byte/half word/word access,其他的都要用字访问。可能是这样吧,我也不太懂

但是搞不清楚NFDATA的访问方式需要设置吗?要不然怎么确定是按哪种方式访问的?-》这个我也不知道

出0入0汤圆

 楼主| 发表于 2012-12-19 20:09:18 | 显示全部楼层
y249077293 发表于 2012-12-19 19:57
6. SFR I/F: Support Byte/half word/word access to Data and ECC Data register, and Word access to o ...

现在我读一个page的数据包括oob区可以读出来,但是其中大约有1/4不到的数据为0x01或0x00,其余为0xFF,不知道这样正确不,是不是因为我还没开Ecc导致读出数据出现错误?我看了手册上三星的K9GAG08U0D需要8bit的Ecc校验。但是现在写数据还不正确

出0入0汤圆

 楼主| 发表于 2012-12-20 15:28:14 | 显示全部楼层
为什么读出的数据,无论读哪个block或page都会有一部分为0或者1,而且位置都差不多?Nand Flash的Ecc校验读数据时如何利用Ecc校验来改正数据?

出0入0汤圆

发表于 2012-12-22 21:39:20 | 显示全部楼层
虽然板子不同,但我俩nand是一样的。nand读取数据必须要做ecc检验,但错误也没你那么严重。我没做ecc检验的时候读两三块数据才会出现一次错误,建议你换个位置读一下试试。我猜可能是你程序有些问题

出0入0汤圆

 楼主| 发表于 2012-12-22 22:34:10 | 显示全部楼层
ksws0482846 发表于 2012-12-22 21:39
虽然板子不同,但我俩nand是一样的。nand读取数据必须要做ecc检验,但错误也没你那么严重。我没做ecc检验的 ...

      我找到问题了,NFDATA寄存器是按Word来存取的,之前按Byte来做出现错误。
    但是Ecc校验有个地方我不明白,6410手册上写的很差劲,错误很多。K9GAG08U0D是需要8bit Ecc校验的,但是8bit的Ecc校验每512Byte生成13Byte,这款Flash的Page大小是4096Byte,也就是共产生8个13Byte(不算读写OOB时产生的Ecc码的话),写的时候可以暂存一下Ecc数据然后再一起写入OOB,但是读的时候呢?
    手册上写的每读512Byte数据就要马上读它的Ecc校验码,然后硬件会自动解码并产生错误信息用以修正。这个过程如何实现,校验码需要读到哪里,还是只是读出来不管放到哪里?
    Nand Flash每次读取的时候都会把一个page的数据发送到Flash内部的page 缓存中,如果只读了前512Byte没法在同一个读周期内马上读它的Ecc校验码。看前面1bit Ecc的时候是读完512Byte数据后把它的校验码放入一个寄存器中,然后硬件就会开始计算。这里8bit Ecc的时候没找到对应的寄存器,那个1bit的对应寄存器总共只能装4Byte的数据。希望能给我讲一下这部分的实现,谢谢。

出0入0汤圆

发表于 2012-12-24 19:59:01 | 显示全部楼层
我也是最近刚弄这玩意儿,手册上的意思是每读取512个字节的数据硬件就会自动生成校验码,也就是说读取512个字节后就需要读取校验码,然后在读取剩余部分。我用的是软件检验,硬件检验我没读出来。6410手册上给的方法好像是错的。

出0入0汤圆

 楼主| 发表于 2012-12-24 22:19:15 | 显示全部楼层
ksws0482846 发表于 2012-12-24 19:59
我也是最近刚弄这玩意儿,手册上的意思是每读取512个字节的数据硬件就会自动生成校验码,也就是说读取512个 ...

6410手册做的不太好啊,无语这么重要的东西都不好好弄。

出0入0汤圆

发表于 2012-12-25 12:48:27 | 显示全部楼层
就是说你现在还没有对读取到的数据进行校验对吗?我遇到的问题是“如何写入的数据进行判断,是否写入正确”,手册上的方法要么我没理解,要么扯淡,读状态完全没有用。不知道你有没有遇到这个问题。

出0入0汤圆

发表于 2012-12-25 16:34:54 | 显示全部楼层
飞凌nand驱动开源了吗,还是说像友善一样封装成了一个库提供给用户的,源代码不给,叫你自己去实现。

出0入0汤圆

 楼主| 发表于 2012-12-25 16:41:27 | 显示全部楼层
我找到了uboot里面,操作函数有,但是到内部的具体操作调用的函数都找不到源代码啊。。。比如说读写数据时用的read_buf和write_buf等等。。。

出0入0汤圆

发表于 2013-3-27 10:10:40 | 显示全部楼层
你好!
     我在学习OK6410的Nand,可是一直不能正确读数据,可以不可以把你的代码发一份参考一下,谢谢,我QQ:571614574

出0入0汤圆

 楼主| 发表于 2013-4-24 20:53:07 | 显示全部楼层
0644138 发表于 2013-3-27 10:10
你好!
     我在学习OK6410的Nand,可是一直不能正确读数据,可以不可以把你的代码发一份参考一下,谢谢, ...

抱歉,之前住的地方一直不能上论坛。。。无语,现在终于能上了。你读不到正确数据是指什么情况?能详细描述一下么?

出0入0汤圆

发表于 2013-4-25 22:24:51 | 显示全部楼层
LZ你问题解决了吗?我被这个困扰好久了,我也是新手,NAND操作始终错误

出0入0汤圆

发表于 2013-4-25 22:26:41 | 显示全部楼层
我用飞凌自带的uboot全擦了nand之后 然后用jtag把nand内容导出看了,奇数页上全是FF  但是偶数页上有FF 还有01 00 之类的,然后我对01 00 数据的地址单元进行改写值,发现值还是01 00 就是说修改不了!不知道什么原因。

出0入0汤圆

发表于 2013-4-25 22:28:23 | 显示全部楼层
我uboot在加载ram里面OK 但是烧写到nand里面就有问题了,偶数页上数据不正常数据比较乱 还有 01 00什么的。奇数页上的数据正确的,不过每次都有半页的偏差!

出0入0汤圆

发表于 2013-4-25 22:34:16 | 显示全部楼层
ksws0482846 发表于 2012-12-24 19:59
我也是最近刚弄这玩意儿,手册上的意思是每读取512个字节的数据硬件就会自动生成校验码,也就是说读取512个 ...

每读取512个字节的数据硬件就会自动生成校验码,也就是说读取512个字节后就需要读取校验码
这个是什么意思,我读写nand也遇到和LZ一样的问题,还没找到原因,每读取512字节后就需要读取校验码吗?在哪份资料上啊,nand datasheet吗?我好想没找到
帮忙指点下 谢谢了 我困扰好久了 到处发帖 群里发问都没得到答案,非常想解决这个问题啊~~

出0入0汤圆

 楼主| 发表于 2013-4-25 22:53:51 | 显示全部楼层
Privia 发表于 2013-4-25 22:34
每读取512个字节的数据硬件就会自动生成校验码,也就是说读取512个字节后就需要读取校验码
这个是什么意 ...

nand flash需要先擦除才能写入吧,擦除后数据为0xFF。6410是从nand flash的前四页,每页读2KB共8KB到steppingstone中运行。6410自带硬件ECC校验,位数可选,有1位,4位,8位,8位的我记得是每512字节产生校验码13字节,具体记不清了,产生之后到指定的寄存器去读校验码。这个手册上有些,可以详细看下手册。

出0入0汤圆

发表于 2013-4-26 09:44:39 | 显示全部楼层
dboyzju 发表于 2013-4-25 22:53
nand flash需要先擦除才能写入吧,擦除后数据为0xFF。6410是从nand flash的前四页,每页读2KB共8KB到step ...

我昨天把资料全部翻了遍,我找到我的问题了。我A11地址概念没搞清,我今晚回家再试试。。。
“6410是从nand flash的前四页,每页读2KB共8KB到steppingstone中运行”这个我怎么看到过,这个是在哪个手册上的啊,6410手册?具体在哪部分啊。
谢谢LZ帮助了

出0入0汤圆

发表于 2013-4-26 09:45:44 | 显示全部楼层
昨天夜里好像论坛崩溃了吗?我始终登不上来。。。360浏览器,IE都不行,不知道什么情况

出0入0汤圆

发表于 2013-4-26 13:36:22 | 显示全部楼层
见三星IROM booting AN

出0入0汤圆

 楼主| 发表于 2013-4-26 17:47:13 | 显示全部楼层
ksws0482846 发表于 2013-4-26 13:36
见三星IROM booting AN

应该就是那里了,不过我也是在论坛上看到别人说了以后才知道的。

出0入0汤圆

发表于 2013-4-27 02:21:35 | 显示全部楼层
“6410是从nand flash的前四页,每页读2KB共8KB到steppingstone中运行”
这个信息出自哪里啊?我把6410手册相关的地方又翻了一遍,没找到,还是我没找全?我很想知道在哪里的呀,谢谢了啊  

出0入0汤圆

 楼主| 发表于 2013-4-27 19:35:45 | 显示全部楼层
Privia 发表于 2013-4-27 02:21
“6410是从nand flash的前四页,每页读2KB共8KB到steppingstone中运行”
这个信息出自哪里啊?我把6410手册 ...

详见23楼

出0入0汤圆

发表于 2013-4-27 23:27:32 | 显示全部楼层
dboyzju 发表于 2013-4-27 19:35
详见23楼

感谢 嘿嘿 :)

出0入0汤圆

发表于 2013-4-27 23:28:11 | 显示全部楼层
dboyzju 发表于 2013-4-26 17:47
应该就是那里了,不过我也是在论坛上看到别人说了以后才知道的。

  哈哈 是啊 我也听说的,不过我还是想要知道在哪里 自己看下心里才安心

出0入0汤圆

发表于 2013-4-27 23:28:32 | 显示全部楼层
ksws0482846 发表于 2013-4-26 13:36
见三星IROM booting AN

很感谢你 :)

出0入0汤圆

发表于 2013-5-17 10:12:20 | 显示全部楼层
dboyzju 发表于 2012-12-22 22:34
我找到问题了,NFDATA寄存器是按Word来存取的,之前按Byte来做出现错误。
    但是Ecc校验有个地方 ...

请问,你搞明白NAND ECC的这个问题了吗?我跟踪读ECC的代码,发现在读完了256字节的主存储器数据后,用write_buffer函数将写入时产生的ECC码写入到了NFDATA寄存器,貌似这个操作启动了ECC码的比较工作,但是这个函数是向NAND写入数据的函数,感觉很混乱,望指点,QQ155178505

出0入0汤圆

发表于 2013-5-20 08:33:54 | 显示全部楼层
这个主题是不是已经结贴了呀,没有回应了怎么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 04:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表