新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 非易失閃存技術NAND Flash內存設備的讀寫控制設計

        非易失閃存技術NAND Flash內存設備的讀寫控制設計

        作者: 時間:2013-01-18 來源:網絡 收藏



        圖3 讀頁流程


        圖4 讀頁時序

        2.2.2 讀頁主要函數

        NAND Flash讀頁的主要函數有nand_read、nand_do_read_ops、nand_command_lp、nand_read_page_hweCC、read_buf。MTD上層會調用struct mtd_info中的讀page函數,即nand_read函數,然后調用nand_do_read_ops,接著會調用struct nand_Chip中的cmdfunc函數。這個cmdfunc函數與具體的NAND controller相關,它的作用是使NAND controller向NAND芯片發出讀命令,NAND芯片收到命令后,就會做好準備等待NAND controller下一步的讀取。接著nand_read函數又會調用struct nand_ecc_CTRl中的read_page函數,而read_page函數又會調用struct nand_chip中read_buf函數,從而真正把NAND芯片中的數據讀取到buffer中。read_buf函數返回后,read_page函數就會對buffer中的數據做一些處理,比如ECC校驗。讀頁主要函數代碼如下:

        statIC int nand_do_read_ops(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops) {

        ……

        while(1) {

        ……

        /*先發送對應的讀頁(read page)的命令*/

        chip﹥cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);

        ……

        /*發送完命令,接著去調用read_page函數讀取對應的數據*/

        ret=chip﹥ecc.read_page(mtd, chip, buFPoi);

        buf+=bytes;

        ……

        readlen-=bytes;

        if(!readlen)

        break;

        col=0;/*頁內地址對齊*/

        ealpage++;/*頁號加1*/

        page=realpage chip﹥pagemask;

        ……

        }

        ……

        }

        2.3 NAND Flash的寫頁流程

        2.3.1 寫頁時序


        圖5 寫頁時序

        從圖5寫頁時序可以看到,如果要實現寫一個頁的數據,就要發送Page program的命令,而且是分兩個周期,即分兩次發送對應的命令。第一次是80h,第二次是10h,而兩次命令中間,需要發送對應的要寫的頁的地址和數據。第3個周期是發送讀狀態寄存器命令70h, 如果I/O口為低電平,表示數據寫入成功,否則失敗。寫頁流程如圖6所示。

        圖6 寫頁流程

        2.3.2 寫頁主要函數

        以寫NAND Flash芯片為例,其寫數據的工作過程:首先,MTD上層會調用struct mtd_info中的寫page函數,即nand_write函數,然后調用nand_do_read_ops。接著函數會調用struct nand_chip中cmdfunc函數,這個cmdfunc函數與具體的NAND controller相關,它的作用是使NAND controller向NAND芯片發出寫命令,NAND芯片收到命令后,就會做好準備等待NAND controller下一步的讀取。接著nand_write函數又會調用struct nand_ecc_ctrl中的write_page函數,而write_page函數又會調用struct nand_chip中write_buf函數,從而真正把數據寫到NAND Flash芯片中。

        MTD讀取數據的入口是nand_write,然后調用nand_do_write_ops,此函數主體代碼如下:

        static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops){

        ……

        if (nand_check_wp(mtd))/*檢測,寫保護*/

        return -EIO;

        ……

        while(1){

        ……

        ret=chip﹥write_page(mtd, chip, wbuf, page, cached,(ops﹥mode==MTD_OOB_RAW));/*寫頁數據*/

        writelen-=bytes;

        if (!writelen)

        break;

        column=0; /*頁內地址對齊*/

        buf+=bytes;

        realpage++; /*頁號加1*/

        page=realpage chip﹥pagemask;

        ……

        }

        ……

        }


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 金华市| 尉犁县| 栾城县| 阿图什市| 镇安县| 香格里拉县| 富源县| 蓝山县| 迁安市| 彭泽县| 卢氏县| 秦安县| 东乌珠穆沁旗| 临江市| 木兰县| 巴东县| 金华市| 大埔区| 荔浦县| 烟台市| 辽阳县| 姚安县| 武冈市| 神池县| 横山县| 德阳市| 上蔡县| 惠州市| 九龙城区| 宁明县| 且末县| 牡丹江市| 博乐市| 沂水县| 天津市| 淮北市| 蕉岭县| 和平县| 贺州市| 田东县| 岑巩县|