实验目的:突破4KB的Steppingstone存储空间限制,读取NandFlash中4KB后的代码实现“点灯大法”,借此掌握NandFlash的操作。

实验环境及说明:恒颐S3C2410开发板H2410。H2410核心板的NandFlash选用的是三星片上(SOP)K9F1208U0M,该NandFlash容量为64MB。

实验思路:开发板上电启动后,自动将NandFlash开始的4K数据复制到SRAM中,然后跳转到0地址开始执行。然后初始化存储控制器SDRAM,调用NandFlash读函数操作把4KB后的点灯代码复制到SDRAM中,跳到点灯代码的入口点实现点灯操作。

知识掌握:NandFlash内部结构、命令字及存储控制器
一、NandFlash内部结构
不同开发板使用的NandFlash的型号可能不一样,本文只是以K9F1208U0M为例做个简单介绍。引脚描述如下所示:
//设置TACLS、TWRPH0、TWRPH1三者的值,貌似ViVi等代码中TWRPH0设为3,不知这样的好处,知道的可以告诉我!

#define TACLS   0
#define TWRPH0  2
#define TWRPH1  0
/* 初始化NandFlash */
void nand_init(void)
{
    /* 使能NandFlash控制器, 初始化ECC, 禁止片选, 设置时序 */
    s3c2410nand->NFCONF = (1<<15)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);
    /* 复位s3c2410 NandFlash */
    s3c2410_nand_reset();
}

#define NAND_SECTOR_SIZE    512
#define NAND_BLOCK_MASK     (NAND_SECTOR_SIZE - 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 ;    /* 地址或长度不对齐 */
    }
    /* 选中芯片 */
    s3c2410_nand_select_chip();
    for(i=start_addr; i < (start_addr + size);) {
      /* 发出READ0命令 */
      s3c2410_write_cmd(0);
      /* 写地址*/
      s3c2410_write_addr(i);
      /*等待*/
      s3c2410_wait_idle();
      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
          *buf = s3c2410_read_data();
          buf++;
      }
    }
    /* 取消片选信号 */
    s3c2410_nand_deselect_chip();
    
    return ;
};



相关文章:

  • 2022-02-18
  • 2022-12-23
  • 2022-02-27
  • 2022-12-23
  • 2021-11-06
  • 2021-10-13
  • 2022-12-23
猜你喜欢
  • 2022-01-31
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案