?? dm_nandflash_k9f2g08.c
字號:
/**************************************************************************
文件名稱: dm_nandflash_k9f2g08.c
作者: Andy
版本: 0.1
創建時間 : 2007-04
描述:
文件實現了NandFlash 底層讀寫的功能
修改歷史:
****************************************************************************/
#include "stdio.h"
#include "ccblkfn.h"
#include "sysreg.h"
#include "dm_bf5xx.h"
uint8_t Test_Data_Table[];
int32_t bytecount;
/****************************************************************************
* 名稱 : Init_TEST_DATA_BUFFER
* 功能 : 生成測試數據
* 入口參數 :無
* 出口參數 :無
****************************************************************************/
void Init_TEST_DATA_BUFFER(void)
{
int_t i;
for(i = 0;i<bytecount;i++)
{
Test_Data_Table[i] = i;
}
}
/****************************************************************************
* 名稱 : Wait_NAND_RADY
* 功能 : 判斷NANDFLASH 忙狀態
* 入口參數 :無
* 出口參數 :無
****************************************************************************/
bool Wait_NAND_RADY(void)
{
while(!(*pFIO_FLAG_D & NAND_RDY));
}
/****************************************************************************
* 名稱 : Write_Command
* 功能 : NANDFLASH寫命令
* 入口參數 :command
* 出口參數 :無
****************************************************************************/
void Write_Command(uint8_t command)
{
*pFlash_Commond = command;
udelay(10);
}
/****************************************************************************
* 名稱 : Write_Addr
* 功能 : NANDFLASH寫地址
* 入口參數 :addr
* 出口參數 :無
****************************************************************************/
void Write_Addr(uint8_t addr)
{
*pFlash_Addr = addr;
udelay(10);
}
/****************************************************************************
* 名稱 : Reset_NAND
* 功能 : 復位NANDFLASH
* 入口參數 :無
* 出口參數 :無
****************************************************************************/
void Reset_NAND(void)
{
Write_Command(0xff);
Wait_NAND_RADY();
}
/****************************************************************************
* 名稱 : Read_Chip_ID
* 功能 : 讀取芯片ID
* 入口參數 :無
* 出口參數 :false 出錯時返回false
****************************************************************************/
void Read_Chip_ID(void)
{
uint8_t Chip_ID0 ;
uint8_t Chip_ID1 ;
Write_Command(0x90);
Write_Addr(0x00);
Chip_ID0 = *pFlash_Data;
Chip_ID1 = *pFlash_Data;
printf("The Nandflash ID is %X%X\n\r",Chip_ID0,Chip_ID1);
if(Chip_ID0 == 0xec)
{
switch(Chip_ID1)
{
case 0xd3 : printf("The Nandflash is 1024M\n\r");
bytecount = 4096;
break;
case 0xda : printf("The Nandflash is 256M\n\r");
bytecount = 2048;
break;
default: printf("Read ID is ERROR!!!\n\r");
bytecount = 2048;
break;
}
}
else
{
printf("Read ID is ERROR!!!\n\r");
bytecount = 2048;
return false;
}
}
/****************************************************************************
* 名稱 : write_page
* 功能 : 將Buffer中的數據寫入地址Page_Address
* 入口參數 :Page_Address,Buffer
* 出口參數 :完成返回true,失敗返回false
****************************************************************************/
bool write_page(uint_t Page_Address,uint8_t *Buffer)
{
int_t i;
Write_Command(0x80);
Write_Addr(0x00);
Write_Addr(0x00);
Write_Addr(Page_Address&0xff);
Write_Addr((Page_Address>>8)&0xff);
Write_Addr((Page_Address>>16)&0x07);
for(i = 0;i<bytecount;i++)
{
*pFlash_Data = *((uint8_t *)Buffer+i);
udelay(1);
}
Write_Command(0x10);
Wait_NAND_RADY();
return true;
}
/****************************************************************************
* 名稱 : read_page
* 功能 : 讀取頁地址Page_Address的數據512字節,存入Buffer
* 入口參數 :Page_Address,Buffer
* 出口參數 :無
****************************************************************************/
bool read_page(uint_t Page_Address,uint8_t *Buffer1)
{
int_t i;
Write_Command(0x00);
Write_Addr(0x00);
Write_Addr(0x00);
Write_Addr(Page_Address&0xff);
Write_Addr((Page_Address>>8)&0xff);
Write_Addr((Page_Address>>16)&0x07);
Write_Command(0x30);
udelay(200);
for(i = 0;i<bytecount;i++)
{
*((uint8_t *)Buffer1+i) = *pFlash_Data;
}
}
/****************************************************************************
* 名稱 : Block_Erase
* 功能 : 將塊地址Block_Address的塊數據擦除。可通過頁地址除以32得到塊地址
* 入口參數 :Block_Address
* 出口參數 :無
****************************************************************************/
bool Block_Erase(uint_t Block_Address)
{
uint8_t NAND_Data = 0;
uint_t Page_Address;
Page_Address = Block_Address<<6;
Write_Command(0x60);
Write_Addr(Page_Address&0xff);
Write_Addr((Page_Address>>8)&0xff);
Write_Addr((Page_Address>>16)&0x07);
Write_Command(0xd0);
Wait_NAND_RADY();
Write_Command(0x70);
NAND_Data = *pFlash_Data;
if(NAND_Data&0x1 != 0)
{
return false;
}
else
{
return true;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -