nandflash.c

来自「avr单片机访问nandflash的驱动」· C语言 代码 · 共 266 行

C
266
字号
#include "main.h"

/*void nand_byte_write(unsigned long addr,unsigned char data)
{  
   unsigned char stat;
   XMCRB=0x07;
   DDRC=0xff;
   PORTC=0x80;//片选
   PORTC=0x82;//命令
   nand_cmd=0x80;
   PORTC=0x81;//地址
   nand_addr=(unsigned char)addr;
   addr>>=8;
   nand_addr=(unsigned char)addr;
   addr>>=8;
   nand_addr=(unsigned char)addr;
   PORTC=0x80;
   nand_data=data;
   PORTC=0x82;
   nand_cmd=0x10;
   PORTC=0x80;
   while(1)
    {PORTC=0x82;
	nand_cmd=0x70;
	PORTC=0x80;
	stat=nand_data;
	if ((stat&0x40) &&  ~(stat&0x01)) break;
    }
   PORTC=0x00;
   XMCRB=0x00;  
}

unsigned char nand_byte_read(unsigned long addr)
{ 
     unsigned char stat,data,i;
	 XMCRB=0x07;
	 DDRC=0xff;
	 PORTC=0x80;
	 PORTC=0x82;//命令
	 nand_cmd=0x00; 
	 PORTC=0x81;//地址
	 nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
	 PORTC=0x80;
	// for(i=0;i<15;i++)
	 //{NOP();}
	  while(1)
    {PORTC=0x82;
	nand_cmd=0x70;
	PORTC=0x80;
	stat=nand_data;
	if (stat&0x40) break;
    }
	 PORTC=0x82;//命令
	 nand_cmd=0x00; 
	 PORTC=0x80;
	 data=nand_data;
	 PORTC=0x00;
	 XMCRB=0x00;
	 return data;
  
}

//////////////////////////////////////////////////////////////////////////
void nand_bytes_write(unsigned long addr,unsigned char *pdata,unsigned char len)
{  
   unsigned char stat,i;
   XMCRB=0x07;
   DDRC=0xff;
   PORTC=0x80;//片选
   PORTC=0x82;//命令
   nand_cmd=0x80;
   PORTC=0x81;//地址
   nand_addr=(unsigned char)addr;
   addr>>=8;
   nand_addr=(unsigned char)addr;
   addr>>=8;
   nand_addr=(unsigned char)addr;
   PORTC=0x80;
   nop();
   for(i=0;i<len;i++)
   {
     nand_data=pdata[i];
   }
   
   PORTC=0x82;
   nand_cmd=0x10;
   PORTC=0x80;
   while(1)
    {PORTC=0x82;
	nand_cmd=0x70;
	PORTC=0x80;
	stat=nand_data;
	if ((stat&0x40) &&  ~(stat&0x01)) break;
    }
   PORTC=0x00;
   XMCRB=0x00;  
}

void nand_bytes_read(unsigned long addr,unsigned char *pdata,unsigned char len)
{ 
     unsigned char stat,data,i;
	 XMCRB=0x07;
	 DDRC=0xff;
	 PORTC=0x80;
	 PORTC=0x82;//命令
	 nand_cmd=0x00; 
	 PORTC=0x81;//地址
	 nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
	 PORTC=0x80;
	// for(i=0;i<20;i++)
	// {NOP();}
	  while(1)
    {PORTC=0x82;
	nand_cmd=0x70;
	PORTC=0x80;
	stat=nand_data;
	if (stat&0x40) break;
    }
	 PORTC=0x82;//命令
	 nand_cmd=0x00; 
	 PORTC=0x80;
	 for(i=0;i<len;i++)
	 {
	   pdata[i]=nand_data;
	 }
	 PORTC=0x00;
	 XMCRB=0x00;
	
}

void nand_block_erase(unsigned int addr)
{    
     unsigned char stat;
     XMCRB=0x07;
	 DDRC=0xff;
	 PORTC=0x80;
	 PORTC=0x82;//命令
	 nand_cmd=0x60; 
	 PORTC=0x81;//地址
	 nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
	 PORTC=0x82;//命令
	 nand_cmd=0xd0;
	  PORTC=0x80;
    while(1)
    {PORTC=0x82;
	nand_cmd=0x70;
	PORTC=0x80;
	stat=nand_data;
	if (stat&0x40) break;
    }
	PORTC=0x00;
    XMCRB=0x00;  

}*/

unsigned char nand_char_read(unsigned long addr)
{ 
     unsigned char stat,data,i;
	 nand_cmd=0x00; 
	 nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
	  while(1)
    {
	nand_cmd=0x70;
	stat=nand_data;
	if (stat&0x40) break;
    }
	 nand_cmd=0x00; 
	 data=nand_data;
	 return data;
  
}

void nand_chars_read(unsigned long addr,unsigned char *pdata,unsigned char len)
{ 
     unsigned char stat,data,i;	
	 nand_cmd=0x00; 
	 nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
	  while(1)
    {
	nand_cmd=0x70;
	stat=nand_data;
	if (stat&0x40) break;
    }
	 nand_cmd=0x00; 
	 for(i=0;i<len;i++)
	 {
	   pdata[i]=nand_data;
	 }
}

void nand_char_write(unsigned long addr,unsigned char data)
{  
   unsigned char stat;
   nand_cmd=0x80;
   nand_addr=(unsigned char)addr;
   addr>>=8;
   nand_addr=(unsigned char)addr;
   addr>>=8;
   nand_addr=(unsigned char)addr;
   nand_data=data;
   nand_cmd=0x10;
   while(1)
    {
	nand_cmd=0x70;
	
	stat=nand_data;
	if ((stat&0x40) &&  ~(stat&0x01)) break;
    }
}

void nand_chars_write(unsigned long addr,unsigned char *pdata,unsigned char len)
{  
   unsigned char stat,i;
   nand_cmd=0x80;
   nand_addr=(unsigned char)addr;
   addr>>=8;
   nand_addr=(unsigned char)addr;
   addr>>=8;
   nand_addr=(unsigned char)addr;
   for(i=0;i<len;i++)
   {
     nand_data=pdata[i];
   }
   nand_cmd=0x10;
   while(1)
    {
	nand_cmd=0x70;
	stat=nand_data;
	if ((stat&0x40) &&  ~(stat&0x01)) break;
    }
}

void nand_block_erase(unsigned int addr)
{    
     unsigned char stat;
	 nand_cmd=0x60; 
	 nand_addr=(unsigned char)addr;
     addr>>=8;
     nand_addr=(unsigned char)addr;
	 nand_cmd=0xd0;
    while(1)
    {
	nand_cmd=0x70;
	stat=nand_data;
	if (stat&0x40) break;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?