各位工作人员、各位高手大家好哈,我最近在学习C6678,最近几天在看EMIF通信的相关内容,用的是TI的评估板TMDSEVM6678L ,在社区里面下载了http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/6242.aspx这个网页上提供的例程,但是这个例程的问题不少,我试着修改了相关csl宏定义,编译总算通过,但是执行还是有错误,修改了很久都还是没对…想问问工作人员有没有就是针对C6678的EMIF通信例程啊?
Jane Lu:
您好,下面这个软件包中EMIF例程应该在EVM板子上验证过的,您可以看一下:
http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx
西山青雀:
回复 Jane Lu:
非常感谢工作人员的回答哈,我今天上午的时候也找到这个工程包,倒腾了一个下午,然后EMIF16终于是运行通过了…我再问一下哈,有没有适用于的和DDR3进行通信的例程呢?
西山青雀:
回复 Jane Lu:
谢谢谢谢!实在非常感谢工作人员的细心解答,我今天上午看到了,然后跑通了哈,真的是非常感谢~
不过又出现新问题了,我昨天跑通了一次EMIF的程序,成功了的,但是今天上午我想重复一下EMIF的程序,不过失败了,错误提示大致如下——
block 3583 is marked bad!
ERROR: Erasing NAND failed!
!!!Failed erase block at 0x3800000 for Memory Fill Test.
请问造成这种情况的原因可能是什么呢?
西山青雀:
回复 Jane Lu:
工作人员你好,我周末的时候又试了很多次EMIF这个历程,当我选择#define NAND_FLASH_TEST 1进行NAND Flash测试的时候,出现的错误如下——
Erasing blocks 3584 through 3599block 3585 is marked as bad! ERROR: Erasing NAND failed.!!!Failed erase blocks at 0x3800000 for Memory Fill Test
但是我第一次测试这个EMIF例程的时候是成功的,我想请问一下这个有可能是我评估板上的NAND Flash坏掉了么?还是有其他可能的原因啊?
Allen35065:
回复 西山青雀:
NAND出现坏块是很正常的,一般会在使用中避开坏块;有些软件坏块你可以将其修改到正常,但硬件坏块就没有办法了,必须要绕过。
转载一篇文章供参考。
Nand Flash 中的坏块(Bad Block)
Nand Flash 中,一个块中含有 1 个或多个位是坏的,就称为其为坏块 Bad Block。
坏块的稳定性是无法保证的,也就是说,不能保证你写入的数据是对的,或者写入对了,读
出来也不一定对的。与此对应的正常的块,肯定是写入读出都是正常的。
坏块有两种:
(1) 出厂时就有存在的坏块:
一种是出厂的时候,也就是,你买到的新的,还没用过的 Nand Flash,就可以包含了坏块。
此类出厂时就有的坏块,被称作 factory (masked) bad block 或 initial bad/invalid block,在出
厂之前,就会做对应的标记,标为坏块。
(2) 使用过程中产生的坏块:
第二类叫做在使用过程中产生的,由于使用过程时间长了,在擦块除的时候,出错了,说明
此块坏了,也要在程序运行过程中,发现,并且标记成坏块的。具体标记的位置,和上面一
样。这类块叫做 worn-out bad block。即用坏了的块。
坏块的标记
具体标记的地方是,对于现在常见的页大小为 2K 的 Nand Flash,是块中第一个页的 oob 起
始位置(关于什么是页和 oob,下面会有详细解释)的第 1 个字节(旧的小页面,pagesize
是 512B 甚至 256B 的 Nand Flash,坏块标记是第 6 个字节) 如果不是 0xFF, 就说明是坏块。
相对应的是,所有正常的块,好的块,里面所有数据都是 0xFF 的。
不过,对于现在新出的有些 Nand Flash,很多标记方式,有些变化,有的变成该坏块的第一
个页或者第二个页,也有的是,倒数最后一个或倒数第二个页,用于标记坏块的。
具体的信息,请参考对应的 Nand Flash 的数据手册,其中会有说明。
对于坏块的标记,本质上,也只是对应的 flash 上的某些字节的数据是非 0xFF 而已,所以,
只要是数据,就是可以读取和写入的。也就意味着,可以写入其他值,也就把这个坏块标记
信息破坏了。对于出厂时的坏块,一般是不建议将标记好的信息擦除掉的。
uboot 中有个命令是“nand scrub”就可以将块中所有的内容都擦除了,包括坏块标记,不论
是出厂时的,还是后来使用过程中出现而新标记的。一般来说,不建议用这个。
不过,在实际的驱动编程开发过程中,为了方便起见,我倒是经常用,其实也没啥大碍,呵
呵。不过呢,其实最好的做法是,用“nand erase”只擦除好的块,对于已经标记坏块的块,
不要轻易擦除掉,否则就很难区分哪些是出厂时就坏的,哪些是后来使用过程中用坏的了。
坏块的管理
对于坏块的管理,在 Linux 系统中,叫做坏块管理(BBM,Bad Block Management) ,对应
的会有一个表去记录好块,坏块的信息,以及坏块是出厂就有的,还是后来使用产生的,这
个表叫做坏块表(BBT,Bad Block Table) 。在 Linux 内核 MTD 架构下的 Nand Flash 驱动,
和 Uboot 中 Nand Flash 驱动中,在加载完驱动之后,如果你没有加入参数主动要求跳过坏
块扫描的话,那么都会去主动扫描坏块,建立必要的 BBT 的,以备后面坏块管理所使用。
坏块的比例
而关于好块和坏块,Nand Flash 在出厂的时候,会做出保证:
1.关于好的,可以使用的块的数目达到一定的数目,比如三星的 K9G8G08U0M,整个 flash
一共有 4096 个块,出厂的时候,保证好的块至少大于 3996 个,也就是意思是,你新买到这
个型号的 Nand Flash,最坏的可能, 有 3096-3996=100 个坏块。不过,事实上,现在出
厂时的坏块,比较少,绝大多数,都是使用时间长了,在使用过程中出现的。
2.保证第一个块是好的,并且一般相对来说比较耐用。做此保证的主要原因是,很多 Nand
Flash 坏块管理方法中,就是将第一个块,用来存储上面提到的 BBT,否则,都是出错几率
一样的块,那么也就不太好管理了,连放 BBT 的地方,都不好找了,^_^。
一般来说,不同型号的 Nand Flash 的数据手册中,也会提到,自己的这个 Nand Flash,最多
允许多少个坏块。就比如上面提到的,三星的 K9G8G08U0M,最多有 100 个坏块。
西山青雀:
回复 Allen35065:
工作人员你好,非常感谢你的继续回答~
我周末的时候稍微看了看例程,发现例程应该是片选了CE0的3584到4096这一段地址(源代码是4096*7/8到4096),我运行的结果居然是这一段block全部都marked as bad,这512个block全坏掉的概率应该很小的吧?而最让我觉得奇怪的是我上周星期四运行都成功了,结果星期五运行就失败了,这让我觉得非常费解,请问可能的原因是哪些呢?
还有,如果的确是坏了的话,那也应该是CE0出现了坏块吧?请问应该怎么将例程改为用EMIF和CE1进行通信呢?
西山青雀:
回复 Allen35065:
工作人员你好,非常感谢你的继续回答~
我周末的时候稍微看了看例程,发现例程应该是片选了CE0的3584到4096这一段地址(源代码是4096*7/8到4096),我运行的结果居然是这一段block全部都marked as bad,这512个block全坏掉的概率应该很小的吧?而最让我觉得奇怪的是我上周星期四运行都成功了,结果星期五运行就失败了,这让我觉得非常费解,请问可能的原因是哪些呢?
还有,如果的确是坏了的话,那也应该是CE0出现了坏块吧?请问应该怎么将例程改为用EMIF和CE1进行通信呢?
西山青雀:
回复 Allen35065:
额,你的意思是先不进行是否坏块的判断,直接强行用0xFF(我觉得应该是0xFFFFFFFF吧?)进行写操作么?