1. 程式人生 > >韋東山ARM第一期作業(七)NandFlash

韋東山ARM第一期作業(七)NandFlash

文章目錄


01 - 作業所在路徑

  ARM裸機1期加強版\原始碼文件圖片\文件圖片\第016課_Nand_Flash

02 - 作業描述

2.1 - 作業1

  讀OOB檢測壞塊, 改進nand_read實現碰到壞塊就跳過

2.2 - 作業2

  實現NAND測試選單中的 [r] Read nand flash

2.3 - 作業3

  改進nand_write實現碰到壞塊就跳過

2.4 - 作業4

  百度搜一下NAND ECC,瞭解一下

03 - 作業解答

3.1 - 作業1解答

讀OOB檢測壞塊, 改進nand_read實現碰到壞塊就跳過

int nand_bad(unsigned int addr)
	{
		unsigned int page = addr / PAGE_SIZE
; unsigned int col = PAGE_SIZE; unsigned char data = 0; //傳送讀資料命令0x00 nand_cmd(CMD_READ_DATA); //傳送資料地址,2位元組列地址(64k)和3位元組行地址(16M) nand_col(col); nand_page(page); //傳送讀資料命令0x30 nand_cmd(CMD_SURE_READ); //等待就緒 wait_ready(); //讀出資料 data = nand_read_data_byte(); //取消選中 nand_deselect(); //不等於0xff,就是壞塊
if(data != 0xff) return 1; return 0; }

  在nand_read()中,讀之前,檢測壞塊

void nand_read(unsigned int addr, unsigned char *buf, unsigned int len)
{
    int i = 0;
    int page = addr / PAGE_SIZE;
    int col  = addr & (PAGE_SIZE-1);

    while(i<len)
    {
        //1個block大小為128k(~0x1ffff),每個block的起始地址一定是0x1ffff的整數倍
        if(!(addr & 0x1ffff) && nand_bad(addr))
        {
            addr += (BLOCK_SIZE * SIZE_1K);
            continue;
        }
		……
	}
}

3.2 - 作業2解答

實現NAND測試選單中的 [r] Read nand flash

  直接在switch中呼叫函式read_nand()就可以,不貼程式碼了

3.3 - 作業3解答

改進nand_write實現碰到壞塊就跳過

  直接用nand_bad()

void nand_write(unsigned int addr, unsigned char *buf, unsigned int len)
{
    unsigned int page = addr / PAGE_SIZE;
    unsigned int col = addr & (PAGE_SIZE-1);
    unsigned int i = 0;

    while(1)
    {
        //1個block大小為128k(~0x1ffff),每個block的起始地址一定是0x1ffff的整數倍
        if(!(addr & 0x1ffff) && nand_bad(addr))
        {
            addr += (BLOCK_SIZE * SIZE_1K);
            continue;
        }
	……
	}
}

3.4 - 作業4解答

  自行百度