📄 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 + -