⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hy29lv160.c

📁 源代码为ARM2410上NAND FLASH 的驱动程序
💻 C
字号:

/*-------------------------------------------------------------------
Function  :   Erase and Programmer HY29LV160
Author    :   kreal@163.net
Creat Date:   04-05-12
---------------------------------------------------------------------*/


#define HY29LV160_G
#include "sysincludes.h"

#define  ResetFlash()    WR( 0, 0xf0f0 )

void  WR( ushort addr, ushort data ) 
{
   
  volatile  ushort *pAddr ;
    
  pAddr = ( ushort * ) (addr << 1 ) ;
  
  *pAddr = data ; 

   
}  

ushort RD( ushort addr ) 
{
   ushort data ;
   volatile  ushort  *pAddr ;
   
   pAddr = ( ushort *) ( addr<<1  ) ;
    
   data = *pAddr ; 

   return data ;

} 


void CheckFlashID( void ) 
{
    ushort ManID ,devId ;
   
   // ResetFlash() ;
     
    WR( 0x555, 0xAAAA) ; 
    WR( 0x2AA, 0x5555 ) ; 
    WR( 0x555, 0x9090 ) ; 
    
    ManID = RD( 0x0 ) ;
    
  //  ResetFlash() ;
    WR( 0x555,0xaaaa );
    WR( 0x2aa,0x5555 );
    WR( 0x555,0x9090 );
    
     devId= RD( 0x1  );
     
     
    

    if( ManID == 0xAD && devId == 0x2249  ) 
       printf( "\r\nFlash Id 0x2249") ; 
    else 
       printf( "\r\nFlashId Error ") ; 
       
       
    ResetFlash() ; 

}


char  DectOver( ushort *ptr , ushort TrueData, ulong timecount  ) 
{
   ulong  tmptime  = timecount ; 
   volatile  ushort *pAddr ; 
   ushort  CurTrueData ; 
  
   

   CurTrueData = TrueData &0x8080 ; 
  
   pAddr = ptr ;
   
   while( (*pAddr&0x8080) != CurTrueData ) 
   {
      if( tmptime-- == 0 ) return FALSE ; 
   
   }  // D7
   
   return TRUE ; 

}





char  EraseSector( ushort *EraseAddr  ) 
{
  
   volatile ushort  *FlashEraseAddr ;
   
   FlashEraseAddr = EraseAddr ;  

   WR( 0x555, 0xAAAA ) ;
   WR( 0x2AA, 0x5555 ) ; 
   WR( 0x555, 0x8080 ) ; 
   WR( 0x555, 0xAAAA ) ; 
   WR( 0x2AA, 0x5555 ) ;
    
   *FlashEraseAddr = 0x3030 ; 
   
   if(!DectOver((ushort *) FlashEraseAddr , 0xFFFF, 0x8000000 ))
      return FALSE ;
   else 
      return TRUE ;   
   
  

}


char ProgramData( uint InAddr , ushort  *buf16, ulong  Len ) 
{

    ushort *ptr ; 
    ptr =  ( ushort * ) (InAddr&0xFFFFE) ;
    
    
    
    while( Len > 0 ) 
    {
       WR( 0x555, 0xAAAA ) ; 
       WR( 0x2AA, 0x5555 ) ; 
       WR( 0x555, 0xA0A0 ) ; 
       *ptr = *buf16 ;
      
       DectOver( (ushort * )ptr, *buf16, 0x8000000 ) ;
       
       buf16 ++ ; 
       ptr ++ ;
       Len-- ;     
    
    }
    
    return TRUE ; 
}


char FlashErase( uint StartAddr, uint EndAddr ) 
{

    StartAddr &= 0xFFFFE ; 
    EndAddr &= 0xFFFFE  ;
    
    if( EndAddr < StartAddr )  return FALSE ; 
    
    while( StartAddr <= EndAddr ) 
    {    
       if( !EraseSector( (ushort * )StartAddr ))  return FALSE ;  
        
    
        StartAddr += 0x10000 ; 
    }
   
    return TRUE ; 

}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -