HI3531的nand flash測試
void NAND_Init()
{
*(unsigned int *)(0x20030000 + 0xd0) = 7; delay_x(0X5000);
*(unsigned int *)(0x20030000 + 0xd0) = 6; delay_x(0X5000);
*(unsigned int *)(0x200f0000 + 0x1fc) = 0;//muxctrl_reg127 NF_DQ0 管腳複用控製寄存器
*(unsigned int *)(0x200f0000 + 0x200) = 0;
*(unsigned int *)(0x200f0000 + 0x204) = 0;
*(unsigned int *)(0x200f0000 + 0x208) = 0;
*(unsigned int *)(0x200f0000 + 0x20C) = 0;
*(unsigned int *)(0x200f0000 + 0x210) = 0;
*(unsigned int *)(0x200f0000 + 0x214) = 0;
*(unsigned int *)(0x200f0000 + 0x218) = 0;//7
*(unsigned int *)(0x200f0000 + 0x21C) = 0;
*(unsigned int *)(0x200f0000 + 0x220) = 0;
//p626
*(unsigned int *)(NANDC_ADDR +0X00) = 0x85;//NFC_CON
*(unsigned int *)(NANDC_ADDR +0X04) = 0x666;//NFC_PWIDTH 為讀寫脈衝寬度配置寄存器。
*(unsigned int *)(NANDC_ADDR +0X24) = 0x0;//NFC_INTEN 為中斷使能寄存器
delay_x(0X500);
}
void NAND_Read_Page()
{
*(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 為低位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 為高位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X0c) = 0x00003000;//NFC_CMD 為命令字配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X18) = 0x800;
delay_x(0X500);
//地址周期 cmd1_en addr_wen data_wen cmd2_en ready/busy data_ren read_stus_en
*(unsigned int *)(NANDC_ADDR +0X1c) = 5<<9 | 1<<6 | 1<<5 | 0<<4 | 1<<3 |1<<2 | 1<<1 | 0;//0xa6e;//NFC_OP 為操作寄存器。
delay_x(0X500);
retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 為狀態寄存器。
delay_x(0X5000);
}
void NAND_Read_Random()
{
*(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 為低位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 為高位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X0c) = 0x0000e005;//NFC_CMD 為命令字配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X18) = 0x20;
delay_x(0X500);
//*(unsigned int *)(NANDC_ADDR +0X1c) = 0x46e;//NFC_OP 為操作寄存器。
//地址周期 cmd1_en addr_wen data_wen cmd2_en ready/busy data_ren read_stus_en
*(unsigned int *)(NANDC_ADDR +0X1c) = 2<<9 | 1<<6 | 1<<5 | 0<<4 | 1<<3 |1<<2 | 1<<1 | 0;////NFC_OP 為操作寄存器。
delay_x(0X500);
retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 為狀態寄存器。
delay_x(0X5000);
}
void NAND_Write_Page()
{
*(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 為低位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 為高位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X0c) = 0x00001080;//NFC_CMD 為命令字配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X18) = 8;
delay_x(0X500);
*(unsigned int *)(0x50000000) = 0x11223344;
delay_x(0X500);
*(unsigned int *)(0x50000004) = 0x55667788;
delay_x(0X500);
// *(unsigned int *)(NANDC_ADDR +0X1c) = 0xa7d;//NFC_OP 為操作寄存器。
//地址周期 cmd1_en addr_wen data_wen cmd2_en ready/busy data_ren read_stus_en
*(unsigned int *)(NANDC_ADDR +0X1c) = 5<<9 | 1<<6 | 1<<5 | 1<<4 | 1<<3 |1<<2 | 0<<1 | 0;//NFC_OP 為操作寄存器。
delay_x(0X500);
retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 為狀態寄存器。
delay_x(0X5000);
}
void NAND_ReadID()
{
*(unsigned int *)(NANDC_ADDR +0X10) = 0x20;//NFC_ADDRL 為低位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 為高位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X0c) = 0x00000090;//NFC_CMD 為命令字配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X18) = 5;
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X1c) = 0x266;//NFC_OP 為操作寄存器。
delay_x(0X500);
retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 為狀態寄存器。
delay_x(0X5000);
}
void NAND_Erase_Block()
{
*(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 為低位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 為高位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X0c) = 0x0070d060;//NFC_CMD 為命令字配置寄存器。
delay_x(0X500);
//*(unsigned int *)(NANDC_ADDR +0X1c) = 0x66c;//NFC_OP 為操作寄存器。
//地址周期 cmd1_en addr_wen data_wen cmd2_en ready/busy data_ren read_stus_en
*(unsigned int *)(NANDC_ADDR +0X1c) = 3<<9 | 1<<6 | 1<<5 | 0<<4 | 1<<3 |1<<2 | 0<<1 | 0;//0xa6e;//NFC_OP 為操作寄存器。
delay_x(0X500);
retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 為狀態寄存器。
delay_x(0X5000);
}
int NAND_test(unsigned int data)
{
int i=0;
UART_Init();
NAND_Erase_Block();
//寫數據
*(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 為低位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 為高位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X0c) = 0x00001080;//NFC_CMD 為命令字配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X18) = 0x800;
delay_x(0X500);
for(i=0;i<(0x800/4);i++)
{
*(unsigned int *)(0x50000000 + i*4) = data;
delay_x(0X500);
}
// *(unsigned int *)(NANDC_ADDR +0X1c) = 0xa7d;//NFC_OP 為操作寄存器。
//地址周期 cmd1_en addr_wen data_wen cmd2_en ready/busy data_ren read_stus_en
*(unsigned int *)(NANDC_ADDR +0X1c) = 5<<9 | 1<<6 | 1<<5 | 1<<4 | 1<<3 |1<<2 | 0<<1 | 0;//NFC_OP 為操作寄存器。
delay_x(0X500);
retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 為狀態寄存器。
//讀數據
NAND_Read_Page();
//隨即讀
*(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 為低位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 為高位地址配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X0c) = 0x0000e005;//NFC_CMD 為命令字配置寄存器。
delay_x(0X500);
*(unsigned int *)(NANDC_ADDR +0X18) = 0x800;
delay_x(0X500);
//*(unsigned int *)(NANDC_ADDR +0X1c) = 0x46e;//NFC_OP 為操作寄存器。
//地址周期 cmd1_en addr_wen data_wen cmd2_en ready/busy data_ren read_stus_en
*(unsigned int *)(NANDC_ADDR +0X1c) = 2<<9 | 1<<6 | 1<<5 | 0<<4 | 1<<3 |1<<2 | 1<<1 | 0;////NFC_OP 為操作寄存器。
delay_x(0X500);
retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 為狀態寄存器。
//判斷數據是否正確。
for(i=0;i<(0x800/4);i++)
{
retu = *(unsigned int *)(0x50000000 + i*4);
if(retu != data)
return 1;
delay_x(0X500);
}
return 0;
}
retu2[0] = NAND_test(0x00000000);
retu2[1] = NAND_test(0xffffffff);
retu2[2] = NAND_test(0x5a5a5a5a);
retu2[3] = NAND_test(0xa5a5a5a5);
retu2[4] = NAND_test(0x12345678);
retu = retu2[0]+retu2[2]+retu2[1]+retu2[3]+retu2[4];
最後更新:2017-04-03 12:53:49