亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? ex_nandflash.c

?? LPC23xx24xx-Example-Software-Package-fo-keil 包括所有的基本例程
?? C
字號(hào):
/*****************************************************************************
 *   ex_nandflash.c:  External NAND FLASH memory module file for NXP 
 *   LPC23xx Family Microprocessors
 *
 *   Copyright(C) 2006, NXP Semiconductor
 *   All rights reserved.
 *
 *   History
 *   2007.01.13  ver 1.00    Prelimnary version, first Release
 *
******************************************************************************/
#include "LPC23xx.h"				/* LPC23xx/24xx definitions */
#include "type.h"
#include "irq.h"
#include "target.h"
#include "ex_nandflash.h"

BYTE InvalidBlockTable[NANDFLASH_BLOCKNUM];

/*****************************************************************************
** Function name:		delayMs
**
** Descriptions:		Start the timer delay in milo seconds
**						until elapsed
**
** parameters:			Delay value in milo second			 
** 						
** Returned value:		None
** 
*****************************************************************************/
void delayMs(DWORD delayInMs)
{
  /*
  * setup timer #1 for delay
  */
  T1TCR = 0x02;		/* reset timer */
  T1PR  = 0x00;		/* set prescaler to zero */
  T1MR0 = delayInMs * (Fpclk / 1000);
  T1IR  = 0xff;		/* reset all interrrupts */
  T1MCR = 0x04;		/* stop timer on match */
  T1TCR = 0x01;		/* start timer */
  
  /* wait until delay time has elapsed */
  while (T1TCR & 0x01);
  return;
}

/*****************************************************************************
** Function name:		NANDFLASHRBCheck
**
** Descriptions:		Ready/Busy check, no timeout, basically, R/B bit
**						should toggle once to bail out from this routine.
**
** parameters:			None			 
** 						
** Returned value:		None
** 
*****************************************************************************/
void NANDFLASHRBCheck( void )
{
  while( FIO2PIN & (1 << 12) );		/* from high to low once */
  __asm
  {
	nop
	nop
  }
  while( !(FIO2PIN & (1 << 12)) );	/* from low to high once */
  return; 
}

/*****************************************************************************
** Function name:		NANDFLASHInit
**
** Descriptions:		initialize external NAND FLASH memory
**
** parameters:			None			 
** 						
** Returned value:		None
** 
*****************************************************************************/
void NANDFLASHInit( void )
{
  DWORD i;

  /**************************************************************************
   * Initialize EMC for NAND FLASH
   **************************************************************************/
  EMC_CTRL = 0x00000001;
  PCONP  |= 0x00000800;		/* Turn On EMC PCLK */

  FIO2DIR &= ~(1 << 12);	/* make P2.12 pin as input */
  FIO2MASK &= ~(1 << 12); 

  PINSEL4 = 0x50000000;
  PINSEL5 = 0x05050555;
  PINSEL6 = 0x55555555;
  PINSEL8 = 0x55555555;
  PINSEL9 = 0x50555555;

  /* for NAND FLASH */
  EMC_STA_CFG1      = 0x00000080;
  EMC_STA_WAITWEN1  = 0x2;
  EMC_STA_WAITOEN1  = 0x2;
  EMC_STA_WAITRD1   = 0x1F;
  EMC_STA_WAITPAGE1 = 0x1F;
  EMC_STA_WAITWR1   = 0x1F;
  EMC_STA_WAITTURN1 = 0xF;
  delayMs(2);

  /* assume all blocks are valid to begin with */
  for ( i = 0; i < NANDFLASH_BLOCKNUM; i++ )
  {
  	InvalidBlockTable[i] = 0;
  }
  return;
}

/*****************************************************************************
** Function name:		NANDFLASHReset
**
** Descriptions:		Issue Reset command to NAND FLASH memory
**
** parameters:			None			 
** 						
** Returned value:		None
** 
*****************************************************************************/
void NANDFLASHReset( void )
{
  volatile BYTE *pCLE;
  
   /* Reset NAND FLASH  through NAND FLASH command */
	pCLE = K9F1G_CLE;
	*pCLE = K9FXX_RESET;
	delayMs( 2 );
	return;
		
}

