MDK工具包中自带的FLASH编程算法的问题

S3C2410 + ULINK2 + MDK

 

MDK环境下有个功能可以支持直接把bin文件下载到nandflash中的制定区域,这对于开发还是很方便的,我在调试2410开发板中已经实现了该功能,但过程中还是出现了一些问题。

 

MDK工具包中自带有FLASH文件夹,其下是很对不同的flash编程算法,我的板子是S3C2410,经查看,其下没有针对2410的型号,不管3721,先试一下这个2440的编程算法会出什么问题,一点击download,出现Flash Timeout 错误提示,详细很多朋友都对这个错误提示不陌生。

后来我再稍微详细的读了其编程代码的实现和参数的配置,发现应该没有问题了啊(其实还有问题,很隐蔽),点击download依然Flash Timeout

在继续之前先说明一下我个人想法。为什么会报Flash Timeout提示了,这应该是MDK对nand操作的一种机制。我们看到一个结构如下:

 

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "S3C2440 NAND Flash SP",    // Device Name
   EXT8BIT,                    // Device Type
   0x30000000,                 // Device Start Address
   0x08000000,                 // Device Size in Bytes (128MB)
   512,                        // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   200,                        // Program Page Timeout 200 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

  // Specify Size and Address of Sectors
   0x4000, 0x000000,           // Sector Size 16kB
   SECTOR_END
};

其中有个参数为3000,正常情况下nand是块擦出,速度是很快的,如果erase操作在3s内依然没有响应,那么MDK就会报错,Flash timeout。

 

回来原话题。。。查看K9F1208datasheet发现nand的第一个block厂商保证肯定是绝对没有bad block的,而通过我的LED调试方法,逐步定位错误,发现nand程序竟然连 1st block都当做是坏块,这说明了最大的可能性是它自带的编程算法的出错,当然还有可能是nand芯片挂了(我可不期望是这个),再仔细对照其判断1st block是否为坏块的代码,再和2410的手册对照,发现其对于NFDATA寄存器的操作都是按照32位来的,spare area 区域的16个字节分了4次读完,但手册说看到nand控制器是把NFDATA当做16位来操作的,问题原因就出来了。。。后面的解决方法我不用多说了,重新改过之后,点击download一步到位。。。

 

关键词:led定位方法、nand的1st肯定不是坏块

 

 

 

你可能感兴趣的:(嵌入式软件)