qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4928回复:29

SL811HS控制的U盘读写

楼主#
更多 发布于:2002-11-22 16:07
   U盘的枚举过程已经通过,DESCRIPTION中EP1为输入,EP2为输出,现对EP2循环发INQUIRY或READ10命令,第一次有ACK,以后只有端口挂起返回,或紧接着对EP1发读指令,只有NACK返回。
   请教各位大虾,怎么玩。

最新喜欢:

gx004gx004 ww7002ww7002
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-23 16:44
你在Firmware中有对INQUIRY或READ10命令进行处理吗?或者说收到INQUIRY或READ10命令,你有没有清掉Busy位?另外你说的挂起是什么意思?Stall or Suspend?读EP1返回nak,应该是EP1里面没有放数据或ByteCount没有置上。

再说的详细一点,否则帮不上忙
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-25 08:20
  我用的是89C52来控制811HS,811HS作为HOST,通过EP2发出INQUIRY或READ10命令后,我认为应当由U盘在EP2上来回ACK,然后HOST再通过EP1读取数据。
  我现在碰到的情况是:
     (1)如果我循环通过EP2发出INQUIRY或READ10命令,不做其他的操作,只有第一次U盘在EP2上来回ACK,然后只回NACK。
     (2)如果紧接着INQUIRY或READ10命令后通过EP1读取数据,得到的信号(PID)是通道挂起。
   以上的PID等命令是通过逻辑分析仪按码子读出的。现在不知道是我对时序理解的不对还是命令发的不对,请各位再次指点。
   对楼上的答复表示感谢。
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-25 15:59
    再次说明我现在碰到的情况:
    811HS作为HOST已经对U盘通过枚举过程,可以读到U盘的EP1为输出,EP2为输入,均为BULK方式,设置U盘地址为1。
    (1)此后我通过EP2发出INQUIRY或READ10命令,U盘回ACK;
      数据为:SOF+0x87+1#地址+2#通道
                 +0xc3+0x12+0x00+0x00+0x00+0x24+0x00
                 +0x4b(ACK)
           注:0x12+0x00+0x00+0x00+0x24+0x00为INQUIRY命令
      (2)然后(自认为,不知对不对)通过EP2读取相应的数据(针对INQUIRY或READ10),此时U盘回NACK。
     数据为:SOF+0x96+1#地址+1#通道
                 +0x5a(NACK)
    如果我重复上述过程,第二部分现象不变,第一部分的(ACK)变成了0x78(STALL)。
    现在不知道是我对时序理解的不对还是命令发的不对,请各位斑竹、大侠、XDJM帮忙看看。
   谢谢joyup的指点。
    通过查阅得知xueli_cheng已经完成此项任务,请提供支援。

 
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-26 08:43
  怎么只有我一个人提问,无人应答?
  请高手们点拨.不胜感谢!
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-26 12:01
   再次说明我现在碰到的情况:
......
      数据为:SOF+0x87+1#地址+2#通道
                 +0xc3+0x12+0x00+0x00+0x00+0x24+0x00
                 +0x4b(ACK)
           注:0x12+0x00+0x00+0x00+0x24+0x00为INQUIRY命令
......


兄弟,我理解你发的包是这样的吧
c3 12 00 00 00 24 00
但是,U盘的协议是USB MASS STORAGE类的,需要按照USB MASS STORAGE类BULK ONLY的协议进行通讯。你可以参考USB.ORG里面USB MASS STORAGE类BULK ONLY的详细协议。

正确的发送INQUIRY命令应该是
55 53 43 42 XX XX XX XX XX XX XX XX XX XX XX 12
00 00 00 24 00 00 00 XX XX XX XX XX XX XX XX

XX的值是变化的,有一些是没有用的,具体可参考BULK ONLY协议,建议你在PC上抓一下U盘和PC的通讯过程就明白了。另外,你发的C3是什么意思?

