新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 2440裸機(jī)學(xué)習(xí)心得(下)

2440裸機(jī)學(xué)習(xí)心得(下)

作者: 時(shí)間:2016-11-29 來源:網(wǎng)絡(luò) 收藏
12、NORFLASH操作
norflash為EN29LV160AB
對norflash的操作主要就是讀、寫、擦除和識別
EN29LV160AB的數(shù)據(jù)寬度可以是8位字節(jié)型,也可以是16位的字型,它由某一引腳配置實(shí)現(xiàn)的。在這里我們選擇字型
BYTE#位置硬件接地,直接默認(rèn)為Word Mode(16位)
寫操作只能使“1”變?yōu)?ldquo;0”,而只有擦除才能使“0”變?yōu)?ldquo;1”。因此在寫之前一定要先擦除
對norflash另一個(gè)比較常用的操作是讀取芯片的ID
NorFlash啟動,nGCS0接NorFlash,起始地址為0x0。0x0000 0000–0x0800 0000為NorFlash
注意幾個(gè)地方:
1、#defineCMD_ADDR0*((volatile U16 *)(0x555<<1+flash_base))
之所以又把norflash中的地址向左移一位(即乘以2),是因?yàn)槲覀兪前裺3c2440的ADDR1連接到了norflash的A0上的緣故,(自己看原理圖),容易理解,等于本來最低位的數(shù)被推后沒了,要左移拉回來。
2、check_toggle函數(shù)(校驗(yàn)函數(shù))中
oldtoggle = *((volatile U16 *)0x0);newtoggle = *((volatile U16 *)0x0);
表示兩次讀值
if((oldtoggle & 0x40)==(newtoggle & 0x40)) //表示兩次的DQ6是否相同
if(newtoggle & 0x20)//DQ5是否為1
幾個(gè)常用的函數(shù):
讀函數(shù): read_en29lv160ab(U32 addr)
return *((volatile U16 *)(addr));//數(shù)據(jù)要轉(zhuǎn)為16位
寫函數(shù): en29lv160ab_program(U32 addr, U16 dat)
第一個(gè)周期是把命令0xAA寫入地址為0x555的命令寄存器中,
第二個(gè)周期是把命令0x55寫入地址為0x2AA命令寄存器中,
第三個(gè)周期是把命令0xA0再寫入地址為0x555命令寄存器中,
第四個(gè)周期為真正地把要寫入的數(shù)據(jù)寫入到norflash的地址中。
復(fù)位函數(shù): reset_en29lv160ab(void)
是向任一地址寫入復(fù)位命令0xF0
擦除函數(shù): en29lv160ab_sector_erase(U32 section_addr)
第一個(gè)周期是把命令0xAA寫入地址為0x555的命令寄存器中,
第二個(gè)周期是把命令0x55寫入地址為0x2AA命令寄存器中,
第三個(gè)周期是把命令0x80再寫入地址為0x555命令寄存器中,
第四個(gè)周期是把命令0xAA寫入地址為0x555的命令寄存器中,
第五個(gè)周期是把命令0x55再寫入地址為0x2AA命令寄存器中,
第六個(gè)周期是把命令0x30寫入要擦除塊的首地址內(nèi)
驗(yàn)證函數(shù): check_toggle()
連續(xù)兩次讀取數(shù)據(jù)總線上的數(shù)據(jù),判斷數(shù)據(jù)總線上的第6位數(shù)值(DQ6)是否翻轉(zhuǎn),如果沒有翻轉(zhuǎn)則正確,否則還要判斷第5位(DQ5),以確定是否是因?yàn)槌瑫r(shí)而引起的翻轉(zhuǎn)。
讀ID函數(shù):get_en29lv160ab_id()
第一個(gè)周期是把命令0xAA寫入地址為0x555的命令寄存器中,
第二個(gè)周期是把命令0x55寫入地址為0x2AA命令寄存器中,
第三個(gè)周期是把命令0x90再寫入地址為0x555命令寄存器中,
第四個(gè)周期為讀取地址為0x100中的內(nèi)容,即廠商ID(0x1C)。
讀取設(shè)備ID的過程的前三個(gè)周期與讀取廠商ID相同,第四個(gè)周期是讀取地址為0x01中的內(nèi)容,即設(shè)備ID(0x2249)
問題1:
原來真的是寫得塊地址問題,寫到前面的0x400就行,寫后一點(diǎn)如0xf0000就讀不出來了,0x0000 0000–0x0800 0000為NorFlash,為什么后面的不行呢?
問題2:
本來擦除后寫完能讀出寫的內(nèi)容,但再復(fù)位后不寫,只讀回上次地址,發(fā)現(xiàn)讀出不同的數(shù)據(jù)
而且好像擦除后就算返回return 1也沒用,擦后讀回那地址,也不是全部數(shù)據(jù)為0的,也是有值的
13、NANDFLASH操作
nandflash為K9F2G08U0A,它是8位的nandflash
一個(gè)劣勢是很容易產(chǎn)生壞塊,因此在使用nandflash時(shí),往往要利用校驗(yàn)算法發(fā)現(xiàn)壞塊并標(biāo)注出來
K9F2G08U0A的一頁為(2K+64)字節(jié)(加號前面的2K表示的是main區(qū)容量,加號后面的64表示的是spare區(qū)容量),它的一塊為64頁,而整個(gè)設(shè)備包括了2048個(gè)塊
內(nèi)存容量大小計(jì)算:
要實(shí)現(xiàn)用8個(gè)IO口來要訪問這么大的容量,K9F2G08U0A規(guī)定了用5個(gè)周期來實(shí)現(xiàn)。
列地址是用于尋址頁內(nèi)空間,行地址用于尋址頁,如果要直接訪問塊,則需要從地址A18開始。
CMD_STATUS讀狀態(tài)命令可以實(shí)現(xiàn)讀取設(shè)備內(nèi)的狀態(tài)寄存器,通過該命令可以獲知寫操作或擦除操作是否完成(判斷第6位),以及是否成功完成(判斷第0位)。
自己編寫NANDFLASH的步驟:(進(jìn)行塊擦除,頁寫,頁讀)
1、在頭文件中列出相關(guān)的固量 和 函數(shù) 宏
常用的各種命令集;一些基于NANDFLASH控制器的基本函數(shù)
ECC應(yīng)用和使能nandflash片選;NFSTAT寄存器
一些返回判斷值的宏定義
2、寫出幾個(gè)基本的初始化函數(shù):
管腳,寄存器初始化函數(shù) ; 復(fù)位函數(shù) ; 讀NANDID號函數(shù)
3、相關(guān)的檢測判斷函數(shù):
A、檢測是否寫擦除成功函數(shù)NF_toggle:通過NF_CMD(CMD_STATUS)狀態(tài)位
B、測試是否壞塊函數(shù)NF_testBadBlock:讀取2054處壞塊標(biāo)志位
C、寫壞塊標(biāo)志函數(shù)NF_MarkBadBlock:寫標(biāo)志到 2054處
4、讀、寫、擦除函數(shù):
具體自己看代碼了,有兩點(diǎn)要注意了:
A、讀操作 檢測正確性是通過ECC檢驗(yàn)碼,而寫和擦除是通過toggle函數(shù)
B、隨機(jī)讀寫是 在讀頁,寫頁的基礎(chǔ)上 加上列的部分
注意區(qū)別兩個(gè)東西:
1、ECC檢驗(yàn)碼的判斷
讀操作來說,我們還要繼續(xù)讀取spare區(qū)的相應(yīng)地址內(nèi)容,已得到上次寫操作時(shí)所存儲的main區(qū)和spare區(qū)的ECC,并把這些數(shù)據(jù)分別放入NFMECCD0/1和NFSECCD的相應(yīng)位置中。最后我們就可以通過讀取NFESTAT0/1(因?yàn)镵9F2G08U0A是8位IO口,因此這里只用到了NFESTAT0)中的低4位來判斷讀取的數(shù)據(jù)是否正確,其中第0位和第1位為main區(qū)指示錯(cuò)誤,第2位和第3位為spare區(qū)指示錯(cuò)誤。
2、壞塊的判斷
對于寫頁和擦除操作來說,通過toggle函數(shù)檢測:
NF_CMD(CMD_STATUS); //讀狀態(tài)命令
//判斷狀態(tài)值的第6位是否為1,即是否在忙
//判斷狀態(tài)值的第0位是否為0,為0則寫操作正確,否則錯(cuò)誤
若第0位操作錯(cuò)誤,則該塊為 壞塊
3、main區(qū)和spare區(qū)的解鎖只為了產(chǎn)生ECC碼,一旦產(chǎn)生后,就要鎖上,打開另外區(qū)的,不要影響互相順序的ECC碼產(chǎn)生
擴(kuò)展:從NANDFLASH啟動程序
當(dāng)檢測到是由nandflash啟動時(shí),系統(tǒng)會自動把nandflash中的前4k字節(jié)的數(shù)據(jù)加載到Steppingstone中,然后把該Steppingstone映射為Bank0,因此系統(tǒng)會從Steppingstone開始運(yùn)行程序,從而實(shí)現(xiàn)了s3c2440的nandflash自啟動的功能
通過在Steppingstone中,把程序的其余部分復(fù)制到RAM中,程序運(yùn)行時(shí)由Steppingstone轉(zhuǎn)移到該RAM中,SRAM起始地址0x30000000
RdNF2SDRAM是C語言編寫的一段把nandflash中的數(shù)據(jù)復(fù)制到SRAM的程序
看看這函數(shù),了解一下就行了
附加:nandflash、norflash、SDRAM的區(qū)別:
ROM在系統(tǒng)停止供電的時(shí)候仍然可以保持?jǐn)?shù)據(jù),
RAM通常都是在掉電之后就丟失數(shù)據(jù),典型的RAM就是計(jì)算機(jī)的內(nèi)存。
SRAM速度非??欤悄壳白x寫最快的存儲設(shè)備了,但是它也非常昂貴,所以只在要求很苛刻的地方使用,譬如CPU的一級緩沖,二級緩沖
動態(tài)RAM(Dynamic RAM/DRAM),DRAM保留數(shù)據(jù)的時(shí)間很短,速度也比SRAM慢,不過它還是比任何的ROM都要快,但從價(jià)格上來說DRAM相比SRAM要便宜很多,計(jì)算機(jī)內(nèi)存就是DRAM的。

本文引用地址:http://butianyuan.cn/article/201611/323342.htm
RAM
SRAM
DRAM
SDRAM,DDR RAM等
ROM
EROM,E2PROM等
NANDFLASH、NORFALSH等



關(guān)鍵詞: 2440v裸機(jī)學(xué)

評論


技術(shù)專區(qū)

關(guān)閉