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肯定不是坏块