阅读:1955回复:12
单片机读写U盘,能读出扇区数据,但写不上?
单片机读写U盘,能读出扇区数据,但写不上。
在写扇区数据的时候,第二个64B时间特长,可能是U盘NAK,因为NAK时我一直重发,其它7个64B包均正常,但数据丝毫没有写上,为什么? CBW 64B 64B 64B 64B 64B 64B 64B 64B SBW =1mS 1mS 35mS 1mS 1mS 1mS 1mS 1mS 1mS 1mS [编辑 - 11/6/03 by mhxsoft] |
|
沙发#
发布于:2003-10-28 17:17
可能u盘自动在判断,是否正常,然后才会真正写入!
|
|
板凳#
发布于:2003-11-02 21:46
NewTech 兄:
U盘在判断什么正常后,才把数据写到U盘上。我也有同样的问题:数据写不进U盘 |
|
地板#
发布于:2003-11-04 08:53
我也有同样的问题,但是对于OTI方案的U盘比较容易写。其它的就不行了。
|
|
地下室#
发布于:2003-11-04 14:21
收到sbw后看看是不是传输的数据结束了,如果U盘没有接收完512个数据,就无法写入了。
|
|
5楼#
发布于:2003-11-05 16:41
这种问题我也遇到过,后来解决了,是延时的问题。
|
|
6楼#
发布于:2003-11-06 14:13
我的系统是XXX+MSP430F149+SL811HS+U盘
“收到sbw后看看是不是传输的数据结束了,如果U盘没有接收完512个数据,就无法写入了。” 应该怎么判断? “是延时问题” 是哪里的延时问题? [编辑 - 11/6/03 by mhxsoft] |
|
7楼#
发布于:2003-11-06 17:34
please use bushound to capture the usb bus data, then analyze it!
or paste it here!! :D |
|
8楼#
发布于:2003-11-07 13:35
看看这有用吗?
uchar write_sector() { init_8070i(); init_cbw(); //get cbw if(bulk_out_data(31,cbw) == FALSE) { return FALSE; } else { delay_ms(10); if(BulkOutData() == FALSE) { return FALSE; } else { delay_ms(50); if(BulkInData() == FALSE) { return FALSE; } } } return TURE; } #define RETRY 300 uchar BulkOutData(uint Length,uchar *ptr) { uchar RCounter1=0,RCounter2=0; for(;Length>64;Length-=64) { Sl811WriteBuffer(UsbaStartAddr,ptr,64); ptr+=64; do { if(RCounter1++>RETRY) return(0); Sl811WriteByte(Sl811aAddr,Usba_start_addr); Dl811EriteByte(Sl811aLength,64); Sl811WriteByte(Sl811aStatus,(PidOut<<4)|EpOut); Sl811WriteByte(Sl811aCount,0x02); Sl811WriteByte(Sl811aCtrlreg,BulkWr); while((Sl811ReadByte(Sl811aCtrlreg)&0x01)==0x01); }while((Sl811ReadByte(Sl811aStatus)&0x40)==0x40); if(BulkWr==Data0Wr) BulkWr=Data1Wr; else BulkWr=Data0Wr; DelayMs(2); } if(Length!=0) { do { if(RCounter2++>RETRY) return(0); Sl811WriteBuffer(usba_start_addr,ptr,length); Sl811WriteByte(Sl811aAddr,UsbaStartAddr); Sl811WriteByte(Sl811aLength,Length); Sl811WriteByte(Sl811aStatus,(PidWut<<4)|EpOut); Sl811WriteByte(Sl811aCount,0x02); Sl811WriteByte(Sl811aCtrlreg,BulkWr); while((Sl811ReadByte(Sl811aCtrlreg)&0x01)==0x01); }while((Sl811ReadByte(Sl811aStatus)&0x40)==0x40); if(BulkWr==Data0Wr) bulk_wr=Data1Wr; else BulkWr=Data0Wr; DelayMs(3); } return (1); } |
|
9楼#
发布于:2003-11-08 11:09
一般来说,这是由于延时不合适造成的,调整一下延时试试.
欢迎访问俺自己的网站http://eden.51.net主要是USB设计方面的一些东东 |
|
10楼#
发布于:2003-11-12 15:13
楼上的朋友,谁有8070i或SCSI SET或UFI等命令区块详细规范,请发给我一份。谢谢!
|
|
11楼#
发布于:2003-11-12 15:14
楼上的朋友,谁有8070i或SCSI SET或UFI等命令区块详细规范,请发给我一份。谢谢!
mhxsoft@sohu.com [编辑 - 11/12/03 by mhxsoft] |
|
12楼#
发布于:2003-11-13 15:19
看看我这个写命令的CBW是否正确:
0x55,0x53,0x42,0x43,0x28,0xE8,0x31,0xFF,0x00,0x02,0x00,0x00, 0x00,0x00,0x0A,0x2A,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
|