JZ2440 NAND

设置好时序参数后,发送命令直接写NFCCMD,发送地址直接写NFADDR,写数据直接写NFDATA,读数据直接读NFDATA,控制器会发出相应的时序波形,从而控制NAND FLASH。

Ø  初始化

void nand_init(void)

{

#define  TACLS  0

#define  TWRPH0 1

#define  TWRPH1 0

         /*设置NAND FLASH的时序*/

         NFCONF = (TACLS<<12) |(TWRPH0<<8) | (TWRPH1<<4);

         /*使能NAND FLASH控制器,初始化ECC,禁止片选*/

         NFCONT = (1<<4) | (1<<1) |(1<<0);

}

Ø  ID

片选->发送命令0x90->发送地址0x00->读五次->取消片选

Ø  读数据

注:2112 = 2048 + 64,2048为某一页page的数据,64位OOB

void nand_read(unsigned int addr, unsigned char *buf, unsigned int len)

{

         int i = 0;

         int page = addr / 2048;

         int col = addr & (2048 - 1);

         nand_select();

         while (i < len)

         {

                   /* 发出00h命令 */

                   nand_cmd(00);

                   /* 发出地址 */

                   /* col addr */

                   nand_addr_byte(col &0xff);

                   nand_addr_byte((col>>8)& 0xff);

                   /* row/page addr */

                   nand_addr_byte(page &0xff);

                   nand_addr_byte((page>>8)& 0xff);

                   nand_addr_byte((page>>16)& 0xff);

                   /* 发出30h命令 */

                   nand_cmd(0x30);

                   /* 等待就绪 */

                   wait_ready();

                   /* 读数据 */

                   for (; (col < 2048)&& (i < len); col++)

                   {

                            buf[i++] =nand_data();                     

                   }

                   if (i == len)

                            break;

                   col = 0;

                   page++;

         }

         nand_deselect();   

}

此实验中,bin文件烧写到nandflash,从nand启动,上电后使用nand_read函数将程序从nand读到sdram,然后跳到sdram执行代码。如果程序执行正确,则nand_read函数正确。编译程序时需要把nand文件靠前,保证在前4k内容中包含nand函数。

int isBootFromNorFlash(void)

{

         volatile unsigned int *p = (volatileunsigned int *)0;

         unsigned int val = *p;

         *p = 0x12345678;

         if (*p == 0x12345678)

         {

                   /* 写成功, 对应nand启动 */

                   *p = val;

                   return 0;

         }

         else

         {

                   return 1;

         }

}

void copy2sdram(void)

{

         /* 要从lds文件中获得__code_start, __bss_start

          * 然后从0地址把数据复制到__code_start

          */

         extern int __code_start, __bss_start;

         volatile unsigned int *dest = (volatileunsigned int *)&__code_start;

         volatile unsigned int *end = (volatileunsigned int *)&__bss_start;

         volatile unsigned int *src = (volatileunsigned int *)0;

         int len;

         len = ((int)&__bss_start) -((int)&__code_start);

         if (isBootFromNorFlash())

         {

                   while (dest < end)

                   {

                            *dest++ = *src++;

                   }

         }

         else

         {

                   nand_init();

                   nand_read(src, dest, len);

         }

}

Ø  烧写与擦除

int nand_erase(unsigned int addr, unsigned int len)

{

         int page = addr / 2048;

         if (addr & (0x1FFFF))

         {

                   printf("nand_erase err,addr is not block align\n\r");

                   return -1;

         }

         if (len & (0x1FFFF))

         {

                   printf("nand_erase err,len is not block align\n\r");

                   return -1;

         }

         nand_select();

         while (1)

         {

                   page = addr / 2048;

                   nand_cmd(0x60);

                   /* row/page addr */

                   nand_addr_byte(page &0xff);

                   nand_addr_byte((page>>8)& 0xff);

                   nand_addr_byte((page>>16)& 0xff);

                   nand_cmd(0xD0);

                   wait_ready();

                   len -= (128*1024);

                   if (len == 0)

                            break;

                   addr += (128*1024);

         }

         nand_deselect();   

         return 0;

}

void nand_write(unsigned int addr, unsigned char *buf, unsigned int len)

{

         int page = addr / 2048;

         int col = addr & (2048 - 1);

         int i = 0;

         nand_select();

         while (1)

         {

                   nand_cmd(0x80);

                   /* 发出地址 */

                   /* col addr */

                   nand_addr_byte(col &0xff);

                   nand_addr_byte((col>>8)& 0xff);

                   /* row/page addr */

                   nand_addr_byte(page &0xff);

                   nand_addr_byte((page>>8)& 0xff);

                   nand_addr_byte((page>>16)& 0xff);

                   /* 发出数据 */

                   for (; (col < 2048)&& (i < len); )

                   {

                            nand_w_data(buf[i++]);

                   }

                   nand_cmd(0x10);

                   wait_ready();

                   if (i == len)

                            break;

                   else

                   {

                            /* 开始下一个循环page*/

                            col = 0;

                            page++;

                   }

         }

         nand_deselect();   

}

• 电源电压 - 1.65V ~ 1.95V - 2.70V ~ 3.60V • 组织结构 - 存储单元阵列: (256M + 8M) x 8bit - 数据寄存器: (2K + 64) x 8bit • 自动的编程(写入)和擦除 - 页编程: (2K + 64)Byte - 块擦除: (128K + 4K)Byte • 页读取操作 - 页面大小 : (2K + 64)Byte - 随机读取 : 25µs(最大.) - 串行访问 : 25ns(最小.) (*K9F2G08R0A: tRC = 42ns(最小)) • 快速编程周期时间 - 页编程时间: 200µs(典型值) - 块擦除时间: 1.5ms(典型值) • 命令/地址/数据复用I/O端口 • 硬件数据保护 • - 编程/擦除在电源转换分离 可靠的CMOS浮栅技术 -耐力: 100K编程/擦除周期(有1bit/512Byte ECC) 数据保存时间: 10 年 • 命令式操作 • 带有1bit/528Byte EDC的智能Copy-Back编程 • 唯一的ID版权保护 • 封装 - K9F2G08R0A-JCB0/JIB0 : 无铅封装 63 - Ball FBGA I (10 x 13 / 0.8 mm 间距) - K9F2G08U0A-PCB0/PIB0 : 无铅封装 48 - Pin TSOP I (12 x 20 / 0.5 mm 间距) - K9F2G08U0A-ICB0/IIB0 52 - Pin ULGA (12 x 17 / 1.00 mm 间距) 本文档提供的为256Mx8bit的版本,K9F2G08X0A是2G-bit大小的NAND Flash存储器,带有64Mbit额外数据区(OOB区、冗余区)。此 NAND存储颗粒为固态存储市场应用提供了最具成本效益的解决方案。编程(写入)操作可以在200µs(典型值)对大小为(2K+64)Byte的页 进行写入,擦除操作可以在1.5ms(典型值)擦除大小为(128K+4K)的块。读取数据寄存器的数据周期时间为25ns(1.8v设备为42ns) 每字 节。I/O端口可以作为地址和数据输入/输出,也可以作为命令输入。芯片上的写控制器自动完成所有的编程和擦除功能包括脉冲重复、 并内部核查和数据余量(如有需要)。即使是写入操作频繁的系统,也可以通过K9F2G08X0A采用实时映射算法的ECC(错误纠正码)来加 强多达的100K编程/擦除周期的可靠性,K9F2G08X0A是一个用于大型非易失性存储应用的最佳解决方案,例如固态文件存储和其他用 于非易失性要求的便携式存储应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值