在线问答
直播中

h1654155865.6393

10年用户 301经验值
擅长:可编程逻辑 测量仪表 嵌入式技术 模拟技术 处理器/DSP 控制/MCU
私信 关注

【OK210试用体验】裸机篇 -- Nand Flash 读写

【OK210试用体验】裸机篇 -- Nand Flash 读写


      本帖来学习对Nand Flash的读写等操作。S5PV210中的Nand Flash 控制器的详细资料可以看 S5PV210_UM_REV1.1 中的 sections 05_memory NAND FLASH CONTROLLER。在OK210中,采用的Nand Flash芯片是 MT29F8G08ABABA。详细的芯片datasheet 在飞凌官方光盘资料的 OK210 V1.1硬件资料Datasheet 目录下可以找到。



S5PV210中的NAND FLASH CONTROLLER



      S5PV210的NAND Flash控制器有如下特点:

                1) 支持512byte,2k,4k,8k的页大小

                2) 通过各种软件模式来进行NAND Flash的读写擦除等
                3) 8bit的总线
                4) 支持SLC和MCL的NAND Flash
                5) 支持1/4/8/12/16bit的ECC
                6) 支持以字节/半字/字为单位访问数据/ECC寄存器,以字为单位访问其他寄存器。

        S5PV210的Nand Flash 控制器模块框架图: 1.png
        相应的I/O描述: 3.png


MT29F8G08ABABA

OK210开发板板载的Nand Flash芯片MT29F8G08ABABA为8 G bit。
             ·  Organization
                       – Page size x8: 4320 bytes (4096 + 224 bytes)
                       – Block size: 128 pages (512K +28 K bytes)
                       – Plane size: 2 planes x 1024 blocks per plane
                       – Device size: 8Gb: 2048 blocks 6.png


        通过核心板原理图可以知道芯片接线: 2.jpg


         通过芯片datasheet可以知道对芯片进行各种操作的command: 4.png 5.png
   
           在对异步和同步的操作过程中的电平配置: 7.png 8.png


程序编写思路

          这次的程序还是要沿用之前配置好的,新加入对Nand Flash寄存器的配置函数nandFlash_init,start.S:
  1. .global _start
  2. _start :
  3.         bl clock_init
  4.         bl uart_init
  5.         bl nandFlash_init
  6.         bl main

  7. halt :
  8.         b halt


         Nand Flash控制器的配置的思路:
                 1. 设置NFCONF和NFCONT两个寄存器
                 2. 配置引脚,配置NAND Flash相关功能
                 3. 复位
         
         配置NAND FLASH的寄存器前,当然是要进行寄存器地址宏定义啦。
  1. #define        NFCONF  (*(volatile unsigned int *)0xB0E00000)
  2. #define        NFCONT  (*(volatile unsigned int *)0xB0E00004)        
  3. #define        NFCMMD  (*(volatile unsigned int *)0xB0E00008)
  4. #define        NFADDR  (*(volatile unsigned int *)0xB0E0000C)
  5. #define        NFDATA  (*(volatile unsigned char *)0xB0E00010)
  6. #define        NFSTAT  (*(volatile unsigned int *)0xB0E00028)

  7. // 对应引脚映射地址定义
  8. #define MP0_1CON  (*(volatile unsigned int *)0xE02002E0)
  9. #define        MP0_3CON  (*(volatile unsigned int *)0xE0200320)
  10. #define        MP0_6CON  (*(volatile unsigned int *)0xE0200380)
       Nand Flash芯片的分块定义:
  1. // Array Organization per Logical Unit (LUN)
  2. #define PAGE_SIZE 4320
  3. #define BLOCK_SIZE (PAGE_SIZE * 128)
  4. #define PLANE_SIZE (BLOCK_SIZE * 102)
  5. #define LUN_SIZE (PLANE_SIZE * 2)
         部分命令宏定义:
  1. // Command Definitions
  2. #define NF_CMD_RESET 0xFF
  3. #define NF_CMD_READ_ID 0x90
  4. #define NF_CMD_READ_PAR_PAGE 0xEC
  5. #define NF_CMD_READ_UNIQUE_ID 0xED
  6. #define NF_CMD_READ_STATUS 0x70
  7. #define NF_CMD_READ_PAGE_1st 0x00
  8. #define NF_CMD_READ_PAGE_2nd 0x30
  9. #define NF_CMD_COPYBACK_READ_1st 0x00
  10. #define NF_CMD_COPYBACK_READ_2nd 0x35
  11. #define NF_CMD_PROGRAM_PAGE_1st 0x80
  12. #define NF_CMD_PROGRAM_PAGE_2nd 0x10
  13. #define NF_CMD_CHANGE_READ_COLUMN_1st 0x05
  14. #define NF_CMD_CHANGE_READ_COLUMN_2nd 0xE0
  15. #define NF_CMD_ERASE_BLOCK_1st 0x10
  16. #define NF_CMD_ERASE_BLOCK_2nd 0xD0

  17. #define BUSY                         (1 << 0)       
  18. #define ECC_EN                         (1 << 4)
  19. #define CHIP_SELECTED        (~(1 << 1))        
  20. #define CHIP_DESELECTED        (1 << 1)
  21. #define CONTROL_EN                (1 << 0)
      Nand Flash寄存器配置:
  1. NFCONF =        (0x1 << 23) | (0x3 << 12) | (0x2 << 8) | (0x1 << 4) | (0x0 <<                  3) | (0x0 << 2) | (0x1 << 1);


      在main函数中,先读取芯片的ID,然后在一个块中写入数据,再读取出来并且打印到PC上。


实验现象

烧写程序到SD卡中,并且用SD卡启动后,可以通过SecureCRT看到: 9.png 芯片的ID信息。 10.jpg
         在指定的地址擦除数据,然后写入2048 Byte 数据,再读出并且输出都 PC 上。

更多回帖

发帖
×
20
完善资料,
赚取积分