eifire
驱动牛犊
驱动牛犊
  • 注册日期2003-06-10
  • 最后登录2005-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1791回复:10

求教jinghuiren,metalwing等大侠

楼主#
更多 发布于:2004-09-22 10:06
我使用SL811做Host进行U盘的读写
1。SetAddress的数据包形式是下面两个中的哪一个?
  1)0x80,5,1,0,0,0,0,0
    2)0x80,5,0,1,0,0,0,0
2。我发送SetAddress之后,在EP0STATUS中读到的是ACK,但再用地址1,进行读取设备描述符等操作,得到的结果是Timeout,我用上面两个数据包试验的结果一样。但接着用地址0仍可读取设备描述符,why?
3。用地址0向U盘发送SCSI命令流程:
 1)向OUT端点发送命令数据包(以INQUIRY(12)为例):
0x55,0x53,0x42,0x43,0x11,0x22,0x33,0x44,0x24,0,0,0,0x80,0,6,0x12,0,0,0,0x24,0,0,0,0,0,0,0,0,0,0,0
  在EP0STATUS读到的是ACK
 2)向地址0发送IN令牌,要求读取0x24字节的数据,这时EP0STATUS读到的结果总是NAK,why?
hongjuanguodong
驱动牛犊
驱动牛犊
  • 注册日期2004-04-27
  • 最后登录2004-10-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-27 09:10
你用所设置的设备地址进行SetConfig成功了吗?
如果成功的话,就可以开始批量传输了。
如果是Bulk-In的话,Cypress提供的usbXfer程序不用修改就可完成任务。
对于Bulk-Out,可以参照Bulk-In进行修改。
批量传输的流程:(以Bulk-In为例)
 发送CBW,
 发送PID-IN,读取数据
 发送PID-IN,读CSW。

 

谢谢eifire兄
我写的是设备端的程序,setconfig成功了,用提供的应用程序可以控制led灯。setconfig完就停止了,主机不发送命令了,我现在怀疑上位机驱动里没有自动发送批量传输命令的功能:(,我用的驱动是周立功的D12TEST.SYS
eifire
驱动牛犊
驱动牛犊
  • 注册日期2003-06-10
  • 最后登录2005-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-24 16:51
你用所设置的设备地址进行SetConfig成功了吗?
如果成功的话,就可以开始批量传输了。
如果是Bulk-In的话,Cypress提供的usbXfer程序不用修改就可完成任务。
对于Bulk-Out,可以参照Bulk-In进行修改。
批量传输的流程:(以Bulk-In为例)
 发送CBW,
 发送PID-IN,读取数据
 发送PID-IN,读CSW。

hongjuanguodong
驱动牛犊
驱动牛犊
  • 注册日期2004-04-27
  • 最后登录2004-10-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-24 16:43
eifire兄,请问你枚举完成后是怎么开始批量传输的,我在set config后就停止了
我的QQ:59996522  可以在QQ上交流一下吗,谢谢
eifire
驱动牛犊
驱动牛犊
  • 注册日期2003-06-10
  • 最后登录2005-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-24 10:59
因为计算机出了故障,一直到现在才恢复上网功能。
首先感谢各位大侠的帮助。
正像metalwing所说的那样,我的设置地址状态没有完成。后来又仔细看了sl811的datasheet,在发送完SETUP数据包后,如果是无数据控制传输,还要发一个长度为0的pid-in令牌,而这一步的工作以前没有做,结果导致出错。我设置了U盘的地址为2,现在已实现了对其的读写功能。
从8月25日接到这个项目,开始查资料,USB的各种规范、通讯协议,以及文件系统的各种资料。到9月15号开始进入软件编写、调试,一直到今天,实现了对U盘的读写,首先感谢的就是驱动网的各位网友,在这儿解决了我很多的疑问。
向提供无私帮助的人致敬!并向你们学习!
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-22 19:32
设备的枚举过程有3个状态:
1.默认状态(DEFAULT);
2.地址状态(ADDRESSED);
3.配置状态(CONFIG);
在默认状态时,你的设备的地址为00H,这是通用的.当HOST给你分配了
地址,并且你写入寄存器后,设备进入地址状态.这时,HOST通过分配给
你的地址与你的设备打交道.然后,当你对你的设备进行配置后就进入
了配置状态.在这些过程完成后,枚举完成.
从你说的现象看,我想可能是你的地址分配没完成,即没有成功的经过
地址状态,所以他还在对默认地址进行通信.你可以用仿真器看看在分
配地址后,你的寄存器里是否写入了分配的地址.
另:设备的地址和端点号是两码事,不是同一个概念.
新手上路,请多关照.
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-09-22 16:22
楼上说的好明白呀。

 :D

原来地址1 一般都分给 hub了。 hoho

wlfworld
驱动牛犊
驱动牛犊
  • 注册日期2004-03-01
  • 最后登录2005-07-17
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-09-22 15:22
    地址是针对设备来说的,如一台PC有多个USB设备(如,U盘,打印机,鼠标等),所以地址用于给不同设备编号来区分。地址0是刚插入还没有枚举的设备,地址1一般来说留给集线器使用,所以设备一般从地址2开始编号。
    一个设备内一般都有多个端点,不同类型的数据传输有各自的端点。如BULK-IN和BULK-OUT是在不同端点上传输的。
    楼主所说的一些数据包格式可以使用bus hound来查看参照PC机的格式。另请注意你的系统是大端还是小端的,确保匹配。
    端点0能读多少个数据,应设备不同而异。我做的是读写U盘的,U盘的端点0一般都不只8个数据。但为了你的驱动更有广泛的兼容性,建议第一次读8个数据,然后从读得的信息中来确定最大数据长度。
    楼主在发INQUIRY时返回NAK,说明设备还没有准备好,请在发INQUIRY命令后,收数据前加delay1-50ms试之。
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2004-09-22 11:44
1 地址1 应该可以吧。 呵呵,我这都是从2开始的,所以就顺手写个2
3 地址0 不就是端点0 么?

eifire
驱动牛犊
驱动牛犊
  • 注册日期2003-06-10
  • 最后登录2005-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-09-22 10:33
多谢wdy9927

1。输入笔误,第一个字节是0,而不是0x80,
  但是设置地址1不行吗?一定要从地址2开始?


3。地址0为何只能读8字节?不是端点0只能读8字节吗?

wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2004-09-22 10:14
1
恐怕都不是 setaddress 。 应该是 00 05 02 。。。。。

2
地址没设置对当然不行了。

3
用地址0 只能读取 8 字节。 但按理说多读没关系,只不过8字节以后的读不出来而已。 不解~
游客

返回顶部