韦东山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解答

  自行百度

猜你喜欢

转载自blog.csdn.net/Hxj_CSDN/article/details/85782380
今日推荐