flash

  NAND FLASH相对于NOR FLASH而言,其容量大,价格低廉,读写速度都比较快,因而得到广泛应用。NOR FLASH的特点是XIP,可直接执行应用程序,

14MB时应用具有很高的成本效益。但是其写入和擦除的速度很低直接影响了其性能。

 

    NAND FLASH不能直接执行程序,用于存储数据。在嵌入式ARM应用中,存储在其中的数据通常是读取到SDROM中执行。因为NAND FLASH主要接口包括

几个I/O口,对其中的数据都是串行访问,无法实现随机访问,故而没有执行程序。

 

    NAND FLASH接口电路是通过NAND FLAH控制器与ARM处理器相接的,许多ARM处理器都提供NAND FLASH控制器,为使用NAND FLASH带来巨大方便。

    K9F2G08U0B是三星公司的一款NAND FLASH产品。

 

    K9F2G08U0B包含8I/OVssVcc、以及控制端口(CLEALECEREWEWPR/B)。其存储结构分块。

    2K 块

    每块大小16 页

    每页大小2K + 64BYTE

    即容量=块数×页数×每页大小=2K×16×(2K + 64BYTE=256M BYTE + 8M BYTE

   

    NAND FLASH控制器提供了OM[1:0]NCONGPG13GPG14GPG155个信号来选择NAND FLASH启动。

    OM[1:0]=0b00时,选择从NAND FLASH启动。

    NCONNAND FLASH类型选择信号。

    GPG13NAND FLASH页容量选择信号。

    GPG14NAND FLASH地址周期选择信号。

    GPG15:NAND FLASH接口线宽选择。08bit总线宽度;116bit总线宽度。

   

    访问NAND FLASH

   

    1)发生命令:读、写、还是擦除

    2)发生地址:选择哪一页进行上述操作

    3)发生数据:需要检测NAND FLASH内部忙状态

   

    NAND FLASH支持的命令:

        #define CMD_READ1 0x00   //页读命令周期1

        #define CMD_READ2 0x30   //页读命令周期2

        #define CMD_READID 0x90  //ID 命令

        #define CMD_WRITE1 0x80  //页写命令周期1

        #define CMD_WRITE2 0x10  //页写命令周期2

        #define CMD_ERASE1 0x60  //块擦除命令周期1

        #define CMD_ERASE2 0xd0  //块擦除命令周期2

        #define CMD_STATUS 0x70  //读状态命令

        #define CMD_RESET 0xff   //复位

        #define CMD_RANDOMREAD1 0x05 //随意读命令周期1

        #define CMD_RANDOMREAD2 0xE0 //随意读命令周期2

        #define CMD_RANDOMWRITE 0x85 //随意写命令

       

    NAND FLASHNAND FLASH控制器硬件连接好了,需要配置GPACONNAND FLASH

    1)配置GPACON

    GPA17~GPA22设置为NAND FLASH控制器信号(即NAND FLASH的控制信号)。rGPBCON |= (0x3F<<17);

   

    2)配置NAND FLASH

    主要是初始化寄存器NFCONF中的TACLSTWRPH0TWRPH1这三个位。

    TACLS:表征了CLE/ALE锁存信号优秀奥到写使能这段时间,= HCLK时钟周期 × TACLS

    TWRPH0:表征了写使能的持续时间。 = HCLK时钟周期 × (TWRPH0 + 1

    TWRPH1:表征了写无效到锁存无效之间的时间。 = HCLK时钟周期 × (TWRPH1 + 1

    TACLSTWRPH0TWRPH1的值由NAND FLASH手册中的tCLS-tWPtWPtCLH确定。

   

    初始化NAND FLASH

    1)寄存器NFCONT,用于开启NAND FLASH控制器;

    2)向寄存器NFCMD写入命令;

    3)向寄存器NFADDR写入地址;

    4)使用寄存器NFDATA进行数据的读写,在此期间需要不断的检测寄存器NFSTAT来获知NAND FLASH的状态(忙/闲);

   

    NAND FLASH

    1)发送页写入命令0x80

    2)发送页地址;

    3)发送要写入的数据;

    4)发送写入确定命令0x10

    5)检测忙信号;

   

    NAND FLASH

    1)发送页读取命令0x00

    2)发送页地址;

    3)发送页读取确认命令0x30

    4)检测忙信号;

    5)从ARM处理器寄存器NFDATA中读取数据。

   

    为什么读写读需要两次命令呢?

    接收到第一个命令时数据先被写入到NAND FLASH的数据寄存器(Data regirester & S/A)里,接收到第二个命令后数据才写到对应的存储单元中。

    接收到第一个读命令时先进行读读操作开始,接收到第二个读命令时数据从内部存储单元中复制到NAND FLASH的数据寄存器(Data regirester & S/A)里。

   

    擦除NAND FLASH

    1)块擦除命令0x60

    2)发送块地址;

    3)块擦除确认命令0xD0

    4)检测忙信号。

   

    杨国文

    201257日 150315

 

 

void NF_Init(void)
{
    rGPACON &= ~(0x3F<<17);//配置为NAND FLASH控制器
    rGPACON |= (0x3F<<17);
   
    rNFCONF = ((TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4));//设置时序参数
    rNFCONT = ((0<<12)|(1<<0));//关闭加密,使能NAND FLASH控制器
   
   
   
    rNFSTAT = 0;//有关状态位清零
    NF_Reset();   
}

注意:
rNFCONT |= ((0<<12)|(1<<0));//这样写的话是一定不能实现向nandflash写入数据的!


今天下午因为没有仔细阅读数据手册,而误以为加密位的初始状态为0而使用或操作,造成不能正确读写nandflash。调试了一下午,才发现问题了。擦,原来就这么点问题!

内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值