HI3531的nand flash测试 分类: arm-linux-Ubuntu HI3531 2013-12-20 17:56 568人阅读 评论(0) 收藏
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];
版权声明:本文为博主原创文章,未经博主允许不得转载。