📄 drv_nandflash.c
字号:
////////////////////////////////////////////////////////////////////////
// 文件名 :drv_nandflash.c
// 文件功能 :系统读取Nand Flash驱动
// 作者 :cxl
// 创建时间 :2005年11月11日
// 处理器 : Epson C33L05
// 项目名称 :
// 备注 :
// 可以驱动的Nand Flash型号: K9F1G08U0A SAMSUNG
////////////////////////////////////////////////////////////////////////
//Sys include file
#include "..\include\common.h"
#include "..\include\8timer.h"
#include "..\include\16timer.h"
#include "..\include\io.h"
#include "..\include\presc.h"
//Nand Flash driver file
#include "comm_drv.h"
#include "drv_nandfls.h"
//#undef USE_K9F5616
//#undef USE_K9F2808U0M
//#define USE_K9F1208U0M
t_nand_fls_id this_nand_fls_id,*p_nand_fls_id;
int nand_fls_init(void)
{
unsigned short i;
//read id
p_nand_fls_id = &this_nand_fls_id;
memset(p_nand_fls_id,0,sizeof(t_nand_fls_id));
/*select ALE, CLE port as output*/
SET_ALE_L;
SET_ALE_OUTPUT;
SET_CLE_L;
SET_CLE_OUTPUT;
/* select CE15,16 data is high (P51)*/
SET_NAND_CE_H;
/*select CE/GPIO port function as CE*/
SET_NAND_CE_CE;
/*select CE as output*/
SET_NAND_CE_OUTPUT;
/* set flash device mode*/
SET_DEVICE_8;
/*select NAND flashmap to area 15 and boot function*/
SET_NAND_AREA;
/*select SMWE,SMRD port function as flash I/F function */
//CLR_SMIFREG;
SET_SMIF_WE;
SET_SMIF_RD;
/*set by/ry signal as input*/
SET_BUSY_INPUT;
/*disable write protect*/
SET_WP_H;
SET_WP_GPIO;
/*set wp pin as output */
SET_WP_OUTPUT;
SET_NAND_CE_L;
asm("nop");
for(i=0;i<10000;i++){
asm("nop");
}
//write read ID command
SET_CLE_H;
REG_CHAR(Nand_Fls_COMM_ADD)=0x90;
SET_CLE_L;
//write address 0
SET_ALE_H;
REG_CHAR(Nand_Fls_Reg_ADD)=0x00;
SET_ALE_L;
//read maker id
p_nand_fls_id->maker_code = REG_CHAR(Nand_Fls_Data_ADD);
p_nand_fls_id->device_code = REG_CHAR(Nand_Fls_Data_ADD);
p_nand_fls_id->rev1 = REG_CHAR(Nand_Fls_Data_ADD);
p_nand_fls_id->mutiplane_code = REG_CHAR(Nand_Fls_Data_ADD);
SET_NAND_CE_H;
asm("nop");
if((p_nand_fls_id->maker_code == 0xEC)&&(p_nand_fls_id->device_code == 0xF1)\
&&(p_nand_fls_id->mutiplane_code == 0x15))
return NAND_INIT_OK;
return NAND_INIT_ERROR;
}
void nand_fls_Reset(void){
int i;
SET_CLE_H; /*set CLE H*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=RESET_CMD; /*write RESET command*/
SET_CLE_L; /*set CE L*/
/*Wait flash R/#B ready (worst case 500us reset when erase; delay 1ms for safe)*/
for (i=0; i<800; i++) {
asm("nop");
}
return;
}
//这里用到的地址入口参数都是字节地址,范围是0--->128MB+4MB-1.
//地址的格式是:A7--A0,0000+A11---A8,A19--A12,A27--A20.
//上面这种理解是错误的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -