阅读:2026回复:18
sl811作主机控制U盘的读写一问???
我枚举已经通过。其中枚举过程是这样的,getdevicediscreptor,然后设置地址为1,而后再通过地址得到设备描述表,然后再得到config描述表,interface描述表,endpoint描述表,再setconfig。
而后我就下cbw SCSI INQIRY指令,值如下数组:{0x55,0x53,0x42,0x43,0x68,0x6e,0x60,0x24,0x00,0x00,0x00,0x80,0x00,0x06,0x12,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},但是结果返回的是超时,并没有ACK。 不知何故!那位大侠帮帮忙!!! :) |
|
最新喜欢:![]() |
沙发#
发布于:2003-03-25 10:28
^_^,我已经解决这个问题了。原来如此
|
|
板凳#
发布于:2003-03-25 10:49
zyyz1100你好:
你做的sl811-host是用51控制吗? |
|
地板#
发布于:2003-03-25 10:57
我正在做sl811+51+U盘读写.能不能给点关于硬件方面的建议?
我是用DMA好?还是地址+数据好? |
|
地下室#
发布于:2003-03-25 12:09
敬请指教:
我也是在用SL811, 但是第一步获取他的描述付还没有通过: 我是先发出一个SETUP包,再发一个IN包,就是没有数据返回来。 我发完IN 包以后读取的16个寄存器状态如下: 20 10 00 00 00 05 a0 87 20 c0 08 00 08 91 21 66 读取它的BUFFER都是我初始化后的0, 请不论指教! |
|
5楼#
发布于:2003-03-25 13:02
GET DEVICE desciptor SETUP:0X80 0X06 0X0001 0X0000 0X1200
|
|
6楼#
发布于:2003-03-25 15:24
请问:
你用的函数都是cypress-host例子里的吗? |
|
7楼#
发布于:2003-03-25 16:41
不完全了,不过参看了一下那个程序。但我是在32位机上实现这种功能。你可以自己写一个这样的程序。
你最好能用最原始的办法,就是初始化积存器,送数据包,在取得试验结果。这样可检查出比较多的问题了^_^ 祝你好运了! |
|
8楼#
发布于:2003-03-26 09:07
谢谢!
|
|
9楼#
发布于:2003-03-26 10:54
//我用的也是SL811发送的setup 请求包也没有收到ACK,还有就是一直超时.
你是怎么解决的? |
|
10楼#
发布于:2003-03-26 11:21
超时的问题终于解决了,现在出现的是ACK, 和DATA1!
但是它的DATA0 和1之间是怎样计算的,在那里可以设置? |
|
11楼#
发布于:2003-03-27 02:02
你有个问题想跟你请教一下
我检测了一下一个u盘的格式化过程,它的容量是32兆,FAT16格式,FAT共有3f个扇区,由于每次写操作都不是写一个完整的block,那么应该采用怎样的算法来对FLASH进行写操作!你是怎样做的呢! |
|
12楼#
发布于:2003-03-27 19:18
我已经可以从优盘读取device,configuration的descriptor, 现在我正在设置设备的地址,设置完以后读取它的返回信息都没有错误, 但是用新的地址来获取device descriptor 就出现STALL and ACK, 那位大峡碰到过这样的错误? 能不能给我点提示? |
|
13楼#
发布于:2003-03-28 09:14
应该是你的地址值超出了范围,或者你得到device descr时用的地址值与呢设置的地址值不匹配
|
|
14楼#
发布于:2003-03-28 10:08
谢谢你的提示,刚刚通过了。
|
|
15楼#
发布于:2003-03-29 11:07
再请问:
如果在碰到发送数据以后,设备提示还有更多的数据, 你是怎样处理的? 我读取寄存器2 3 4时候的数据分别是: 0x12 0x09 0x0a 他提示还有0x0a个数据没有接收,应该怎样处理好呢? 我直接发回一个OUT的空包,ENDPOINT就处于STALL, 如果再发一个in 的包,提示要读取0x0a的数据,endpoint就处于超时状态。 以上是在读取设备的descriptor 时候碰到的 |
|
16楼#
发布于:2003-03-29 11:41
可以开一个适当大小的buffer,然后连续读数据,直到数据读完。如果buffer满时,把其丢到其他地方,从而再继续传,其中要注意data0/1的切换。
不过按理说不会出现这种状况,因为U盘device descr的长度只有39个byte(一般情况最多),default pipe的传输长度为64byte应该可以一次读出的。 ^_^ |
|
17楼#
发布于:2003-03-30 16:05
这个方法我已经试过,但是还是不行
|
|
18楼#
发布于:2003-12-11 06:25
我枚举已经通过。其中枚举过程是这样的,getdevicediscreptor,然后设置地址为1,而后再通过地址得到设备描述表,然后再得到config描述表,interface描述表,endpoint描述表,再setconfig。
而后我就下cbw SCSI INQIRY指令,值如下数组:{0x55,0x53,0x42,0x43,0x68,0x6e,0x60,0x24,0x00,0x00,0x00,0x80,0x00,0x06,0x12,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},但是结果返回的是超时,并没有ACK。 不知何故!那位大侠帮帮忙!!! //---------------------------------------------------- 我也有和您相同的情况发生,请问您是如何解决这个问题的? 我使用SL811HS控制USB disk 程序代码如下: code unsigned char commandtable[]={0x55,0x53,0x42,0x43,0x77,0x88,0x77,0x88,0,0,0,0,0,0,0x0c}; void addUFIcommand(unsigned char lengthl,lengthh,direction) { unsigned char i; for(i=0x10;i<0x1f;i++) wrotg(i,commandtable[i-0x10]); wrotg(0x18,lengthl); wrotg(0x19,lengthh); wrotg(0x1c,direction); } void addUFICBWCB(unsigned char v1f,v21,v22,v23,v24,v27) { unsigned char i; for(i=0x1f;i<0x2f;i++) wrotg(i,0); wrotg(0x1f,v1f); wrotg(0x21,v21); wrotg(0x22,v22); wrotg(0x23,v23); wrotg(0x24,v24); wrotg(0x27,v27); } addUFIcommand(0,0,0); addUFICBWCB(0,0,0,0,0,1); for(aaa=0x10;aaa<0x2f;aaa++) { rdotg(aaa); trdata(otgdata); delay(3000); } // 显示OUT command endpoint=2; outpackage(0x10,0x1f,deviceaddr,data0); trdata(otgdata); // sl811hs return ACK delay(3000); trdata(otgdata); delay(3000); trdata(otgdata); delay(3000); // delay(100); endpoint=1; inpackage(0x60,0x0d,deviceaddr,data0); trdata(otgdata); // sl811hs return NAK--------不知道该如何解决 delay(3000); trdata(otgdata); delay(3000); trdata(otgdata); delay(3000); 请问各位先进,这可能是哪边出问题??小弟感激不尽…… |
|
|