|
发表于 2008-3-6 16:38:43
|
显示全部楼层
//*
//*********************************************************************************************************
//* Function : static void NF_Reset(void)
//* Describe : NF Reset
//*--------------------------------------------------------------------------------------------------------
//* Author :
//* Date :
//*--------------------------------------------------------------------------------------------------------
//* Mender :
//* Date :
//* Describe :
//*********************************************************************************************************
//*
void NF_Reset(void)
{
unsigned char Status;
FLASH_ADDR_COMMAND = 0xFF;//Reset Command
//Read Staus Register
while(1)
{//Device Operation --- BIT6
FLASH_ADDR_COMMAND = 0x70;
Status = FLASH_ADDR_DATA;
if(Status & (1<<6))
{//Busy : "0" Ready : "1"
break;
}
}
}
//*
//*********************************************************************************************************
//* Function : void NF_ReadID(void)
//* Describe : 读取NAND Flash ID
//*--------------------------------------------------------------------------------------------------------
//* Author :
//* Date :
//*--------------------------------------------------------------------------------------------------------
//* Mender :
//* Date :
//* Describe :
//*********************************************************************************************************
//*
unsigned long NF_ReadID(void)
{
unsigned char Buff[4];
FLASH_ADDR_COMMAND = 0x90;
FLASH_ADDR_ADDRESS = 0x00;
__no_operation();
Buff[0] = FLASH_ADDR_DATA;
Buff[1] = FLASH_ADDR_DATA;
Buff[2] = FLASH_ADDR_DATA;
Buff[3] = FLASH_ADDR_DATA;
return(*((unsigned long *)Buff));
}
//*
//*********************************************************************************************************
//* Function : unsigned char NF_EraseBlock(unsigned long Block)
//* Describe : 擦除指定块
//*--------------------------------------------------------------------------------------------------------
//* Author :
//* Date :
//*--------------------------------------------------------------------------------------------------------
//* Mender :
//* Date :
//* Describe :
//*********************************************************************************************************
//*
unsigned char NF_EraseBlock(unsigned long Block)
{
unsigned char cpu_sr;
unsigned char Status;
unsigned long BlockPage;
BlockPage = Block<<5;
//读写NAND的时候,总线不可以变化,中断读写特殊寄存器可能引起总线跳变
cpu_sr = OS_CPU_SR_Save();//关中断
FLASH_ADDR_COMMAND = 0x60;
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage & 0xFF);
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage>>8 & 0xFF);
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage>>16 & 0xFF);
FLASH_ADDR_COMMAND = 0xD0;
//Read Staus Register
while(1)
{//Device Operation --- BIT6
FLASH_ADDR_COMMAND = 0x70;
Status = FLASH_ADDR_DATA;
if(Status & (1<<6))
{//Busy : "0" Ready : "1"
break;
}
}
//Read Staus Register
//Total Pass/Fail -- BIT0
FLASH_ADDR_COMMAND = 0x70;
Status = FLASH_ADDR_DATA;
if(Status & (1<<0))
{//Fail : "1"
OS_CPU_SR_Restore(cpu_sr);//开中断
return 0;
}
else
{//Pass : "0"
OS_CPU_SR_Restore(cpu_sr);//开中断
return 1;
}
}
//*
//*********************************************************************************************************
//* Function : void NF_ReadPage()
//* Describe : 读取NAND Flash 指定块指定页
//*--------------------------------------------------------------------------------------------------------
//* Author :
//* Date :
//*--------------------------------------------------------------------------------------------------------
//* Mender :
//* Date :
//* Describe :
//*********************************************************************************************************
//*
void NF_ReadPage(unsigned long Block,
unsigned char Page,
unsigned char *Buff)
{
unsigned char cpu_sr;
unsigned short j;
unsigned long BlockPage;
//每块32页,每页512字节
Page &= 0x1F; //[Page = A9,A10,A11,A12,A13]
//计算实际地址
BlockPage = (Block<<5) + Page; //[Block = A14 ...]
//读写NAND的时候,总线不可以变化,中断读写特殊寄存器可能引起总线跳变
cpu_sr = OS_CPU_SR_Save();//关中断
FLASH_ADDR_COMMAND = 0x00;
FLASH_ADDR_ADDRESS = 0x00;
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage & 0xFF);
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage>>8 & 0xFF);
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage>>16 & 0xFF);
//The 528 bytes of data within the selected page are
//transferred to the data registers in less than 12us(tR).
for(j=0; j<25; j++);
for(j=0; j<(32 + 1); j++)
{//提高数据吞吐速度
*Buff++ = FLASH_ADDR_DATA;//1
*Buff++ = FLASH_ADDR_DATA;//2
*Buff++ = FLASH_ADDR_DATA;//3
*Buff++ = FLASH_ADDR_DATA;//4
*Buff++ = FLASH_ADDR_DATA;//5
*Buff++ = FLASH_ADDR_DATA;//6
*Buff++ = FLASH_ADDR_DATA;//7
*Buff++ = FLASH_ADDR_DATA;//8
*Buff++ = FLASH_ADDR_DATA;//9
*Buff++ = FLASH_ADDR_DATA;//10
*Buff++ = FLASH_ADDR_DATA;//11
*Buff++ = FLASH_ADDR_DATA;//12
*Buff++ = FLASH_ADDR_DATA;//13
*Buff++ = FLASH_ADDR_DATA;//14
*Buff++ = FLASH_ADDR_DATA;//15
*Buff++ = FLASH_ADDR_DATA;//16
}
OS_CPU_SR_Restore(cpu_sr);//开中断
}
//*
//*********************************************************************************************************
//* Function : void NF_WritePage()
//* Describe : 写NAND Flash 指定块指定页
//*--------------------------------------------------------------------------------------------------------
//* Author :
//* Date :
//*--------------------------------------------------------------------------------------------------------
//* Mender :
//* Date :
//* Describe :
//*********************************************************************************************************
//*
unsigned char NF_WritePage(unsigned long Block,
unsigned char Page,
unsigned char *Buff
)
{
unsigned char cpu_sr;
unsigned char Status;
unsigned short j;
unsigned long BlockPage;
//每块32页,每页512字节
Page &= 0x1F; //[Page = A9,A10,A11,A12,A13]
//计算实际地址
BlockPage = (Block<<5) + Page; //[Block = A14 ...]
//读写NAND的时候,总线不可以变化,中断读写特殊寄存器可能引起总线跳变
cpu_sr = OS_CPU_SR_Save();//关中断
FLASH_ADDR_COMMAND = 0x80;
FLASH_ADDR_ADDRESS = 0x00;
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage & 0xFF);
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage>>8 & 0xFF);
FLASH_ADDR_ADDRESS = (unsigned char)(BlockPage>>16 & 0xFF);
for(j=0; j<(32 + 1); j++)
{//数据块区域
FLASH_ADDR_DATA = *Buff++;//1
FLASH_ADDR_DATA = *Buff++;//2
FLASH_ADDR_DATA = *Buff++;//3
FLASH_ADDR_DATA = *Buff++;//4
FLASH_ADDR_DATA = *Buff++;//5
FLASH_ADDR_DATA = *Buff++;//6
FLASH_ADDR_DATA = *Buff++;//7
FLASH_ADDR_DATA = *Buff++;//8
FLASH_ADDR_DATA = *Buff++;//9
FLASH_ADDR_DATA = *Buff++;//10
FLASH_ADDR_DATA = *Buff++;//11
FLASH_ADDR_DATA = *Buff++;//12
FLASH_ADDR_DATA = *Buff++;//13
FLASH_ADDR_DATA = *Buff++;//14
FLASH_ADDR_DATA = *Buff++;//15
FLASH_ADDR_DATA = *Buff++;//16
}
FLASH_ADDR_COMMAND = 0x10;
//Read Staus Register
while(1)
{//Device Operation --- BIT6
FLASH_ADDR_COMMAND = 0x70;
Status = FLASH_ADDR_DATA;
if(Status & (1<<6))
{//Busy : "0" Ready : "1"
break;
}
}
//Read Staus Register
//Total Pass/Fail -- BIT0
FLASH_ADDR_COMMAND = 0x70;
Status = FLASH_ADDR_DATA;
if(Status & (1<<0))
{//Fail : "1"
OS_CPU_SR_Restore(cpu_sr);//开中断
return 0;
}
else
{//Pass : "0"
OS_CPU_SR_Restore(cpu_sr);//开中断
return 1;
}
} |
|