2440裸機學(xué)習(xí)心得(下)
12、NORFLASH操作
norflash為EN29LV160AB
對norflash的操作主要就是讀、寫、擦除和識別
EN29LV160AB的數(shù)據(jù)寬度可以是8位字節(jié)型,也可以是16位的字型,它由某一引腳配置實現(xiàn)的。在這里我們選擇字型
BYTE#位置硬件接地,直接默認(rèn)為Word Mode(16位)
寫操作只能使“1”變?yōu)?ldquo;0”,而只有擦除才能使“0”變?yōu)?ldquo;1”。因此在寫之前一定要先擦除
對norflash另一個比較常用的操作是讀取芯片的ID
NorFlash啟動,nGCS0接NorFlash,起始地址為0x0。0x0000 0000–0x0800 0000為NorFlash
注意幾個地方:
1、#defineCMD_ADDR0*((volatile U16 *)(0x555<<1+flash_base))
之所以又把norflash中的地址向左移一位(即乘以2),是因為我們是把s3c2440的ADDR1連接到了norflash的A0上的緣故,(自己看原理圖),容易理解,等于本來最低位的數(shù)被推后沒了,要左移拉回來。
2、check_toggle函數(shù)(校驗函數(shù))中
oldtoggle = *((volatile U16 *)0x0);newtoggle = *((volatile U16 *)0x0);
表示兩次讀值
if((oldtoggle & 0x40)==(newtoggle & 0x40)) //表示兩次的DQ6是否相同
if(newtoggle & 0x20)//DQ5是否為1
幾個常用的函數(shù):
讀函數(shù): read_en29lv160ab(U32 addr)
return *((volatile U16 *)(addr));//數(shù)據(jù)要轉(zhuǎn)為16位
寫函數(shù): en29lv160ab_program(U32 addr, U16 dat)
第一個周期是把命令0xAA寫入地址為0x555的命令寄存器中,
第二個周期是把命令0x55寫入地址為0x2AA命令寄存器中,
第三個周期是把命令0xA0再寫入地址為0x555命令寄存器中,
第四個周期為真正地把要寫入的數(shù)據(jù)寫入到norflash的地址中。
復(fù)位函數(shù): reset_en29lv160ab(void)
是向任一地址寫入復(fù)位命令0xF0
擦除函數(shù): en29lv160ab_sector_erase(U32 section_addr)
第一個周期是把命令0xAA寫入地址為0x555的命令寄存器中,
第二個周期是把命令0x55寫入地址為0x2AA命令寄存器中,
第三個周期是把命令0x80再寫入地址為0x555命令寄存器中,
第四個周期是把命令0xAA寫入地址為0x555的命令寄存器中,
第五個周期是把命令0x55再寫入地址為0x2AA命令寄存器中,
第六個周期是把命令0x30寫入要擦除塊的首地址內(nèi)
驗證函數(shù): check_toggle()
連續(xù)兩次讀取數(shù)據(jù)總線上的數(shù)據(jù),判斷數(shù)據(jù)總線上的第6位數(shù)值(DQ6)是否翻轉(zhuǎn),如果沒有翻轉(zhuǎn)則正確,否則還要判斷第5位(DQ5),以確定是否是因為超時而引起的翻轉(zhuǎn)。
讀ID函數(shù):get_en29lv160ab_id()
第一個周期是把命令0xAA寫入地址為0x555的命令寄存器中,
第二個周期是把命令0x55寫入地址為0x2AA命令寄存器中,
第三個周期是把命令0x90再寫入地址為0x555命令寄存器中,
第四個周期為讀取地址為0x100中的內(nèi)容,即廠商ID(0x1C)。
讀取設(shè)備ID的過程的前三個周期與讀取廠商ID相同,第四個周期是讀取地址為0x01中的內(nèi)容,即設(shè)備ID(0x2249)
問題1:
原來真的是寫得塊地址問題,寫到前面的0x400就行,寫后一點如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
一個劣勢是很容易產(chǎn)生壞塊,因此在使用nandflash時,往往要利用校驗算法發(fā)現(xiàn)壞塊并標(biāo)注出來
K9F2G08U0A的一頁為(2K+64)字節(jié)(加號前面的2K表示的是main區(qū)容量,加號后面的64表示的是spare區(qū)容量),它的一塊為64頁,而整個設(shè)備包括了2048個塊
內(nèi)存容量大小計算:
要實現(xiàn)用8個IO口來要訪問這么大的容量,K9F2G08U0A規(guī)定了用5個周期來實現(xiàn)。
列地址是用于尋址頁內(nèi)空間,行地址用于尋址頁,如果要直接訪問塊,則需要從地址A18開始。
CMD_STATUS讀狀態(tài)命令可以實現(xiàn)讀取設(shè)備內(nèi)的狀態(tài)寄存器,通過該命令可以獲知寫操作或擦除操作是否完成(判斷第6位),以及是否成功完成(判斷第0位)。
自己編寫NANDFLASH的步驟:(進行塊擦除,頁寫,頁讀)
1、在頭文件中列出相關(guān)的固量 和 函數(shù) 宏
常用的各種命令集;一些基于NANDFLASH控制器的基本函數(shù)
ECC應(yīng)用和使能nandflash片選;NFSTAT寄存器
一些返回判斷值的宏定義
2、寫出幾個基本的初始化函數(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ù):
具體自己看代碼了,有兩點要注意了:
A、讀操作 檢測正確性是通過ECC檢驗碼,而寫和擦除是通過toggle函數(shù)
B、隨機讀寫是 在讀頁,寫頁的基礎(chǔ)上 加上列的部分
注意區(qū)別兩個東西:
1、ECC檢驗碼的判斷
讀操作來說,我們還要繼續(xù)讀取spare區(qū)的相應(yīng)地址內(nèi)容,已得到上次寫操作時所存儲的main區(qū)和spare區(qū)的ECC,并把這些數(shù)據(jù)分別放入NFMECCD0/1和NFSECCD的相應(yīng)位置中。最后我們就可以通過讀取NFESTAT0/1(因為K9F2G08U0A是8位IO口,因此這里只用到了NFESTAT0)中的低4位來判斷讀取的數(shù)據(jù)是否正確,其中第0位和第1位為main區(qū)指示錯誤,第2位和第3位為spare區(qū)指示錯誤。
2、壞塊的判斷
對于寫頁和擦除操作來說,通過toggle函數(shù)檢測:
NF_CMD(CMD_STATUS); //讀狀態(tài)命令
//判斷狀態(tài)值的第6位是否為1,即是否在忙
//判斷狀態(tài)值的第0位是否為0,為0則寫操作正確,否則錯誤
若第0位操作錯誤,則該塊為 壞塊
3、main區(qū)和spare區(qū)的解鎖只為了產(chǎn)生ECC碼,一旦產(chǎn)生后,就要鎖上,打開另外區(qū)的,不要影響互相順序的ECC碼產(chǎn)生
擴展:從NANDFLASH啟動程序
當(dāng)檢測到是由nandflash啟動時,系統(tǒng)會自動把nandflash中的前4k字節(jié)的數(shù)據(jù)加載到Steppingstone中,然后把該Steppingstone映射為Bank0,因此系統(tǒng)會從Steppingstone開始運行程序,從而實現(xiàn)了s3c2440的nandflash自啟動的功能
通過在Steppingstone中,把程序的其余部分復(fù)制到RAM中,程序運行時由Steppingstone轉(zhuǎn)移到該RAM中,SRAM起始地址0x30000000
RdNF2SDRAM是C語言編寫的一段把nandflash中的數(shù)據(jù)復(fù)制到SRAM的程序
看看這函數(shù),了解一下就行了
附加:nandflash、norflash、SDRAM的區(qū)別:
ROM在系統(tǒng)停止供電的時候仍然可以保持?jǐn)?shù)據(jù),
RAM通常都是在掉電之后就丟失數(shù)據(jù),典型的RAM就是計算機的內(nèi)存。
SRAM速度非???,是目前讀寫最快的存儲設(shè)備了,但是它也非常昂貴,所以只在要求很苛刻的地方使用,譬如CPU的一級緩沖,二級緩沖
動態(tài)RAM(Dynamic RAM/DRAM),DRAM保留數(shù)據(jù)的時間很短,速度也比SRAM慢,不過它還是比任何的ROM都要快,但從價格上來說DRAM相比SRAM要便宜很多,計算機內(nèi)存就是DRAM的。本文引用地址:http://m.butianyuan.cn/article/201611/323342.htm
RAM |
SRAM |
DRAM |
SDRAM,DDR RAM等 |
ROM |
EROM,E2PROM等 |
NANDFLASH、NORFALSH等 |
關(guān)鍵詞:
2440v裸機學(xué)
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論