韋東山ARM第一期作業(七)NandFlash
阿新 • • 發佈:2019-01-13
文章目錄
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解答
自行百度