文章目录
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解答
自行百度