WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录

WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录

 

平台:WINCE6.0+S3C2451

 

先来看Read ID的时序及ID数值:

WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录_第1张图片

图1

由图1可知8Gb的,one CE#和two CE#的ID的第2nd对应的数据不同,分别是D3h和DCh。为了确认这个值,在ReadFlashID函数中增加读取第3到第5个字节的数据:

<span style="font-size:14px;">NF_nFCE_L();                                          //Deselect the flash chip.
NF_CMD(CMD_READID);                             // Send flash IDread command.
 
NF_ADDR(0);                                          // Send Address 0.
for (i=0;i<10;i++);
 
Mfg       =NF_RDDATA_BYTE();                           //Read 1 byte from NFDATA == Maker code
Dev =NF_RDDATA_BYTE();                           //Read 1 byte from NFDATA == Device code
n3rdID   =NF_RDDATA_BYTE();                           //Read 1 byte from NFDATA == Device code
n4rdID   =NF_RDDATA_BYTE();
n5rdID   =NF_RDDATA_BYTE();
      
NF_nFCE_H();     </span>

串口输出的值如下:

ManufacturerID=0x1,device code =0xd3,n3rdID=0xd1,n4rdID=0x95,n5rdID=0x58

说明这是one CE#的芯片,根据这ID的值可以动态判断所采用的flash具体类型,这样,一个BSP包就可以同时支持多种flash。

 

One CE#和two CE#的方块图如下:



图2

 

接下来看S34ML08G1有效块数量:

WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录_第2张图片

图3

再来看手册上page大小等参数的描述:

WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录_第3张图片

图4

根据这些信息,我们需要在cfnand.h文件的全局数组astNandSpec增加对S34ML08G1的支持,如下图所示:

WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录_第4张图片

图5

做了上面这些修改后,从SD卡启动把系统镜像文件烧录到flash后,重启,没有看到任何的串口输出信息,系统无法启动,为什么呢?是因为在从flash启动时,stepldr\main.c文件中读取ID的ReadFlashID因为还没有增加对S34ML08G1的支持,所以读取的ID并不在条件判断的范围内,直接就返回FLASE了,这样导致stepldr没有拷贝eboot的数据,从而无法启动,增加了下面内容后就OK了:

<span style="font-size:14px;">DWORDReadFlashID(void)
{
       BYTE Mfg, Dev, i;
       volatile int ReadID;
       UINT32 nRet;
 
       bLARGEBLOCK = FALSE;
       nRet = TRUE;
      
       NF_nFCE_L();
 
       NF_CMD(0x90);                       // Send flash ID read command.
 
       NF_ADDR(0);      
       for (i=0; i<10; i++);
 
       Mfg       =NF_RDDATA8();              // Maker code
       Dev =NF_RDDATA8();              // Devide code(K9S1208V:0x76),(K9K2G16U0M:0xca)
 
       NF_nFCE_H();
 
       if (Mfg == (UINT8)0xEC)
       {
              if (Dev >= (UINT8)0xA0)
                     bLARGEBLOCK = TRUE;
       }
       else if (Mfg == (UINT8)0x98)
       {
       }
       else if (Mfg ==(UINT8)0x01)//S34ML08G1----kandi add at 2014.06.05
       {
              bLARGEBLOCK = TRUE;//becauseS34ML01G1/02G1/04G1/08G1 page size=2048+64,no include small page size(512+16)
       }
       else
       {
              nRet = FALSE;
       }
 
       ReadID = (DWORD)((Mfg<<8)+Dev);
 
//    Uart_SendString("FlashID :");
//    Uart_SendDWORD(ReadID,1);
 
//    return ((DWORD)(Mfg<<8)+Dev);
       return nRet;
}</span>

由于Spansion的S34ML01G1/02G1/04G1/08G1系列的flash页大小都是2048+64,没有小页(512+16),所以有bLARGEBLOCK = TRUE。

 

接下来来看S34ML08G1对NOP的要求,如下图:

WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录_第5张图片

图6

也就是说1个相同页最多只允许4次的编程周期,这可以从FAL+FMD模型的flash驱动的FAL层可以看出来,此源代码在WINCE600\PRIVATE\WINCEOS\DRIVERS\MSFLASH,比如可从fal.cpp的FileSysFal::InternalWriteToMedia函数下面看出来,对每页的调用3次FMD层的写函数FMD_WriteSector,第1次写spare数据,第2次写main和spare数据,第3次写spare数据,如果超过了所限定的4次就很有可能导致无法完全进入WINCE系统,这个问题在三星的K9K8G08U0E上就出现过,详细见链接:

http://blog.csdn.net/loongembedded/article/details/25906781

 

你可能感兴趣的:(WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录)