/*****************************************************************************
** Function name:		NANDFLASHReadStatus
**
** Descriptions:		Read status from NAND FLASH memory
**
** parameters:			None			 
** 						
** Returned value:		Status
** 
*****************************************************************************/
DWORD NANDFLASHReadStatus( DWORD Cmd )
{
  volatile BYTE *pCLE;
  volatile BYTE *pDATA;
  BYTE StatusData;
  
  pCLE  = K9F1G_CLE;
  pDATA = K9F1G_DATA;
    
  *pCLE = K9FXX_READ_STATUS;
  /* Wait until bit 5 and 6 are 1, READY, bit 7 should be 1 too, not protected */
  /* if ready bit not set, it gets stuck here */
  while ( (*pDATA & 0xE0) != 0xE0 );
  StatusData = *pDATA;
  switch ( Cmd )
  {
  	case K9FXX_BLOCK_PROGRAM_1:
	case K9FXX_BLOCK_ERASE_1:
		if ( StatusData & 0x01 )	/* Erase/Program failure(1) or pass(0) */
			return( FALSE );
		else
			return( TRUE );
	case K9FXX_READ_1:				/* bit 5 and 6, Read busy(0) or ready(1) */
			return( TRUE );			
	default:
		break;
  }  
  return( FALSE );
}

/*****************************************************************************
** Function name:		NANDFLASHReadID
**
** Descriptions:		Read ID from external NAND FLASH memory
**
** parameters:			None			 
** 						
** Returned value:		Device ID info.
** 
*****************************************************************************/
DWORD NANDFLASHReadID( void )
{
  BYTE a, b, c, d;
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  volatile BYTE *pDATA;
  
  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;
  pDATA = K9F1G_DATA;
    
  *pCLE = K9FXX_READ_ID;
  *pALE = 0;
    
  a = *pDATA;
  b = *pDATA;
  d = *pDATA;
  c = *pDATA;
  return ((a << 24) | (b << 16) | (c << 8) | d);
}

/*****************************************************************************
** Function name:		NANDFLASHEraseBlock
**
** Descriptions:		Erase the whole NAND FLASH memory block based on the
**						block number
**
** parameters:			block number			 
** 						
** Returned value:		Erase status: succeed or fail
** 
*****************************************************************************/
DWORD NANDFLASHEraseBlock( DWORD blockNum )
{
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  DWORD rowAddr;
  
  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;

  rowAddr = (NANDFLASH_BASE_ADDR 
  		+ blockNum * NANDFLASH_PAGE_PER_BLOCK * NANDFLASH_RW_PAGE_SIZE) >> 16;    
  *pCLE = K9FXX_BLOCK_ERASE_1;
  *pALE = (BYTE)(rowAddr & 0x00FF);			/* column address low */
  *pALE = (BYTE)((rowAddr & 0xFF00) >> 8);	/* column address high */
  *pCLE = K9FXX_BLOCK_ERASE_2;

  NANDFLASHRBCheck();
  return( NANDFLASHReadStatus( K9FXX_BLOCK_ERASE_1 ) );
}

/*****************************************************************************
** Function name:		NANDFLASHCheckValidBlock
**
** Descriptions:		This routine is used to check if the block is valid or 
**						not.
**
** parameters:			None			 
** 						
** Returned value:		FALSE is invalid block is found, an initial invalid
**						table will be created. TRUE if all blocks are valid.   
** 
*****************************************************************************/
DWORD NANDFLASHCheckValidBlock( void )
{
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  volatile BYTE *pDATA;
  DWORD block, page, retValue = TRUE;
  DWORD curAddr;

  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;
  pDATA = K9F1G_DATA;

  for ( block = 0; block < NANDFLASH_BLOCKNUM; block++ )
  {  
	curAddr = NANDFLASH_BASE_ADDR 
		+ block * NANDFLASH_PAGE_PER_BLOCK * NANDFLASH_RW_PAGE_SIZE;
	for ( page = 0; page < 2; page++ )
	{
		/* Check column address 2048 at first page and second page */
		curAddr += page * NANDFLASH_RW_PAGE_SIZE;       
		*pCLE = K9FXX_READ_1;
		*pALE =  (BYTE)(curAddr & 0x00000000);			/* column address low */
		*pALE = (BYTE)((curAddr | 0x00000800) >> 8);	/* column address high */
		*pALE = (BYTE)((curAddr & 0x00FF0000) >> 16);	/* row address low */
		*pALE = (BYTE)((curAddr & 0xFF000000) >> 24);	/* row address high */
		*pCLE = K9FXX_READ_2;

		NANDFLASHRBCheck();
		if ( *pDATA != 0xFF )
		{
			/* found invalid block number, mark block number in the invalid 
			block table. */
			InvalidBlockTable[block] = 1;
			retValue = FALSE;		/* At least one block is invalid. */
		}
	}
  }  			
  return( retValue );
}

