新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 2440裸機學習心得(下)

        2440裸機學習心得(下)

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

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



        關鍵詞: 2440v裸機學

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 新津县| 吴旗县| 介休市| 黔西县| 贵州省| 高阳县| 邛崃市| 乌海市| 侯马市| 长丰县| 广元市| 天水市| 达拉特旗| 体育| 西乡县| 谢通门县| 巴南区| 平原县| 高州市| 将乐县| 五寨县| 眉山市| 嵊州市| 东城区| 上高县| 巩留县| 禹城市| 金平| 嵊州市| 渝北区| 阿克陶县| 遂川县| 玉溪市| 隆林| 双城市| 交城县| 建湖县| 白山市| 林口县| 正蓝旗| 酉阳|