希望能帮到你,欢迎交流。
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-26 12:07
   再次说明我现在碰到的情况:
    ......
    如果我重复上述过程,第二部分现象不变,第一部分的(ACK)变成了0x78(STALL)。
    ......


    变成0x78(STALL),是因为U盘没有收到正确的CBW包,所以它把EP2 STALL掉了,当你再次访问的时候,当然就只能收到STALL包了。这时应该发送CLEAR FEATURE的标准请求到EP0,清掉EP2的SATLL状态,然后再重新发送、通讯.
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-26 13:14
  joyup老兄:
  \"C3\"为PID,DATA0
  我是用的\"BUS HOUND\"抓的PC与U盘通讯的码子,INQUIRY命令只有6个字节,我就照样发了.
  我再看一看你所提到的协议.谢谢.
  在线的话,请多提建议.
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-26 13:27
不会的,如果你的U盘不是特殊的,应该都是采用BulkOnly的协议的。
另外,你把该U盘枚举阶段configuration和interface相关数据贴一下,大家看一下
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-26 13:44
  joyup老兄:
  DEVICE DESCRIPTOR:
  12 01 10 01 00 00 00 40 A0 0E 03 68 00 01 01 02 03 01
  Configuration Descriptors:
  09 02 27 00 01 01 00 80 32 09 04 00 00 03 08 06 50 00 07 05 81 02 40 00 00 07 05 02 02 40 00 00 07 05 83 03 02 00 01
  请帮忙看看!谢谢!
jsnjsss
驱动牛犊
驱动牛犊
  • 注册日期2002-10-06
  • 最后登录2003-07-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-26 14:35
直接找斑竹吧,其他也没几个人懂得,高手不多啊! :(
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-26 14:59

  我好象忽略了CBW,CSW?
  现正在看资料,争取改正.其他地方也请大家指正,共同提高.

  欢迎JSNJSSS进入交流.
  
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-26 16:22
   头痛!!!
   有谁有CBW,CSW的范例,麻烦提供以下,以救人于水火.
  
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-26 18:11
例如:Inquiry命令

HOST:
  out pid(ep2)
  data0/1:
  55 53 43 42 XX XX XX XX XX XX XX XX XX XX XX 12
  00 00 00 24 00 00 00 XX XX XX XX XX XX XX XX (cbw包)
Device
  ack
HOST:
  in pid(ep1)
Device
  data0/1:
  00 80 00 01 01 XX XX XX XX ......(一共0x24个字节,有可能少)
HOST:
  ack
HOST:
  in pid(ep1)
Device
  data1/0:
  55 53 43 53 XX XX XX XX 00 00 00 00 00(csw包,00,成功;01/02,失败)

简单的过程就是这样,详细的还要看资料
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-27 09:04
   谢谢楼上的老兄!
   INQUIRY命令已经调通,
   返回数据为:
00 80 02 02 1F 00 00 00 4F 54 69 20 20 20 20 20 55 6C 74 72 61 20 46 6C 6F 70 70 79 20 20 20 20 31 2E 31 31
   CSW:55 53 42 53 00 00 00 00 00 00 00 00 00
   但好象只能进行一次INQUIRY命令,第二次U盘回NACK.
   现正在调试,先调个READ(10)再说.
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-27 09:51
   MD!
   加了几行字,52不行了.
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-27 13:33
  READ(10)命令也通过,但怎么循环不行.
  有经验的老兄指点以下.
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-27 15:48
你是如何循环的?
qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-27 16:24
  1、发CBW
  2、读数据
  3、读CSW
  重复1、2、3。
  现在发现直接用WRITE(10)或WRITE BUFFER 命令直接写BUF不行,情况是将上面过程中的第二步直接换成写数据,当然CBW中相应标志位也改变了方向。最后发现读CSW时U盘回NACK,数据也没有写进去。是不是写BUF还需要什么其他的步骤。
  特请教。谢谢!

qianyu123
驱动小牛
驱动小牛
  • 注册日期2002-11-22
  • 最后登录2007-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-28 08:12
   JOYUP 老兄请再看看。
上一页
游客

返回顶部