/*****************************************************************************
** Function name:		NANDFLASHPageProgram
**
** Descriptions:		Write a full page of program into NAND flash based on the
**						page number, write up to 2112 bytes of data at a time.  
**
** parameters:			page number, block number, and pointer to the buffer			 
** 						
** Returned value:		Erase status: succeed or fail
** 
*****************************************************************************/
DWORD NANDFLASHPageProgram( DWORD pageNum, DWORD blockNum, BYTE *bufPtr )
{
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  volatile BYTE *pDATA;
  DWORD i, curAddr;
  
  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;
  pDATA = K9F1G_DATA;
  
  curAddr = NANDFLASH_BASE_ADDR + blockNum * NANDFLASH_BLOCKNUM
  							+ pageNum * NANDFLASH_RW_PAGE_SIZE;  
  *pCLE = K9FXX_BLOCK_PROGRAM_1;
  *pALE =  (BYTE)(curAddr & 0x000000FF);		/* column address low */
  *pALE = (BYTE)((curAddr & 0x00000F00) >> 8);	/* column address high */
  *pALE = (BYTE)((curAddr & 0x00FF0000) >> 16);	/* row address low */
  *pALE = (BYTE)((curAddr & 0xFF000000) >> 24);	/* row address high */
  __asm
  {
	nop
	nop
  }
  for ( i = 0; i < NANDFLASH_RW_PAGE_SIZE; i++ )
  {
	*pDATA = *bufPtr++;
  }
  *pCLE = K9FXX_BLOCK_PROGRAM_2;

  __asm
  {
	nop
	nop
  }
  NANDFLASHRBCheck();
  return( NANDFLASHReadStatus( K9FXX_BLOCK_PROGRAM_1 ) );
}

/*****************************************************************************
** Function name:		NANDFLASHPageRead
**
** Descriptions:		Read the whole NAND FLASH memory page based on the
**						page number, the data will be stored in the pointer
**						to the buffer.
**
** parameters:			page number, block number, buffer pointer;			 
** 						
** Returned value:		Erase status: succeed or fail
** 
*****************************************************************************/
DWORD NANDFLASHPageRead( DWORD pageNum, DWORD blockNum, BYTE *bufPtr )
{
  volatile BYTE *pCLE;
  volatile BYTE *pALE;
  volatile BYTE *pDATA;
  DWORD i, curAddr;
  
  pCLE  = K9F1G_CLE;
  pALE  = K9F1G_ALE;
  pDATA = K9F1G_DATA;
  
   curAddr = NANDFLASH_BASE_ADDR + blockNum * NANDFLASH_BLOCKNUM
  							+ pageNum * NANDFLASH_RW_PAGE_SIZE;
  *pCLE = K9FXX_READ_1;
  *pALE =  (BYTE)(curAddr & 0x000000FF);		/* column address low */
  *pALE = (BYTE)((curAddr & 0x00000F00) >> 8);	/* column address high */
  *pALE = (BYTE)((curAddr & 0x00FF0000) >> 16);	/* row address low */
  *pALE = (BYTE)((curAddr & 0xFF000000) >> 24);	/* row address high */
  *pCLE = K9FXX_READ_2;

  NANDFLASHRBCheck();
  for ( i = 0; i < NANDFLASH_RW_PAGE_SIZE; i++ )
  {
	*bufPtr = *pDATA;
	bufPtr++;
  }
  return( TRUE );
}

