阅读:7675回复:39
100分请教u盘flash闪存读写问题!
正在做u盘,对三星flash读写操作遇到困惑,不知谁做过u盘的,能否给处读写子程序?(100分)
|
|
最新喜欢:chinak... |
沙发#
发布于:2003-07-09 18:02
flash芯片是KM29W32000AT
|
|
板凳#
发布于:2003-07-09 18:04
有k9f28系列的flash闪存读写子程序也可以,照样给分!
|
|
地板#
发布于: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 写也类似啊! |
|
地下室#
发布于: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; } |
|
5楼#
发布于:2003-07-10 18:34
#define KM29WDATA XBYTE[0x8000]
|
|
6楼#
发布于:2003-07-10 22:34
NewTech:
如果你能帮我实现flash读写功能,我愿意奉上100分! |
|
7楼#
发布于:2003-07-11 01:11
你主要遇到的问题是什么呢!
|
|
8楼#
发布于:2003-07-11 10:58
我觉得你的硬件线路有错!把你得图纸发给我!
|
|
9楼#
发布于:2003-07-11 15:09
你好!
我这有固件对FLASH的读写程序源代码,C51的,AVR C语言的都有,并且都也测试过了! 我们可以交流! 电话: 021-38953681-25 何先生 EAIL: hework@hotmail.com hework@tom.com |
|
|
10楼#
发布于:2003-07-11 17:42
你好! 可否公布出来呢!主要是如何管理flash的逻辑和物理块的部分! |
|
11楼#
发布于:2003-07-11 18:38
NewTech:
这个就是电路原理图,我公布出来。 大家看看吧! |
|
|
12楼#
发布于:2003-07-11 18:39
NewTech:
如果硬件有问题,怎么能正确读出ID呢? |
|
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 |
|
14楼#
发布于:2003-07-11 18:47
flyhemcu:
能否将你的子程序及相关硬件电路贴出来,参考一下。 或是发到我邮箱:chenjp1998@163.com |
|
15楼#
发布于:2003-07-12 01:43
这很简单的!你按照那个固定的格式返回数据就行了!
另外我很奇怪,为什么一开始就会收到clear feature呢,你的收发是否有问题啊! |
|
16楼#
发布于:2003-07-12 13:10
我也不知道啊,这算枚举成功吗?
怎么没有Set Address? |
|
17楼#
发布于:2003-07-12 13:12
你还是先帮我看看那个flash读写问题吧
|
|
18楼#
发布于:2003-07-14 11:11
你的电路的确有错!你应该用一个io pin控制/CS,将/wr、/rd与A15、A14合成后的/ce相或在去控制flash的/wr、/rd!
|
|
19楼#
发布于:2003-07-14 11:12
你的电路的确有错!你应该用一个io pin控制/CS,将/wr、/rd与A15、A14合成后的/ce相或再分别去控制flash的/wr、/rd!
|
|
上一页
下一页