貌似nand flash 擦除失败,求解!
时间:10-02
整理:3721RD
点击:
裸机跑nand flash.可以在原本为FF的地方写入,读出。但再次往相同地方写入时就写不正确,只有原来为‘1’的bit改写成功。例如原本写入了0xef(1110 1111),可以改为0xab(1010 1011),要改为0xcd(1100 1101)就失败了,变成了0x89(1000 1001);求大神解答!
芯片是s5pv210,K9K8G08U0B
程序如下: 自己写的裸机程序,下面的是nand flash 部分。
#define u32 volatile unsigned long
//-->For nand flash register address
#define MP0_3con *((u32*)0xe0200320)
#define MP0_1con *((u32*)0xe02002e0)
#define NFCONF *((u32*)0xb0e00000)
#define NFCONT *((u32*)0xb0e00004)
#define NFCMD *((u32*)0xb0e00008)
#define NFDATA *((volatile unsigned char*)0xb0e00010)
#define NFADDR *((u32*)0xb0e0000c)
#define NFSTAT *((u32*)0xb0e00028)
//--<For nand flash register address
#define tacls 4
#define twrph0 3
#define twrph1 2
#define NF_en_on NFCONT &= ~(1<<1) //enable nand flash chip select
#define NF_en_off NFCONT |= (1<<1) //disable nand flash chip select
//---->For uart put char&str
#define UTRSTAT0 *((volatile unsigned long*)0xE2900010)
#define UTXH0 *((volatile unsigned long*)0xE2900020)
void put_char(char c)
{
while(!(UTRSTAT0 & (1 << 1))) ; //绛夊緟涓插彛缂撳瓨绌洪棽
if((UTRSTAT0 & (1<<1))==(1<<1)) //濡傛灉绌洪棽锛屽垯杩涘叆瀛楃鎵撳嵃
{
while(!(UTRSTAT0 & (1 << 1))) ;//绛夊緟绌洪棽
UTXH0 = c; //鍚戠紦瀛樺彂閫佸瓧绗? while(!(UTRSTAT0 & (1 << 1))) ;//绛夊緟绌洪棽
}
}
void put_str(char *p)
{
int i;
for(i=0;*(p+i);i++) //濡傛灉*(p+i)涓嶆槸'\0'锛屽垯鎵撳嵃瀛楃
{
put_char(p[i]);
}
}
//----<For uart put char&str
void put_hex(u32 reg,char b)
{
int i ;
char c;
for(i=b-1;i>=0;i--)
{
c=(reg>>(4*i))&0xf;
if(c<10)
{c +=0x30; put_char(c);}
else
{c +=0x37; put_char(c);}
}
put_str("\t");
}
void NF_init()
{
MP0_3con &= ~0xfffff;
MP0_3con |= 0x22222; //GPIO澶嶇敤锛岄
芯片是s5pv210,K9K8G08U0B
程序如下: 自己写的裸机程序,下面的是nand flash 部分。
#define u32 volatile unsigned long
//-->For nand flash register address
#define MP0_3con *((u32*)0xe0200320)
#define MP0_1con *((u32*)0xe02002e0)
#define NFCONF *((u32*)0xb0e00000)
#define NFCONT *((u32*)0xb0e00004)
#define NFCMD *((u32*)0xb0e00008)
#define NFDATA *((volatile unsigned char*)0xb0e00010)
#define NFADDR *((u32*)0xb0e0000c)
#define NFSTAT *((u32*)0xb0e00028)
//--<For nand flash register address
#define tacls 4
#define twrph0 3
#define twrph1 2
#define NF_en_on NFCONT &= ~(1<<1) //enable nand flash chip select
#define NF_en_off NFCONT |= (1<<1) //disable nand flash chip select
//---->For uart put char&str
#define UTRSTAT0 *((volatile unsigned long*)0xE2900010)
#define UTXH0 *((volatile unsigned long*)0xE2900020)
void put_char(char c)
{
while(!(UTRSTAT0 & (1 << 1))) ; //绛夊緟涓插彛缂撳瓨绌洪棽
if((UTRSTAT0 & (1<<1))==(1<<1)) //濡傛灉绌洪棽锛屽垯杩涘叆瀛楃鎵撳嵃
{
while(!(UTRSTAT0 & (1 << 1))) ;//绛夊緟绌洪棽
UTXH0 = c; //鍚戠紦瀛樺彂閫佸瓧绗? while(!(UTRSTAT0 & (1 << 1))) ;//绛夊緟绌洪棽
}
}
void put_str(char *p)
{
int i;
for(i=0;*(p+i);i++) //濡傛灉*(p+i)涓嶆槸'\0'锛屽垯鎵撳嵃瀛楃
{
put_char(p[i]);
}
}
//----<For uart put char&str
void put_hex(u32 reg,char b)
{
int i ;
char c;
for(i=b-1;i>=0;i--)
{
c=(reg>>(4*i))&0xf;
if(c<10)
{c +=0x30; put_char(c);}
else
{c +=0x37; put_char(c);}
}
put_str("\t");
}
void NF_init()
{
MP0_3con &= ~0xfffff;
MP0_3con |= 0x22222; //GPIO澶嶇敤锛岄