找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1933|回復(fù): 0
收起左側(cè)

S3C2440的Nand Flash控制器

[復(fù)制鏈接]
ID:107189 發(fā)表于 2016-3-6 13:07 | 顯示全部樓層 |閱讀模式
s3c2440內(nèi)部集成有內(nèi)部SRAM(steppingstone),當(dāng)選擇從nand flash啟動(dòng)的時(shí)候,nand flash的前4k代碼將會(huì)自動(dòng)copy到內(nèi)部SRAM中后運(yùn)行。
一、nand flash控制器的特性
1、支持讀/寫/編程N(yùn)AND FLASH內(nèi)存。
2、系統(tǒng)復(fù)位后nand flash的前4k代碼自動(dòng)copy到內(nèi)部SRAM,copy完成后從SRAM啟動(dòng),此時(shí)內(nèi)部sram被映射為nGCS0。(當(dāng)OM[1:0]=00時(shí),使能NAND FLASH 啟動(dòng)模式)
3、支持硬件ECC校驗(yàn)。
4、系統(tǒng)啟動(dòng)后內(nèi)部SRAM可以用做其他的用途。

二、操作nand flash的方法
1、設(shè)置nand flash配置寄存器NFCONF
2、向命令寄存器NFCMMD寫入操作命令;
3、向地址寄存器NFADDR寫入地址;
4、讀/寫數(shù)據(jù)前要讀取狀態(tài)寄存器NFSTAT來(lái)判斷nand flash是否處于忙狀態(tài)。

三、ECC(錯(cuò)誤糾錯(cuò)碼)
nand flash控制器包括4個(gè)ECC模塊,兩個(gè)模塊(一個(gè)用于data[7:0],一個(gè)用于data[15:8])可以被用于2048bytes為上限的ECC檢驗(yàn)碼的生成,另外兩個(gè)模塊(一個(gè)用于data[7:0],一個(gè)用于data[15:8])可以被用于16bytes為上限的ECC檢驗(yàn)碼的生成。

四、NAND FLASH特殊功能寄存器的詳細(xì)說(shuō)明----見(jiàn)手冊(cè)
NFCONF    0x4E000000 NAND flash configuration
NFCONT    0x4E000004 NAND flash control
NFCMD      0x4E000008 NAND flash command
NFADDR    0x4E00000C NAND flash address
NFDATA     0x4E000010 NAND flash data
NFMECC0 0x4E000014 NAND flash main area ECC0/1
NFMECC1 0x4E000018 NAND flash main area ECC2/3
NFSECC    0x4E00001C NAND flash spare area ECC
NFSTAT     0x4E000020 NAND flash operation status
NFESTAT0 0x4E000024 NAND flash ECC status for I/O[7:0]
NFESTAT1 0x4E000028 NAND flash ECC status for I/O[15:8]
NFMECC0 0x4E00002C NAND flash main area ECC0 status
NFMECC1 0x4E000030 NAND flash main area ECC1 status
NFSECC    0x4E000034 NAND flash spare area ECC status
NFSBLK     0x4E000038 NAND flash start block address
NFEBLK     0x4E00003C NAND flash end block address
五、讀nand flash一般步驟
1.設(shè)置NFCONF和NFCONT
NFCONF = 0x300      ;設(shè)置時(shí)序
NFCONT = (1<<4)|(1<<1)|(1<<0)
2.發(fā)出片選信號(hào).
NFCONT&= ~(1<<11)
NFCMMD = 0xff; reset命令,第一次操作nand flash前,通常復(fù)位nand flash

3.發(fā)出讀命令
NFCMMD = 0 (讀命令)

4.發(fā)出地址信號(hào)

volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
   
    *p = addr & 0xff;
    *p = (addr>>9) & 0xff;
    *p = (addr>>17) & 0xff;
    *p = (addr>>25) & 0xff;
5.循環(huán)查詢NFSTAT位0,直到它等于1。

6.連續(xù)讀NFDATA寄存器512次,得到一頁(yè)數(shù)據(jù)(512字節(jié))

7.禁止nand flash的片選信號(hào)
NFCONT|= (1<<1)

例子:
void nand_read(unsigned char *buf, unsigned long start_addr, int size)
{
    int i, j;
   
    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
        return ;    /* 地址或長(zhǎng)度不對(duì)齊 */
    }
   /* 選中芯片 */
    nand_select_chip();
    for(i=start_addr; i < (start_addr + size);) {
      /* 發(fā)出READ0命令 */
      write_cmd(0);
      write_addr(i); /* Write Address */
      wait_idle();
      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
          *buf = read_data();
          buf++;
      }
    }
   
    nand_deselect_chip(); /* 取消片選信號(hào) */
   
    return ;
}

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表