/*********************************************************************************
**                            End Of File
*********************************************************************************/

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕中文字幕一区| 欧美国产日产图区| 亚洲一区二区四区蜜桃| 大桥未久av一区二区三区中文| 欧美一区二区三区免费大片 | 久久精品国产一区二区| 在线91免费看| 精品一区精品二区高清| 久久久美女艺术照精彩视频福利播放| 国产一区不卡在线| 国产精品乱码一区二三区小蝌蚪| 成人免费高清在线观看| 一区二区三区影院| 91精品视频网| 国产aⅴ综合色| 亚洲美女电影在线| 91精品国产91久久久久久一区二区 | 欧美性色欧美a在线播放| 日韩成人精品在线| 欧美激情一区三区| 久久久不卡影院| 欧美午夜精品理论片a级按摩| 亚洲电影激情视频网站| 日韩欧美二区三区| 国产精品一线二线三线| 一区二区久久久| 欧美性xxxxx极品少妇| 亚洲午夜国产一区99re久久| 一区二区三区精品视频在线| 日韩欧美电影在线| 欧美www视频| 成人av免费网站| 日韩精品最新网址| 久久影视一区二区| 在线国产亚洲欧美| 久久免费国产精品| 一本到高清视频免费精品| 成人免费精品视频| 色综合天天综合在线视频| 中文字幕欧美区| 97超碰欧美中文字幕| 色就色 综合激情| 久久se这里有精品| 欧亚一区二区三区| 91麻豆精品视频| 成人av网址在线| 成人动漫视频在线| 国产精品视频一二| 国产精品无圣光一区二区| 一区二区三区91| ...中文天堂在线一区| 亚洲欧洲日韩女同| 亚洲国产精品影院| 亚洲精品免费在线| 亚洲午夜久久久久久久久电影网 | 久久精品国内一区二区三区| 欧美日韩精品综合在线| 成人av网址在线| 色综合久久中文字幕综合网| 成人黄色一级视频| 亚洲欧美偷拍三级| 日韩在线播放一区二区| 国产成人高清视频| 一本到不卡免费一区二区| 亚洲在线免费播放| 韩国成人福利片在线播放| 欧美精品一区二区三区久久久| 亚洲精品一区二区三区精华液| 亚洲国产激情av| 蜜臀精品一区二区三区在线观看| 亚洲制服丝袜在线| proumb性欧美在线观看| 91精品国产色综合久久| 亚洲欧美自拍偷拍色图| 久久99这里只有精品| 欧美日韩不卡视频| 亚洲国产成人高清精品| 色94色欧美sute亚洲线路一久 | 国产成人精品www牛牛影视| 欧美日韩国产乱码电影| 国产色一区二区| 美女视频免费一区| 欧美日韩国产免费一区二区| 高清国产一区二区| 久久精品欧美日韩| 久久久www免费人成精品| 亚洲精品午夜久久久| 色一区在线观看| 午夜欧美视频在线观看| 一区二区三区四区精品在线视频| 精品一区二区精品| 国产农村妇女毛片精品久久麻豆| 日韩毛片精品高清免费| 懂色av一区二区夜夜嗨| 一区二区三区影院| 日韩免费高清视频| 成人18视频在线播放| 亚洲最快最全在线视频| 欧美一区二区三区四区高清| 韩国精品免费视频| 亚洲欧洲另类国产综合| 欧美电影在线免费观看| 国内精品自线一区二区三区视频| 国产视频一区不卡| 色婷婷久久99综合精品jk白丝| 天天综合网 天天综合色| 欧美自拍偷拍一区| 国内精品写真在线观看| av不卡在线播放| 日韩电影网1区2区| 亚洲色图20p| 日韩码欧中文字| 久久久99精品免费观看不卡| 91国产福利在线| caoporn国产精品| 欧美日韩视频在线第一区| 国产亚洲精品aa午夜观看| 波多野结衣在线一区| 777午夜精品视频在线播放| 成人av在线资源网站| 国产91精品在线观看| 成人少妇影院yyyy| 国产成人免费在线| 国产成人精品亚洲午夜麻豆| 国产做a爰片久久毛片| 成人精品一区二区三区中文字幕| 久久精品国产久精国产| 在线观看日韩av先锋影音电影院| 91成人看片片| 欧美在线观看视频一区二区 | 成人午夜激情影院| 国产69精品久久777的优势| 国产伦精品一区二区三区免费迷 | 五月天亚洲婷婷| 亚洲欧美另类久久久精品| www亚洲一区| 国产精品毛片大码女人| 不卡一区二区三区四区| 精品视频1区2区3区| 欧美一区二区三区不卡| 黄页视频在线91| 国产不卡高清在线观看视频| 韩国成人福利片在线播放| 成人黄色在线网站| 色综合久久综合网欧美综合网| 成人av免费在线观看| 91国内精品野花午夜精品| 久久久久久麻豆| 亚洲欧美一区二区三区极速播放 | 奇米精品一区二区三区在线观看| 日韩黄色小视频| 国产在线视频不卡二| 91精品国产综合久久久久久| 国产成人综合亚洲91猫咪| 91黄色激情网站| 国产精品色在线| 玖玖九九国产精品| 亚洲精品视频在线看| 国产精品免费aⅴ片在线观看| 日韩黄色小视频| 欧美日韩一级黄| 国产精品电影一区二区三区| 欧美一二三区在线| 天堂av在线一区| 欧美日韩国产高清一区二区| 久久综合久色欧美综合狠狠| 日本系列欧美系列| 久久天天做天天爱综合色| 国产一区二区精品久久91| 国产日韩精品一区二区三区| 99国产精品视频免费观看| 伊人开心综合网| 在线欧美日韩精品| 蜜臀av性久久久久蜜臀aⅴ | 中文字幕亚洲电影| 欧美日韩在线电影| 日韩电影免费在线观看网站| 男男gaygay亚洲| 中文字幕亚洲综合久久菠萝蜜| 99精品视频在线观看| 91精品91久久久中77777| 人人精品人人爱| 日本一区二区高清| 亚洲欧美日韩国产综合| 精品久久久久久亚洲综合网 | 中文字幕在线观看一区| 欧美性欧美巨大黑白大战| 337p亚洲精品色噜噜噜| 中文字幕一区二区三| 久久综合资源网| 日韩精品一区二区三区四区视频 | 亚洲精品自拍动漫在线| 日本亚洲最大的色成网站www| 国产精品亚洲а∨天堂免在线| 久久亚洲综合av| 欧美高清激情brazzers| 成人性色生活片| 天天av天天翘天天综合网色鬼国产| 51午夜精品国产| 91精品国产综合久久国产大片|