cncs
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2007-01-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1807回复:6

samsung flash 能写单个字节吗?

楼主#
更多 发布于:2004-03-23 08:41
请问:samsung flash 能写单个字节吗?我看到资料上说要一页页地写,难到就不能分多次写一页,每次写一个字节吗?请高手赐教!
lxb_gd
驱动太牛
驱动太牛
  • 注册日期2002-01-16
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72408分
  • 威望362391点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-03-23 09:07
可以字节写,最多一次写一页
dragon_hn
驱动中牛
驱动中牛
  • 注册日期2002-05-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分297分
  • 威望40点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-23 09:24
好像对于作U盘的NAND FLASH,每次只能写一页,不能按字节写!
www.dragon-2008.com 欢迎交流
cncs
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2007-01-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-23 09:40
我糊涂了,楼上的两位意见不一致!我准备用K9F1208U
liuzq
驱动小牛
驱动小牛
  • 注册日期2003-05-25
  • 最后登录2004-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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);
}



dragon_hn
驱动中牛
驱动中牛
  • 注册日期2002-05-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分297分
  • 威望40点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-24 09:22
对于作U盘的NAND FLASH,每次只能写一页,不能按字节写!
对于AT29C512等FLASH,则只能按字节写,这是两种不同的FLASH
对于作U盘的NAND FLASH,正如liuzq所说及其程序所写.
www.dragon-2008.com 欢迎交流
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-24 12:27
请问:samsung flash 能写单个字节吗?我看到资料上说要一页页地写,难到就不能分多次写一页,每次写一个字节吗?请高手赐教!

nand flash是不能按字节写的,nor型的可以(Intel,amd等)。不过nand型的一页可以分成两次写,比如你第一次写256字节,第二次在写256字节。
游客

返回顶部