⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nandflash.c

📁 avr单片机访问nandflash的驱动
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -