阅读:1807回复:6
samsung flash 能写单个字节吗?
请问:samsung flash 能写单个字节吗?我看到资料上说要一页页地写,难到就不能分多次写一页,每次写一个字节吗?请高手赐教!
|
|
沙发#
发布于:2004-03-23 09:07
可以字节写,最多一次写一页
|
|
板凳#
发布于:2004-03-23 09:24
好像对于作U盘的NAND FLASH,每次只能写一页,不能按字节写!
|
|
|
地板#
发布于:2004-03-23 09:40
我糊涂了,楼上的两位意见不一致!我准备用K9F1208U
|
|
地下室#
发布于:2004-03-23 11:30
先向其发一字节的命令(好象是10H),一字节一字节地写是写入的NANDFLASH的内部的寄存器,然后向其发一字节的命令(好象是80H,这时FLASH就会将512个寄存器中的512字节写入存储CELL),
大概是这样的, 以下代码你试试看,对不对 //flash.c //SUNSANG NAND FLASH MEMORY 64M K9F1208U0M-YCB0读写子程序 #include <absacc.h> #include "regsnd1.h" #include "flash.h" xdata unsigned char nf_send_cmd _at_ NF_CMD_LATCH_ENABLE_ADD; /* Command */ xdata unsigned char nf_send_add _at_ NF_ADD_LATCH_ENABLE_ADD; /* Address */ xdata unsigned char volatile nf_data _at_ NF_ADDRESS_CMD_DATA; /* Data */ //void ReadPage(unsigned long page,char* buffer) //{ //} //void WritePage(unsigned long page,char* buffer) //{ //} //************************************ //* 读页函数 //参数:Page:将被读出的页号,dataBuf:缓冲区地址 //*0x7C00=0111,1100,0000,0000 //*0x7D00=0111,1101,0000,0000 //*0x7E00=0111,1110,0000,0000 // ---P2---- ---P0---- //根椐51单片机外扩存储器方式,给XBYTE[0x7C00]赋值实际上是给P0,P2赋值 //************************************* void Read_One_Page(unsigned long Page,unsigned char dataBuf[]) { unsigned int i; P2_7=0; //CE#=0(片选=0) //Command_Latch_Enabled; //CLE=1 P2_0=1; //CLE=1 XBYTE[nf_data]=(unsigned char)0x00; //read "A" area +"B" area +"C" area command //Command_Latch_Disabled; //CLE=0 //Address_Latch_Enabled; //ALE=1 P2_0=0; //CLE=0 P2_1=1; //ALE=1 //send address XBYTE[nf_data]=0; //写Column(从页开始处开始读) XBYTE[nf_data]=((unsigned char*)Page)[3]&0xff; //写ROW-LOW XBYTE[nf_data]=((unsigned char*)Page)[2]&0xff; //写ROW-LOW XBYTE[nf_data]=((unsigned char*)Page)[1]&0xff; //写ROW-HIGH //Address_Latch_Disabled; //ALE=0 P2_1=0; //ALE=0 while (!P5_3); //if RDY/B=0 wait (wait flash memory ready) //read data from flash memory for(i=0;i<PAGE_SIZE;i++) { dataBuf=XBYTE[nf_data]; } //end read flash data P2_7=1; //CE#=1(片选=1) } //************************************ //* 写页函数 //参数:Page:将被写入的页号,dataBuf:缓冲区地址 //*0x7C00=0111,1100,0000,0000 //*0x7D00=0111,1101,0000,0000 //*0x7E00=0111,1110,0000,0000 // ---P2---- ---P0---- //根椐51单片机外扩存储器方式,给XBYTE[0x7C00]赋值实际上是给P0,P2赋值 //************************************* bit Write_One_Page(unsigned long Page,unsigned char dataBuf[]) { unsigned int i; unsigned char State; P2_7=0; //CE#=0(片选=0) //Command_Latch_Enabled; //CLE=1 P2_0=1; //CLE=1 //XBYTE[nf_data]=0x50; // program "A" area XBYTE[nf_data]=0x00; XBYTE[nf_data]=0x80; //Command_Latch_Disabled; //CLE=0 P2_0=0; //CLE=0 //address //Address_Latch_Enabled; //ALE=1 P2_1=1; //ALE=1 XBYTE[nf_data]=(unsigned char)0; XBYTE[nf_data]=((unsigned char*)&Page)[3]&0xff; XBYTE[nf_data]=((unsigned char*)&Page)[2]&0xff; XBYTE[nf_data]=((unsigned char*)&Page)[1]&0xff; //Address_Latch_Disabled; //ALE=0 P2_1=0; //ALE=0 //write data for(i=0;i<PAGE_SIZE;i++) { XBYTE[nf_data]=dataBuf; } //here must add "{}" because IOregister_Write is defined //Command_Latch_Enabled; //CLE=1 P2_0=1; //CLE=1 //IOregister_Write(0x8000,0x10); //write page program command 0x10 XBYTE[nf_data]=0x10; while (!P5_3); //wait SMC not busy XBYTE[nf_data]=0x70; //write read status command 0x70 //Command_Latch_Disabled; //CLE=0 P2_0=0; //CLE=0 State= XBYTE[nf_data]; //read status //end write data while(!(State&0x40) && !P5_3);//I/O6=1 or RDY/B=1? P2_7=1; //CE#=1(片选=1) return (State & 0x01); } //************************************ //* 块擦除函数 //*参数:Block:将被擦除的块号 //*0x7C00=0111,1100,0000,0000 //*0x7D00=0111,1101,0000,0000 //*0x7E00=0111,1110,0000,0000 // ---P2---- ---P0---- //根椐51单片机外扩存储器方式,给XBYTE[0x7C00]赋值实际上是给P0,P2赋值 //************************************* bit Erase_One_Block(unsigned int Block) { unsigned char State; P2_7=0; //CE#=0(片选=0) //Command_Latch_Enabled; //CLE=1 P2_0=1;//CLE=1 //IOregister_Write(0x8000,0x60); //erase command=0x60 XBYTE[nf_data]=0x60;//erase command=0x60 //Command_Latch_Disabled; //CLE=0 P2_0=0;//CLE=0 //address //Address_Latch_Enabled; //ALE=1 P2_1=1;//ALE=1 //IOregister_Write(0x8000,(BYTE)(PSA&0xff)); //IOregister_Write(0x8000,(BYTE)((PSA>>8)&0xff)); XBYTE[nf_data]=(unsigned char)(Block&0xff); XBYTE[nf_data]=(unsigned char)((Block>>8)&0xff); //Address_Latch_Disabled; //ALE=0 P2_1=0;//ALE=0 //Command_Latch_Enabled; //CLE=1 P2_0=1;//CLE=1 //IOregister_Write(0x8000,0xd0); //erase command XBYTE[nf_data]=0xD0;//erase command //Command_Latch_Disabled; //CLE=0 P2_0=0;//CLE=0 //while(Ready==0); while(!P5_3); //Command_Latch_Enabled; //CLE=1 P2_0=1;//CLE=1 //IOregister_Write(0x8000,0x70); //read state XBYTE[nf_data]=0x70;////read state //Command_Latch_Disabled; //CLE=0 P2_0=0;//CLE=0 State=XBYTE[nf_data]; //status output while(!(State&0x40) && !P5_3);//I/O6=1 or RDY/B=1? P2_7=1; //CE#=1(片选=1) return (State & 0x01); } |
|
5楼#
发布于:2004-03-24 09:22
对于作U盘的NAND FLASH,每次只能写一页,不能按字节写!
对于AT29C512等FLASH,则只能按字节写,这是两种不同的FLASH 对于作U盘的NAND FLASH,正如liuzq所说及其程序所写. |
|
|
6楼#
发布于:2004-03-24 12:27
请问:samsung flash 能写单个字节吗?我看到资料上说要一页页地写,难到就不能分多次写一页,每次写一个字节吗?请高手赐教! nand flash是不能按字节写的,nor型的可以(Intel,amd等)。不过nand型的一页可以分成两次写,比如你第一次写256字节,第二次在写256字节。 |
|