chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:7675回复:39

100分请教u盘flash闪存读写问题!

楼主#
更多 发布于:2003-07-09 18:01
正在做u盘,对三星flash读写操作遇到困惑,不知谁做过u盘的,能否给处读写子程序?(100分)

最新喜欢:

chinakangchinak...
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-09 18:02
flash芯片是KM29W32000AT
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-09 18:04
有k9f28系列的flash闪存读写子程序也可以,照样给分!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-09 18:45
这很简单啊!
Read:
cs = 0
cle = 1
data = cmd read (0x00)
wr = 0
wr = 1
cle = 0
ale = 1
data = addr2
wr = 0
wr = 1
data = addr1
wr = 0
wr = 1
data = addr0
wr = 0
wr = 1
ale = 0
re = 0
get data
re = 1
.
.
.
cs = 1

写也类似啊!

chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-10 18:33
首先感谢NewTech的热情帮助!
你用的是I/O口方式,而我是总线接口方式,即89c52的/WR、/RD接Flash的/WR、/RD,片选信号/CE是由A15、/A14(P2.7,/P2.6)经过与非门产生,即A15=1、A14=0是可选中该芯片。故地址为10** **** **** ****B,假设为0x8000。CLE=P1.1,ALE=P1.2

sbit SM_RDY=0x90;(P1.0)
sbit SM_CMD=0x91;(P1.1)
sbit SM_ADDR=0x92;(P1.2)
sbit SM_CS1=0xa7;(P2.7)
sbit SM_CS2=0xa6;(P2.6)
sbit SM_WR=0xb6;(P3.6)
sbit SM_RD=0xb7;(P3.7)

void Flash_Reset()
{
     int i;
     SM_CMD=1;
     KM29WDATA=0xff;
     SM_CMD=0;
     for(i=0;i<3000;i++);
}

void Check_Flash_Id()
{
     int i;
     SM_CMD=1;
     KM29WDATA=0x90;
     SM_CMD=0;
     SM_ADDR=1;
     KM29WDATA=0;
     SM_ADDR=0;
     for(i=0;i<10;i++);
     Maker_Id=KM29WDATA;
     Device_Id=KM29WDATA;
}



int Erase_Cluster(unsigned int cluster)
{
    int i;
    blockpage=(cluster<<4);
    
    SM_CMD=1;
    KM29WDATA=0x60;
    SM_CMD=0;
    
    SM_ADDR=1;    
    KM29WDATA=blockpage & 0xff;  
    KM29WDATA=(blockpage>>8) & 0xff;
    SM_ADDR=0;

    SM_CMD=1;
    KM29WDATA=0xd0;
    SM_CMD=0;

    while(SM_RDY==0);
            
    SM_CMD=1;
    KM29WDATA=0x70;
    SM_CMD=0;
    
    status=KM29WDATA;
    if(status==0xc0)
    return 1;
    else
    return 0;
}

void ReadPage(unsigned int block,unsigned int page,unsigned char xdata *pPage)
{  
     int i;
     blockpage=(block<<4)+page;/* !=block<<4+page */
     SM_CMD=1;
     KM29WDATA=0x00;
     SM_CMD=0;
    
     SM_ADDR=1;
     KM29WDATA=0;
     KM29WDATA=blockpage & 0xff;/* && */
     KM29WDATA=(blockpage>>8) & 0xff;
     SM_ADDR=0;
    
     while(SM_RDY==0);
     for(i=0;i<2000;i++);
     for(i=0;i<528;i++) *(pPage+i)=KM29WDATA;
}

/*int VerifyPage(unsigned int block,unsigned int page,unsigned char xdata *Write_Buf)
{  

    ReadPage(block,page,Read_Buf);
    if(strcmp(Read_Buf,Write_Buf)==0)
    return 1;
    else
    return 0;
}*/

int WritePage(unsigned int block,unsigned int page,unsigned char xdata *pPage)
{
    int i;
    blockpage=(block<<4)+page;/* !=block<<4+page*/
    
    SM_CMD=1;
    KM29WDATA=0x80;
    SM_CMD=0;
    
    SM_ADDR=1;
    KM29WDATA=0;
    KM29WDATA=blockpage & 0xff;/* && */
    KM29WDATA=(blockpage>>8) & 0xff;
    SM_ADDR=0;
    
    for(i=0;i<528;i++)
    KM29WDATA=*(pPage+i);
    
    SM_CMD=1;
    KM29WDATA=0x10;
    SM_CMD=0;
    
    while(SM_RDY==0);
    
    SM_CMD=1;
    KM29WDATA=0x70;
    SM_CMD=0;
    
    status=KM29WDATA;
    if(status==0xc0)
    return 1;
    else
    return 0;/*VerifyPage(block,page,pPage);*/
  
}


以上函数只有Check_Flash_Id()能成功读取Flash的ID为0xECE3(KM29W32000AT的ID),其他函数均不成功,为何?
下面是模仿你的I/O方式的子程序,结果连ID都不出来,帮我看看吧!!!
void Check_Flash_Id()
{
int i;

SM_CS1=1;
SM_CS2=0;

SM_CMD=1;
P0=0x90;
SM_WR=0;
SM_WR=1;
SM_CMD=0;

SM_ADDR=1;
P0=0;
SM_WR=0;
SM_WR=1;
SM_ADDR=0;

for(i=0;i<50;i++);

SM_RD=0;
Maker_Id=P0;
SM_RD=1;
SM_RD=0;
Device_Id=P0;
SM_RD=1;

SM_CS1=1;
SM_CS2=1;
}

chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-10 18:34
#define KM29WDATA XBYTE[0x8000]
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-10 22:34
NewTech:
  如果你能帮我实现flash读写功能,我愿意奉上100分!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-11 01:11
你主要遇到的问题是什么呢!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-11 10:58
我觉得你的硬件线路有错!把你得图纸发给我!
flyhemcu
驱动牛犊
驱动牛犊
  • 注册日期2003-06-12
  • 最后登录2003-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-11 15:09
你好!
   我这有固件对FLASH的读写程序源代码,C51的,AVR C语言的都有,并且都也测试过了!
   我们可以交流!
    电话: 021-38953681-25
           何先生
    EAIL: hework@hotmail.com
          hework@tom.com
flyhemcu
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-11 17:42
你好!
   我这有固件对FLASH的读写程序源代码,C51的,AVR C语言的都有,并且都也测试过了!
   我们可以交流!
    电话: 021-38953681-25
           何先生
    EAIL: hework@hotmail.com
          hework@tom.com


可否公布出来呢!主要是如何管理flash的逻辑和物理块的部分!
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-11 18:38
NewTech:
这个就是电路原理图,我公布出来。
大家看看吧!
附件名称/大小 下载次数 最后更新
2003-07-11_U_Disk.Sch (32KB)  13
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-07-11 18:39
NewTech:
   如果硬件有问题,怎么能正确读出ID呢?
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-07-11 18:43
NewTech:
   这是我在枚举时用bus bound所截获的数据,系统已经发现硬件usb mass storage于是发来一个CBW-inquiry,该怎么返回呢,是36个字节的数据吧!


 10  CTL    80 06 00 01 - 00 00 12 00  GET DESCRIPTR    0us         1.1.0        
 10  DI     12 01 00 01 - 00 00 00 10  ........       4.9ms         1.2.0        
            71 04 66 06 - 00 01 00 00  q.f.....                     1.2.8        
            00 01                      ..                           1.2.16      
 10  CTL    80 06 00 02 - 00 00 09 00  GET DESCRIPTR   19us         2.1.0        
 10  DI     09 02 20 00 - 01 01 00 a0  .. .....       3.9ms         2.2.0        
            32                         2                            2.2.8        
 10  CTL    80 06 00 02 - 00 00 20 00  GET DESCRIPTR   21us         3.1.0        
 10  DI     09 02 20 00 - 01 01 00 a0  .. .....       4.9ms         3.2.0        
            32 09 04 00 - 00 04 08 06  2.......                     3.2.8        
            50 00 07 05 - 82 02 40 00  P.....@.                     3.2.16      
            00 07 05 02 - 02 40 00 00  .....@..                     3.2.24      
 10  CTL    00 09 01 00 - 00 00 00 00  SET CONFIG      11us         4.1.0        
 10  CTL    01 0b 00 00 - 00 00 00 00  SET INTERFACE   38ms         5.1.0        
 10  CTL    a1 fe 00 00 - 00 00 01 00  CLASS           35ms         6.1.0        
 10  USTS   04 00 00 c0                pid stalled    2.6ms         6.2.0        
 10  CTL    02 01 00 00 - 00 00 00 00  CLEAR FEATURE   11us         7.1.0        
 10  CTL    a1 fe 00 00 - 00 00 01 00  CLASS          2.9ms         8.1.0        
 10  USTS   04 00 00 c0                pid stalled    2.9ms         8.2.0        
 10  CTL    02 01 00 00 - 00 00 00 00  CLEAR FEATURE    8us         9.1.0        
 10  CTL    a1 fe 00 00 - 00 00 01 00  CLASS          3.0ms        10.1.0        
 10  USTS   04 00 00 c0                pid stalled    2.9ms        10.2.0        
 10  CTL    02 01 00 00 - 00 00 00 00  CLEAR FEATURE   12us        11.1.0        
 10  DO     55 53 42 43 - 90 2c 11 81  USBC.,..       4.9ms        12.1.0        
            24 00 00 00 - 80 00 06 12  $.......                    12.1.8        
            00 00 00 24 - 00 00 00 00  ...$....                    12.1.16      
            00 00 00 00 - 00 00 00     .......                     12.1.24      
 10  USTS   00 00 01 c0                canceled        19sc        13.1.0        
 10  DO     55 53 42 43 - 90 2c 11 81  USBC.,..       187ms        14.1.0        
            24 00 00 00 - 80 00 06 12  $.......                    14.1.8        
            00 00 00 24 - 00 00 00 00  ...$....                    14.1.16      
            00 00 00 00 - 00 00 00     .......                     14.1.24
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-07-11 18:47
flyhemcu:
    能否将你的子程序及相关硬件电路贴出来,参考一下。
或是发到我邮箱:chenjp1998@163.com
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-07-12 01:43
这很简单的!你按照那个固定的格式返回数据就行了!

另外我很奇怪,为什么一开始就会收到clear feature呢,你的收发是否有问题啊!
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-07-12 13:10
我也不知道啊,这算枚举成功吗?
怎么没有Set Address?
chenjp
驱动小牛
驱动小牛
  • 注册日期2003-03-11
  • 最后登录2009-05-05
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-07-12 13:12
你还是先帮我看看那个flash读写问题吧
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-07-14 11:11
你的电路的确有错!你应该用一个io pin控制/CS,将/wr、/rd与A15、A14合成后的/ce相或在去控制flash的/wr、/rd!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-07-14 11:12
你的电路的确有错!你应该用一个io pin控制/CS,将/wr、/rd与A15、A14合成后的/ce相或再分别去控制flash的/wr、/rd!
上一页
游客

返回顶部