• [国嵌攻略][054][NandFlash驱动设计_写]


    Nand Flash支持按页写和随机写两种方式,在下面实现的是按页写。闪存在写数据时,只能写入1,不能写入0,所以写函数必须和擦除函数一起使用,并且擦除函数是按块擦除。

    /********************************************************************
    *名称:write_page_flash
    *参数:
    *	page   页号
    *	buf    写缓存,2048字节
    *返回:
    *	state  成功:0
    *	       失败:1
    *功能:按页写闪存
    *********************************************************************/
    int write_page_flash(unsigned long page, unsigned char *buf){
    	int i;   //循环计数器
    	int state;   //写入状态,0表示成功,1表示失败
    
    	//选中闪存芯片
    	NFCONT &= ~(1<<1);   //设置Reg_nCE:0
    	
    	//清除忙信号
    	NFSTAT |= (1<<2);    //设置RnB_TransDetect:0
    
    	//发送写命令(0x80)
    	NFCMMD = 0x80;
    	
    	//发送列地址(页内偏移)
    	NFADDR = 0x00;   //Col.Add1,按页写忽略页内偏移
    	NFADDR = 0x00;   //Col.Add2
    	
    	//发送行地址(页号)
    	NFADDR = (page>>0)&0xFF;    //Row.Add1
    	NFADDR = (page>>8)&0xFF;    //Row.Add2
    	NFADDR = (page>>16)&0xFF;   //Row.Add3
    	
    	//写入数据
    	for(i = 0; i < PAGE_SIZE; i++){
    		NFDATA = buf[i];   //注意,NFDATA寄存器数据类型要和buf匹配,一个写周期写入一个字节
    	}
    	
    	//发送写命令(0x10)
    	NFCMMD = 0x10;
    	
    	//等待忙信号
    	while( !(NFSTAT&(1<<2)) );   //当RnB_TransDetect等于1时,结束循环
    	
    	//发送读状态命令(0x70)
    	NFCMMD = 0x70;
    	
    	//读取状态
    	state = NFDATA&0x00000001;   //取出数据端口I/O的0位,否则返回随机值
    	
    	//释放闪存芯片
    	NFCONT |= 1<<1;   //设置Reg_nCE:1
    	
    	return state;
    }
    
    /********************************************************************
    *名称:erase_block_flash
    *参数:
    *	page   页号
    *返回:
    *	state  成功:0
    *	       失败:1
    *功能:按块擦除闪存。提供页的地址,擦除所在的块。
    *********************************************************************/
    int erase_block_flash(unsigned long page){
    	int state;   //写入状态,0表示成功,1表示失败
    	
    	//选中闪存芯片
    	NFCONT &= ~(1<<1);   //设置Reg_nCE:0
    	
    	//清除忙信号
    	NFSTAT |= (1<<2);    //设置RnB_TransDetect:0
    
    	//发送擦除命令(0x60)
    	NFCMMD = 0x60;
    	
    	//发送行地址(页号)
    	NFADDR = (page>>0)&0xFF;    //Row.Add1
    	NFADDR = (page>>8)&0xFF;    //Row.Add2
    	NFADDR = (page>>16)&0xFF;   //Row.Add3
    	
    	//发送擦除命令(0xD0)
    	NFCMMD = 0xD0;
    	
    	//等待忙信号
    	while( !(NFSTAT&(1<<2)) );   //当RnB_TransDetect等于1时,结束循环
    	
    	//发送读状态命令(0x70)
    	NFCMMD = 0x70;
    	
    	//读取状态
    	state = NFDATA&0x00000001;   //取出数据端口I/O的0位,否则返回随机值
    	
    	//释放闪存芯片
    	NFCONT |= 1<<1;   //设置Reg_nCE:1
    
    	return state;
    }
    
  • 相关阅读:
    zzuli2470: 迷宫
    zzuli2460: 楼上真的是签到题
    zzuli2460: 楼上真的是签到题
    洛谷P1044 :栈(卡特兰数)
    洛谷P1044 :栈(卡特兰数)
    洛谷P1056:排座椅(贪心)
    代码块地址
    tabBarItem动画
    vim Podfile
    webView进度条
  • 原文地址:https://www.cnblogs.com/d442130165/p/4961134.html
Copyright © 2020-2023  润新知