📄 main.c
字号:
#include "stdio.h"
#include "ccblkfn.h"
#include "sysreg.h"
#include "../CPLD.h"
#include "NAND_FLASH.h"
unsigned char Command_Status = 0;
unsigned char Chip_ID0 = 0;
unsigned char Chip_ID1 = 0;
unsigned char Chip_ID2 = 0;
unsigned char Chip_ID3 = 0;
unsigned char Invalid_Blocks_Table[64];
unsigned char Test_Data_Table[500];
unsigned char Verify_Table[500];
unsigned int Blockn_Address = 0;
unsigned short Pagen_address = 0;
myNAND_Address_Table NAND_Address_Table;
void main(void)
{
//Init_PLL();
Set_PLL( (short)(CORECLK/CLKIN), (short)(CORECLK/SYSCLK));
Init_EBIU();
Init_TEST_DATA_BUFFER();
Reset_NAND();
*pLED = 0x00;
delay(100000);
*pLED = 0xff;
delay(100000);
*pCtrlReg1_C = 0x20;
delay(100000);
if(!Read_Chip_ID())
{
while(1);
}
NAND_Address_Table.Value = 0x0;
if(!Block_Erase(Blockn_Address))
{
while(1);
}
if(!Page_Program(Blockn_Address,Pagen_address))
{
while(1);
}
if(!Program_Verify(Blockn_Address,Pagen_address))
{
while(1);
}
while(1);
}
void Reset_NAND(void)
{
Write_Command(0xff);
while(!Wait_NAND_RADY());
NAND_Finish();
}
bool Read_Chip_ID(void)
{
Write_Command(0x90);
Write_Address(0x00,0x00,0x00,0x00,0x01);
delay(1000);
Chip_ID0 = *pNAND_BaseaAddr;
delay(100);
Chip_ID1 = *pNAND_BaseaAddr;
delay(100);
NAND_Finish();
if(Chip_ID0 != 0xec) //Maker code
{
return false;
}
else if(Chip_ID1 != 0x75) //Device code
{
return false;
}
else
{
return true;
}
}
void Create_Invalid_Blocks_Table(void)
{
unsigned char NAND_Data = 0;
unsigned char i;
for(i = 0;i < 64;i++)
{
Write_Command(0x00);
Write_Address(NAND_Address_Table.NAND_Address.NAND_Address_A0_A7,
NAND_Address_Table.NAND_Address.NAND_Address_A9_A16,
NAND_Address_Table.NAND_Address.NAND_Address_A17_A24,
NAND_Address_Table.NAND_Address.NAND_Address_A25_A26,
0x05);
while(!Wait_NAND_RADY());
NAND_Data = *pNAND_BaseaAddr;
if(NAND_Data != 0xff)
{
Invalid_Blocks_Table[i] = i;
}
NAND_Address_Table.Value = NAND_Address_Table.Value + NAND_BLOCK_Increase;
NAND_Finish();
}
}
bool Block_Erase(unsigned int Block_Address)
{
unsigned char NAND_Data = 0;
Write_Command(0x60);
Write_Address(NAND_Address_Table.NAND_Address.NAND_Address_A9_A16,
NAND_Address_Table.NAND_Address.NAND_Address_A17_A24,
NAND_Address_Table.NAND_Address.NAND_Address_A25_A26,
NAND_Address_Table.NAND_Address.NAND_Address_A0_A7,
0x02);
Write_Command(0xd0);
delay(100);
while(!Wait_NAND_RADY());
Write_Command(0x70);
delay(100);
NAND_Data = *pNAND_BaseaAddr;
NAND_Finish();
if(NAND_Data != 0xc0)
{
return false;
}
else
{
return true;
}
}
bool Page_Program(unsigned int Block_Address,unsigned short Page_Address)
{
int i;
unsigned char NAND_Data;
Write_Command(0x80);
Write_Address(NAND_Address_Table.NAND_Address.NAND_Address_A0_A7,
NAND_Address_Table.NAND_Address.NAND_Address_A9_A16,
NAND_Address_Table.NAND_Address.NAND_Address_A17_A24,
NAND_Address_Table.NAND_Address.NAND_Address_A25_A26,
0x03);
delay(100);
for(i = 0;i<500;i++)
{
*pNAND_BaseaAddr = Test_Data_Table[i];
delay(100);
}
Write_Command(0x10);
delay(100);
while(!Wait_NAND_RADY());
delay(100);
Write_Command(0x70);
delay(100);
NAND_Data = *pNAND_BaseaAddr;
NAND_Finish();
if(NAND_Data != 0xc0)
{
return false;
}
else
{
return true;
}
}
bool Program_Verify(unsigned int Block_Address,unsigned short Page_Address)
{
int i;
Write_Command(0x00);
Write_Address(NAND_Address_Table.NAND_Address.NAND_Address_A0_A7,
NAND_Address_Table.NAND_Address.NAND_Address_A9_A16,
NAND_Address_Table.NAND_Address.NAND_Address_A17_A24,
NAND_Address_Table.NAND_Address.NAND_Address_A25_A26,
0x03);
while(!Wait_NAND_RADY());
for(i = 0;i<500;i++)
{
Verify_Table[i] = *pNAND_BaseaAddr;
delay(100);
}
NAND_Finish();
for(i = 0;i <500;i++)
{
if(Verify_Table[i] != Test_Data_Table[i])
{
return false;
}
}
return true;
}
void delay(unsigned int DelayValue)
{
int i;
for(i=0;i<DelayValue;i++)
{
;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -