1. 程式人生 > >nand flash讀寫 (三) (轉)

nand flash讀寫 (三) (轉)

6)NAND 的寫操作

static int NF_WritePage(U32 block,U32 page,U8 *buffer)//Flash

{

int i;

U32 blockPage=(block<<5)+page;

U8 *bufPt=buffer;

NF_RSTECC();// Initialize ECC

NF_nFCE_L();

NF_CMD(0x0[q4]);//?????\\Read Mode 1

NF_CMD(0x80);// Write 1st command,資料輸入

NF_ADDR(0);// Column 0

NF_ADDR(blockPage&0xff);

NF_ADDR((blockPage>>8)&0xff);// Block & page num.

NF_ADDR((blockPage>>16)&0xff);

for(i=0;i<512;i++)

{

NF_WRDATA(*bufPt++);// Write one page to NFM from buffer

}

seBuf[1]=rNFECC1;

seBuf[2]=rNFECC2;

seBuf[5]=0xff;// Marking good block

for(i=0;i<16;i++)

{

NF_WRDATA(seBuf[i]);// Write spare array(ECC and Mark)

}

[q5]

NF_CMD(0x10);// Write 2nd command

for(i=0;i<10;i++);//tWB = 100ns. ////??????

NF_WAITRB();//wait tPROG 200~500us;

NF_CMD(0x70);// Read status command

for(i=0;i<3;i++);//twhr=60ns

if (NF_RDDATA()&0x1) // Page write error

{

NF_nFCE_H();

Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);

return 0;

}

else

{

NF_nFCE_H();

#if (WRITEVERIFY==1)

//return NF_VerifyPage(block,page,pPage);

#else

return 1;

#endif

}

}

以下討論一下NAND 裝置上所支援的檔案系統,大概現在有以下幾種:

A.JFFS2(沒有壞塊處理,支援大容量儲存的時候需要消耗大量的記憶體,大量的隨機訪問降低了NAND裝置的讀取效率)和YAFFS(速度快,但不支援檔案的壓縮和解壓)

B.支援DiskOnChip裝置的TRUEFFSTrue Flash File System. TRUEFFSM-Systems公司為其產品DiskOnChip開發的檔案系統,其規範並不開放。

C.SSFDCSolid State Floppy Disk Card)論壇定義的支援SM卡的DOS-FATSM卡的DOS-FAT檔案系統是由SSFDC論壇定義的,但它必須用在標準的塊裝置上。

對於大量用在各類儲存卡上的NAND 裝置而言,他們幾乎都採用FAT檔案系統,而在嵌入式作業系統下,還沒有驅動程式可以直接讓NAND裝置採用檔案系統,就技術角度來說,FAT檔案系統不是很適合NAND裝置,因為FAT檔案系統的檔案分割槽表需要不斷地擦寫,而NAND裝置的只能有限次的擦寫。

在上面已經很明顯的提到,NAND裝置存在壞塊,為和上層檔案系統介面,NAND裝置的驅動程式必須給檔案系統提供一個可靠的儲存空間,這就需要ECCError Corection Code)校驗,壞塊標註、地址對映等一系列的技術手段來達到可靠儲存目的。

SSFDC軟體規範中,詳細定義瞭如何利用NAND裝置每個頁中的冗餘資訊來實現上述功能。這個軟體規範中,很重要的一個概念就是塊的邏輯地址,它將在物理上可能不連續、不可靠的空間分配編號,為他們在邏輯空間上給系統檔案提供一個連續可靠的儲存空間。

3給出了SSFDC規範中邏輯地址的標註方法。在系統初始化的時候,驅動程式先將所有的塊掃描一遍,讀出他們所對應的邏輯地址,並把邏輯地址和虛擬地址的對映表建好。系統執行時,驅動程式通過查詢對映表,找到需要訪問的邏輯地址所對應的實體地址然後進行資料讀寫。

冗餘位元組定義

位元組序號

內容

位元組序號

內容

512

使用者定義資料

520

256BECC校驗和

513

521

514

522

515

523

塊邏輯地址

516

資料狀態

524

517

塊狀態

525

256BECC校驗和

518

塊邏輯地址1

526

519

527

4給出了塊邏輯地址的存放格式,LA表示邏輯地址,P代表偶校驗位。邏輯地址只有10bit,代表只有1024bit的定址空間。而SSFDC規範將NAND裝置分成了多個zone,每個zone 內有1024塊,但這物理上的1024塊對映到邏輯空間只有1000塊,其他的24塊就作為備份使用,當有壞塊存在時,就可以以備份塊將其替換。

4邏輯地址格式

D7

D6

D5

D4

D3

D2

D1

D0

0

0

0

1

0

LA9

LA8

LA7

518523位元組

LA6

LA5

LA4

LA3

LA2

LA1

LA0

P

519524位元組

有了以上的軟體規範,就可以對NAND裝置寫出較標準的ECC校驗,並可以編寫檢測壞塊、標記壞塊、建立實體地址和邏輯地址的對映表的程式了。

static int NF_IsBadBlock(U32 block) //檢測壞塊

{

int i;

unsigned int blockPage;

U8 data;

blockPage=(block<<5);// For 2'nd cycle I/O[7:5]

NF_nFCE_L();

NF_CMD(0x50);// Spare array read command

NF_ADDR(blockPage&0xff);// The mark of bad block is in 0 page

NF_ADDR((blockPage>>8)&0xff);// For block number A[24:17]

NF_ADDR((blockPage>>16)&0xff);// For block number A[25]

for(i=0;i<10;i++);// wait tWB(100ns) //?????

NF_WAITRB();// Wait tR(max 12us)

data=NF_RDDATA();

NF_nFCE_H();

if(data!=0xff)

{

Uart_Printf("[block %d has been marked as a bad block(%x)]\n",block,data);

return 1;

}

else

{

return 0;

}

}

static int NF_MarkBadBlock(U32 block)//標記壞塊

{

int i;

U32 blockPage=(block<<5);

seBuf[0]=0xff;

seBuf[1]=0xff;

seBuf[2]=0xff;

NF_nFCE_L();

NF_CMD(0x50);//????

NF_CMD(0x80);// Write 1st command

NF_ADDR(0x0);// The mark of bad block is

NF_ADDR(blockPage&0xff);// marked 5th spare array

相關推薦

nand flash  

6)NAND 的寫操作 static int NF_WritePage(U32 block,U32 page,U8 *buffer)//寫Flash { int i; U32 bloc

嵌入式bootloader開發之八----NAND Flash擦除操作實現Tiny 6410

概要:          本節主要記錄開發Tiny6410自帶的NAND FLASH的過程,實現了NAND FLASH的擦除,讀寫資料功能,但都只是簡單的實現而已,並沒有做精細而完整的實現,畢竟只是想學原理。 前言:    工欲善其事,必先利其器。在做開發之前,必須保證良

51微控制器控制K9K8G08U0C NAND Flash程式

網上看到這個原始碼,雖然感覺51用到nandflash的情況不多,但是可以借鑑理解nandflash的讀寫流程 #include< STC12C5A60S2.H> #include< intrins.h> #include < SMG.h>

NAND FLASH 操作 簡介

NAND FLASH 記憶體詳解與讀寫定址方式 一、記憶體詳解 NAND快閃記憶體陣列分為一系列128kB的區塊(block),這些區塊是 NAND器件中最小的可擦除實體。擦除一個區塊就是把所有的位(bit)設定為"1"(而所有位元組(byte)設定為FFh)

ESP8266學習筆記2——Flash

一、儲存晶片W25Q系列 w25q 系列生產的加工的商家很多,但是裡面的分佈和命名規則都是一樣的。比如華邦的w25q64,spi通訊介面,64就是指 64Mbit 也就是 8M 的容量。而我們平時的8266-12f的 32Mbit 就是 4M 容量。 以 w25q32

安裝Centos7 、 Mysql8 叢集,實現分離 高可用-- 主從設定

零、寫在前面    為了嘗試新技術和業務需要,因此打算搞一套這樣的環境玩兒一下    作業系統及資料庫的安裝請見前兩篇一、理論依據    不再贅述我的硬體規劃等細節    這次僅用到兩臺虛擬機器,一主一

DM36x使用串列埠和NAND啟動完成NAND Flash

背景:專案進行到最後階段,所有的啟動都需要放到NAND Flash晶片上。但是由於硬體設計,沒有新增網路和JTAG模組,所以常見的NFS和JTAG燒寫方式失效。於是,我們需要尋找可行的燒錄方式。 平臺: 作業系統:Ubuntu 10.04 開發板:DM36

FPGA學習心得及flash,+lwip+資料傳送等問題

前段時間應老闆的專案需求,對硬體絲毫不懂得我開始接觸edk硬體程式設計,感覺這段時間跟硬體打交道,自己都老了不少。首先,硬體程式設計編譯很慢,編譯一次有時候得10-20分鐘,尤其是用verilog寫得程式比較大的時候。其次,除錯非常麻煩,不能像利用c或者c#那樣斷點除錯了,

自動化day3---Python基礎list、字典、元組、文件、字符串格式化

int() 文件讀寫 移動 ace div 補齊 解決 讀一行 ext 1.list list的操作 #數組---list arraystus = [‘xiaohei‘,‘xiaobai‘,‘xiaolan‘]#計算機取值是從0開始的#0 1 2 3#下標 角標 索引

pcie配置空間安裝lib庫

readme.txt + pcie.c + in.txt +Makefile  可參考原始碼是: lspci readme.txt Please open the terminal in your linux system, then: 1.Please install

Qt下XML格式檔案使用QDomDocument類

簡述 XML是一種標記語言,被設計用來結構化儲存以及傳輸資訊,是一種常用的文件資料結構。 就我個人而言,Qt下讀寫XML格式檔案可以有三種方法: 一是使用純C++的rapidxml開源庫。優點是速度快,媲美strlen()的速度;缺點是處理中文比較麻煩,編碼只有ANSI格式。 二是使用Q

【人生苦短,我用python!】幾行python處理檔案裡面的重複內容包括了檔案,過濾重複!

The beauty of python 1 https://blog.csdn.net/dengyaolongacmblog/article/details/38016905 置頂 2014年07月21日 15:28:18 yaolongdeng 閱讀數:2189 標籤:

RT-Thread使用I2Ceeprom例程24c02

實驗準備: 開發板:正點原子探索者 RT-Thread原始碼 env工具 env配置: 使能相關的uart,用於開啟控制檯 開啟I2C裝置: 實驗原始碼: #include <rtthread.h> #include <rtd

安裝Centos7 、 Mysql8 叢集,實現分離 高可用-- MyCat分離

零、說在前面    先吐個槽,這點東西折騰了我四五天,最後還是一條告警拯救了我,下面進入正文    看了幾個MySQL的讀寫分離的中介軟體,貌似這個是比較流行的一個,雖然我不是BAT的粉絲,但是有好用的

C++ 檔案詳解(七)ofstream,ifstream,fstream

void fileRead() { using namespace std; ifstream fin; /** qwer:asdf:zxc:1234: gfd:jkl:mnb: */ //開啟檔案 fi

Java建立以及xml文件dom方式

package myXML; import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*;

檔案工具簡單實現之java的UI介面視覺化畫圖/製作

現在和大家介紹下,我們簡單的介面工具開發,使用者選擇檔案,讀出部分想要檔案內容,滑鼠在大輸入框點選某一行就會顯示在其他輸入框中,然後在其他輸入框修改後內容,點寫入按鈕即可修改並顯示到大輸入框中,且原檔案對應剛剛選的改行內容;大概的介面如下,網路現在原因不能上傳圖片:選擇檔案按

C/C++ 關於如何ini配置檔案 小結

讀取 讀取字元   DWORD GetPrivateProfileString(   LPCTSTR lpAppName,        // INI檔案中的一個欄位名[節名]可以有很多個節名   LPCTSTR lpKeyName,        // lpAppName 下的一個鍵名,也就是裡面具體

JavaCSV格式檔案opencsv

一,讀取CSV格式檔案: import java.io.File; import java.io.FileReader; import java.util.List; import au.com.bytecode.opencsv.CSVReader; public c

安裝Centos7 、 Mysql8 叢集,實現分離 高可用-- 資料庫安裝篇

零、寫在前面    為了嘗試新技術和業務需要,因此打算搞一套這樣的環境玩兒一下    伺服器的安裝請見上一篇一、硬體規劃    我用的是自己的本機(8核、16G),劃分出三臺虛擬機器(一主兩從--MyS