static void nand_send_addr(unsigned int addr) { nand_addr(addr & 0xff); /* a0~a7 */ nand_addr((addr >> 8) & 0x7); /* 程序的角度: a8~a10 */ nand_addr((addr >> 11) & 0xff); /* 程序的角度: a11~a18 */ nand_addr((addr >> 19) & 0xff); /* 程序的角度: a19~a26 */ nand_addr((addr >> 27) & 0xff); /* 程序的角度: a27 ~ */ }
void NF_PageRead(unsigned long addr,unsigned char* buff) { int i; /* 选中芯片 */ select_ship(); /* 清除RnB */ clean_RnB(); /* 发出命令0x00 */ nand_cmd(0x00); /* 发出列地址 */ nand_addr(0x00); nand_addr(0x00); /* 发出行地址 */ nand_addr(addr&0xff); nand_addr((addr >>8 ) & (0xff)); nand_addr((addr >>16 ) & (0xff)); /* 发出命令0x30 */ nand_cmd(0x30); /* 等待就绪 */ wait_RnB(); /* 读数据 */ for(i = 0; i<1024*2; i++) { *buff++ = NFDATA; } /* 取消片选 */ delselect_ship(); }
int nand_erase_block(unsigned long addr) { int page = addr / 2048; nand_select(); nand_cmd(0x60); nand_addr(page & 0xff); nand_addr((page >> 8) & 0xff); nand_addr((page >> 16) & 0xff); nand_cmd(0xd0); wait_ready(); nand_deselect(); }