Chinaunix首页 | 论坛 | 博客
  • 博客访问: 306341
  • 博文数量: 63
  • 博客积分: 1482
  • 博客等级: 上尉
  • 技术积分: 1185
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-12 19:06
个人简介

hello world!

文章分类

全部博文(63)

分类: LINUX

2011-04-07 16:50:07

    主要在继续在ARM9基础学习中的一文《3NAND Flash控制器--s3c2440》,

通过其认识要s3c2440中的Nand Flash控制器,并对Nand Flash结构及操作原理

有了一些基本的了解,但只实现要了从Nand Flash控制器以及参数设置,接下将

完善Nand Flash读写及删除等功能。

         过程先实现其最基本的nand_init()nand_reset()write_nand()read_nand()

erase_nand()等功能,并不涉及到K9F2G08UXA其它附加信息,如ECC校验码的相

关使用,然后再在此基础上将功能增加完全。

 

1、  nand_init()

设置NFCONFNFCONTNFSTAT寄存器相关可参考《3NAND Flash控制器--s3c2440

再复位nand flash。以下为一些宏设置。

  1. #define NF_MECC_UnLock()       {NFCONT&=~(1<<5);}
  2. #define NF_MECC_Lock()         {NFCONT|=(1<<5);}
  3. #define NF_CMD(cmd)            {NFCMD=cmd;}
  4. #define NF_ADDR(addr)          {NFADDR=addr;}
  5. #define NF_nFCE_L()            {NFCONT&=~(1<<1);}
  6. #define NF_nFCE_H()            {NFCONT|=(1<<1);}
  7. #define NF_RSTECC()            {NFCONT|=(1<<4);}
  8. #define NF_RDDATA8()           (NFDATA)
  9. #define NF_WAITRB()           {while(!(NFSTAT&(1<<1)));}
  10.                              //wait tWB and check F_RNB pin.
  11. // RnB Signal
  12. #define NF_CLEAR_RB()     {NFSTAT |= (1<<2);}    // Have write '1' to clear this bit.
  13. #define NF_DETECT_RB()     {while(!(NFSTAT&(1<<2)));}
  1. void nand_init(void) 初始化
  2. {
  3.     NFCONF = (TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4) | (0 << 0);
  4.     NFCONT =
  5.      (0 << 13) | (0 << 12) | (0 << 10) | (0 << 9) | (0 << 8) | (0 << 6) |
  6.      (0 << 5) | (1 << 4) | (1 << 1) | (1 << 0);
  7.     NFSTAT = 0;
  8.     nand_reset();
  9. }

 

2、  nand_reset() 芯片复位

  1. static inline void nand_reset(void)
  2. {
  3.     NF_nFCE_L();    //片选nand flash芯片

  4.     NF_CLEAR_RB();
  5.     NF_CMD(0xFF);        //reset command

  6.     NF_DETECT_RB();
  7.     NF_nFCE_H();    //disable nand flash chip select


  8. }

       

         3read_nand()  读数据

  1. void read_nand(char *buf, unsigned long addr, int size)
  2. {
  3.     int i;
  4.     nand_reset();
  5.     NF_nFCE_L();
  6.     NF_CLEAR_RB();
  7.     NFCMD = 0x00;
  8.     send_addr(addr);
  9.     NFCMD = 0x30;
  10.     while(!(NFSTAT & 0x1 ));
  11.     //nandflash ready

  12.     for(i = 0; i < (size); i++)
  13.     {
  14.         buf[i] = NFDATA;
  15.     }
  16.     NF_nFCE_H();
  17.    Uart_SendString("read nand flash device finish\r\n");    
  18. }

          4write_nand()  写数据

  1. void read_nand(char *buf, unsigned long addr, int size)
  2. {
  3.     int i;
  4.     nand_reset();
  5.     NF_nFCE_L();
  6.     NF_CLEAR_RB();
  7.     NFCMD = 0x00;
  8.     send_addr(addr);
  9.     NFCMD = 0x30;
  10.     while(!(NFSTAT & 0x1 ));
  11.     //nandflash ready

  12.     for(i = 0; i < (size); i++)
  13.     {
  14.         buf[i] = NFDATA;
  15.     }
  16.     NF_nFCE_H();
  17.    Uart_SendString("read nand flash device finish\r\n");    
  18. }

         5erase_nand()块擦删除

  1. void erase_nand(unsigned long addr)
  2. {
  3.     unsigned int stat;
  4.     nand_reset();
  5.     NF_nFCE_L();
  6.     //发送指令60h块擦除设置指令
  7.     NFCMD = 0x60;
  8.     //发送三次行地址
  9.     NFADDR = (addr >> 11) & 0xff;
  10.     NFADDR = (addr >> 19) & 0xff;
  11.     NFADDR = (addr >> 27) & 0x1;
  12.    //nandflash ready
  13.     //发送d0擦除指令
  14.     NFCMD = 0xd0;
  15.     //等待忙状态
  16.     while(!(NFSTAT & 0x1));
  17.     // 发送70h读状态指令
  18.     NFCMD = 0x70;
  19.     //读取数据
  20.     stat = NFDATA;
  21.    //最后一位判断成功与否
  22.     if(stat & 0x1){
  23.         Uart_SendString("erase nand flash device err\r\n");
  24.          NF_nFCE_H();
  25.         return ;
  26.     }
  27.     Uart_SendString("erase nand flash device succes\r\n");
  28.      NF_nFCE_H();
  29. }

            6Test_NAND_FLASH()测试以上函数

  1. void Test_NAND_FLASH()
  2. {
  3.     int i;
  4.     char buf[10];
  5.     NandInit();
  6.     for(i=0;i<10;i++)
  7.     {
  8.         buf[i] = 'd';
  9.     }
  10.     erase_nand(0x5000);
  11.     write_nand(buf,0x5000,10);
  12.     for(i=0;i<10;i++)
  13.     {
  14.         buf[i] = '0';
  15.     }
  16.     read_nand(buf,0x5000,10);
  17.     for(i=0;i<10;i++)
  18.     {
  19.         printf(" %c ",buf[i]);
  20.     }
  21.     Uart_SendString("\r\n");
  22.     erase_nand(0x5000);
  23.     read_nand(buf,0x5000,10);
  24.     for(i=0;i<10;i++)
  25.     {
  26.         printf(" %c ",buf[i]);
  27.     }    
  28.    return ;
  29. }

7、测试结果

下载至Nand Flash起始处运行即可

 all_ts.rar   

阅读(1615) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~