阅读:2738回复:16
请教大家!MCU对U盘的操作。
我有一项目,设备(MCU)需对U盘进行读写操作。HOST选用SL811H,
U盘用的是朗科的32M无驱型。初次接触USB,很不熟悉,时间又紧,只有半个月时间,请大家帮忙。 现在调试出现了一怪现象:对U盘发出指令后第一次能正确执行,并能正确得到CSW(如读一扇区)。可是后面再发指令就再也不执行了(如再发读一扇区指令),发指令能有ACK响应,后面读就得到NAK,不执行操作。指令都是正确的,放到第一次都能正确执行,调了很久不知什么原因。 请各位高手帮帮忙!这里先谢谢了!多多感谢!急!急!急! |
|
最新喜欢:ww7002 |
沙发#
发布于:2002-05-21 16:18
大家请帮忙,时间很紧,多发表意见,想想办法。
多谢!多谢! |
|
板凳#
发布于:2002-06-18 09:21
我也碰上类似问题.我用的是Genersys Logic的USB CF读卡器.BULK ONLY, SCSI TRANSPARENT COMMAND SET. 我是在DOS下写的UHCI的驱动和设备驱动.想尽一切方法都无效.看来只好跟踪WIN2K的驱动,看看它是如何工作的.欢迎联系kelvin@ldic-china.com
Tel:021-64728712 吴华 |
|
地板#
发布于:2002-06-19 08:33
So many USB hakers in forum.
No one can answer my question??? |
|
地下室#
发布于:2003-12-12 20:26
我也一样碰到这个问题
请高手赐教 |
|
5楼#
发布于:2003-12-13 09:51
偶不是高手, 可能帮不上什么忙
看到CSW不一定你的命令就正确执行了, CSW里面还有一个状态信息要读出来判断. |
|
6楼#
发布于:2003-12-14 09:29
cbw命令有误,察看csw的状态信息。
第一次的命令返回的数据对吗? |
|
7楼#
发布于:2003-12-15 09:06
是DATA0与DATA1的问题!
|
|
8楼#
发布于:2003-12-15 09:16
如果是用cypress的例程,那就肯定出在usbxfer函数上了,因为那个函数有bug,需要稍加修改才能正常使用的!!!
|
|
9楼#
发布于:2003-12-20 09:42
的确是DATA0/1轮换的问题
|
|
10楼#
发布于:2003-12-22 10:36
请教lxb_gd:
----------------- 如果是用cypress的例程,那就肯定出在usbxfer函数上了,因为那个函数有bug,需要稍加修改才能正常使用的!!! --------------------- 能否将这个bug贴出来,我正在编写读写U盘的程序,用的就是Cypress的程序。 |
|
11楼#
发布于:2003-12-22 21:54
lxb_gd:
----------------- 如果是用cypress的例程,那就肯定出在usbxfer函数上了,因为那个函数有bug,需要稍加修改才能正常使用的!!! --------------------- 我也想知道这个bug是什么 |
|
12楼#
发布于:2003-12-23 10:17
是在pid_out时的处理。
usbxfer例子中只能发送一次,如果发送512bytes,调用多次usbxfer,同时也没用利用到双缓冲,所以写速度会慢一些的。 同时在usbxfer函数外,要自己添加nak,timeout,stall等错误处理,这样稳定性才能提高! |
|
13楼#
发布于:2003-12-23 13:25
我正在读这一段的程序,也有这方面的疑问,是不是在这一段,
//------------------------------------------------ // For EP0\'s IN/OUT token data, start with DATA1 // Control Endpoint0\'s status stage. // For data endpoint, IN/OUT data, start ???? //------------------------------------------------ if(endpoint == 0 && pid != PID_SETUP) // for Ep0\'s IN/OUT token cmd |= 0x40; // always set DATA1 //------------------------------------------------ // Arming of USB data transfer for the first pkt //------------------------------------------------ SL811Write(EP0Status,((endpoint&0x0F)|pid)); // PID + EP address SL811Write(EP0Counter,usbaddr); // USB address SL811Write(EP0Address,data0); // buffer address, start with \"data0\" SL811Write(EP0XferLen,xferLen); // data transfer length SL811Write(IntStatus,INT_CLEAR); // clear interrupt status SL811Write(EP0Control,cmd); // Enable ARM and USB transfer start here //------------------------------------------------ // Main loop for completing a wLen data trasnfer //------------------------------------------------ 这一段只设置了端点0的值,没有设端点1的值。是否需要加上端点1的值,但是前面又有这样一句: cmd |= 0x40; // always set DATA1 是什么意思呢?难道DATA0不是对应端点0?请指教。 |
|
|
14楼#
发布于:2003-12-24 15:50
我们有MCU读写U盘的成熟方案。
详细信息可以到我们的网站上看:http://eden.51.net 上面有介绍和图片。 |
|
15楼#
发布于:2004-03-17 17:21
la
|
|
|
16楼#
发布于:2004-04-02 12:08
请问一下大家如何对nak,timeout,stall各个状态进行处理的呢?
我现在被郁闷在这里了,老是出错不知道怎么处理 |
|