zoukankan      html  css  js  c++  java
  • 10.NandFlash的驱动_写操作

    10.NandFlash的驱动_写操作

    上一节,学习了NandFlash的按页读的操作,下面是实现NandFlash的按页写。首先还是查看NandFlash芯片K9F2G08U0A的时序图

    根据I/O pin角的信号信息,知道要实现NandFlash的写操作需要的步骤如下:

    最后实现按页写的函数:

    int NF_WritePage(unsigned long addr, unsigned char* buff)

    {

        int ret;

        int i;

        

        //选中flash芯片

        select_chip();

        

        //清除RnB

        clear_RnB();

        

        //发送命令0x80

        send_cmd(0x80);

        

        //发送列地址

        send_addr(0x00);

        send_addr(0x00);

        

        //发送行地址

        send_addr(addr&0xff);

        send_addr((addr>>8)&0xff);

        send_addr((addr>>16)&0xff);

        

        //写入数据

        for(i=0;i<2048;i++)

        {

         NFDATA = buff[i];     

        }

        

        //发送命令0x10

        send_cmd(0x10);

        

        //等待RnB

        wait_RnB();

        

        //发送命令0x70

        send_cmd(0x70);

        

        //读取写入结果

        ret = NFDATA;

        

        //取消选中flash芯片

        deselect_chip();

        

        return ret;    

    }

    编译make一下,没有错误的情况下,还不能烧写到开发板,因为不管是norflash或者是NandFlash,在进行写之前必须进行擦除。接下来就是实现擦除函数:

    void NF_Erase(unsigned long addr)

    该函数有一个参数,就是页地址。

    接下来看NandFlash芯片K9F2G08U0A擦除的信息:

    注意的是,在擦除的时候,不会按照页擦除的,而是把该页所在的整块全部擦除。

    根据上面擦除的时序图,擦除函数的实现步骤:

    void NF_Erase(unsigned long addr)

    {

        int ret;

          

    //选中flash芯片

        select_chip();

        

        //清除RnB

        clear_RnB();

        

        //发送命令0x60

        send_cmd(0x60);

        

        //发送行地址

        send_addr(addr&0xff);

        send_addr((addr>>8)&0xff);

        send_addr((addr>>16)&0xff);

        

        //发送命令D0

        send_cmd(0xD0);

        

        //等待RnB

        wait_RnB();

        

        //发送命令0x70

        send_cmd(0x70);

        

        //读取擦除结果

        ret = NFDATA;

        

        //取消选中flash芯片

        deselect_chip();

        

        return ret;

        

    }

    最后在main.c里面添加测试代码:

    上面的测试代码中,先定义一个页大小的char buffer。然后格式化一个块大小的空间。接着将123写入NandFlash,接着通过NF_PageRead函数把刚才写入的值读出。最后通过点灯判断读出的是不是刚才写入的数字。来验证对NandFlash的写操作是否成功:成功就是没加NandFlash的操作代码,烧写到开发板,灯亮。加上上面的代码后烧写到开发板,灯不亮。

  • 相关阅读:
    flex space-between最后一行对齐问题的解决方案
    如何在父级下访问v-slot的值——vuejs
    flex下省略号的问题解决
    Typescript使用字符串联合类型代替枚举类型
    flex三个对齐属性的记忆方式
    JS中的slice()和splice()的区别以及记忆方式
    JS中的call,apply和bind及记忆方式
    Vue 还是 React 还是 Angular ?
    利用ES6的Promise.all实现至少请求多长时间
    .net core <environment> 不起作用
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188811.html
Copyright © 2011-2022 走看看