<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > s3c2440對(duì)K9F2G08UOB Nand Flash的簡(jiǎn)單操作函數(shù)

          s3c2440對(duì)K9F2G08UOB Nand Flash的簡(jiǎn)單操作函數(shù)

          作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
          功能:先擦除一塊nand flash地址,然后往里面寫一字符串,最后再讀出來

          實(shí)現(xiàn),擦除、寫、讀功能。 芯片型號(hào):K9F2G08UOB

          /****************************************************
          擦除nand flash 0x500000 地址
          主函數(shù):erase.c
          ****************************************************/
          #define NFCONF *(volatile unsigned long *)0x4E000000
          #define NFCONT *(volatile unsigned long *)0x4E000004
          #define NFCMMD *(volatile unsigned long *)0x4E000008
          #define NFADDR *(volatile unsigned long *)0x4E00000C
          #define NFDATA *(volatile unsigned char *)0x4E000010
          #define NFSTAT *(volatile unsigned long *)0x4E000020

          void (*printf)(char *, ...) = 0x33f9291C;
          void erase_nand(unsigned long addr);

          void _start(void)
          {
          //configure for nand flash controller
          NFCONF = (0x2 << 12) | (0x7 << 8) | (0x1 << 4);

          //control
          //NAND flash 開始工作
          NFCONT = 1;

          //設(shè)置擦除地址
          erase_nand(0x500000);

          }

          //------發(fā)送地址參照K9F2G08UOA數(shù)據(jù)手冊(cè)第9頁--------
          void send_addr(unsigned long addr)
          {
          NFADDR = (addr >> 11) & 0xff;
          NFADDR = (addr >> 19) & 0xff;
          NFADDR = (addr >> 27) & 0x1;
          }

          /*****************************************
          塊擦除
          對(duì)照K9F2G08UOA手冊(cè)第28頁
          ******************************************/
          void erase_nand(unsigned long addr)
          {
          unsigned int stat;

          //發(fā)送指令60h塊擦除設(shè)置指令
          NFCMMD = 0x60;

          //發(fā)送三次行地址
          send_addr(addr);

          //nandflash ready
          //發(fā)送d0擦除指令
          NFCMMD = 0xd0;

          //等待忙狀態(tài)
          while(!(NFSTAT & 0x1))
          ;


          // 發(fā)送70h讀狀態(tài)指令
          NFCMMD = 0x70;

          //讀取數(shù)據(jù)
          stat = NFDATA;

          //最后一位判斷成功與否
          if(stat & 0x1){
          printf("erase nand flash device errn");
          return ;
          }

          printf("erase nand flash device successn");
          }

          /****************************************************
          寫nand flash 0x500000 地址 一個(gè)字符串
          主函數(shù):write.c
          ****************************************************/
          #define NFCONF *(volatile unsigned long *)0x4E000000
          #define NFCONT *(volatile unsigned long *)0x4E000004
          #define NFCMMD *(volatile unsigned long *)0x4E000008
          #define NFADDR *(volatile unsigned long *)0x4E00000C
          #define NFDATA *(volatile unsigned char *)0x4E000010
          #define NFSTAT *(volatile unsigned long *)0x4E000020


          void (*printf)(char *, ...) = 0x33f9291C;
          void write_nand(char *buf, unsigned long addr, int size);
          char buf[11];

          void _start(void)
          {
          int i;

          //configure for nand flash controller
          NFCONF = (0x2 << 12) | (0x7 << 8) | (0x1 << 4);

          //control
          NFCONT = 1;

          //準(zhǔn)備一個(gè)全寫a的數(shù)組
          for(i = 0; i < 11; i++)
          {
          buf= a;
          }

          //往0x500000寫字符串buf 11個(gè)字節(jié)
          write_nand(buf, 0x500000, 11);

          }

          //------發(fā)送地址參照K9F2G08UOA數(shù)據(jù)手冊(cè)第9頁--------
          void send_addr(unsigned long addr)
          {
          NFADDR = addr & 0xff;
          NFADDR = (addr >> 8) & 0x7;
          NFADDR = (addr >> 11) & 0xff;
          NFADDR = (addr >> 19) & 0xff;
          NFADDR = (addr >> 27) & 0x1;
          }

          /*****************************************
          寫數(shù)據(jù)
          對(duì)照K9F2G08UOA手冊(cè)第25頁
          ******************************************/
          void write_nand(char *buf, unsigned long addr, int size)
          {
          int i;
          unsigned int stat;

          //發(fā)80h串口數(shù)據(jù)輸入指令
          NFCMMD = 0x80;

          //發(fā)送兩次列地址,三次行地址
          send_addr(addr);

          //nandflash 數(shù)據(jù)準(zhǔn)備
          for(i = 0; i < (size); i++)
          {
          NFDATA = buf;
          }

          //發(fā)送10h寫指令
          NFCMMD = 0x10;

          //等待忙狀態(tài)
          while(!(NFSTAT & 0x1))
          ;

          // 發(fā)送70h讀狀態(tài)指令
          NFCMMD = 0x70;
          stat = NFDATA;

          //最后一位判斷成功與否
          if(stat & 0x1){
          printf("write nand flash device errn");
          return ;
          }
          printf("write nand flash device successn");
          }

          /****************************************************
          讀nand flash 0x500000 地址 10個(gè)字節(jié)
          主函數(shù):read.c
          ****************************************************/

          #define NFCONF *(volatile unsigned long *)0x4E000000
          #define NFCONT *(volatile unsigned long *)0x4E000004
          #define NFCMMD *(volatile unsigned long *)0x4E000008
          #define NFADDR *(volatile unsigned long *)0x4E00000C
          #define NFDATA *(volatile unsigned char *)0x4E000010
          #define NFSTAT *(volatile unsigned long *)0x4E000020


          void (*printf)(char *, ...) = 0x33f9291C;
          void read_nand(char *buf, unsigned long addr, int size);

          void _start(void)
          {
          char buf[11];


          //configure for nand flash controller
          NFCONF = (0x2 << 12) | (0x7 << 8) | (0x1 << 4);

          //control
          NFCONT = 1;

          //往0x500000讀數(shù)據(jù)
          read_nand(buf, 0x500000, 10);
          buf[11] = 0;

          printf("read from nandflash: %sn", buf);
          }

          //------發(fā)送地址參照K9F2G08UOA數(shù)據(jù)手冊(cè)第9頁--------
          void send_addr(unsigned long addr)
          {
          NFADDR = addr & 0xff;
          NFADDR = (addr >> 8) & 0x7;
          NFADDR = (addr >> 11) & 0xff;
          NFADDR = (addr >> 19) & 0xff;
          NFADDR = (addr >> 27) & 0x1;
          }

          /*****************************************
          讀數(shù)據(jù)
          對(duì)照K9F2G08UOA手冊(cè)第23頁
          ******************************************/
          void read_nand(char *buf, unsigned long addr, int size)
          {
          int i;

          NFCMMD = 0x00;

          send_addr(addr);

          NFCMMD = 0x30;

          while(!(NFSTAT & 0x1 ))
          ;

          //nandflash ready
          for(i = 0; i < (size); i++)
          {
          buf= NFDATA;
          }

          }


          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();