Atmegal16l单片机发54H,从USB设备读数据块。用三个U盘进行测试,其中两个U盘每次读的数据都正确。 当用天朗U盘测试时,不能读出完整的扇区数据,有时读出64Byte数据,有时读出128Byte数据,换不同扇区都是这样。发53H命令测试U盘容量,能获得正确数据。发59H命令测试U盘是否就绪,能获得正确数据14H。 这种情况怎么解决?????请教各位!!!!!!!!!
这个好像U盘好像比较特殊!! 你看看这个帖子!! http://wch.cn/bbs/View.asp?T=1&S=101&I=311 感谢 mcu_xray { M } 的共享!!
我直接贴出来吧!!呵呵! mcu_xray { M } 写的!! 你可以参考下!! 读天朗A10U盘的问题解决了。下面部分源代码 /******************************************************************/ /*名称: ReadSector(ulong Sectors,uchar xdata *pr) */ /*描述: 读扇区内容 每次读1个扇区 */ /*输入参数:扇区地址,接收缓冲区指针 */ /*输出参数:1:读成功 0:读失败 */ /*******************************************************************/ uchar ReadSector(ulong Sectors,uchar xdata *pr) {union longEx Secaddr; uchar n,mBlockCount,mLength; Secaddr.lng=Sectors; CH375_CMD_PORT=CMD_DISK_READ; _nop_(); _nop_(); CH375_DAT_PORT=Secaddr.bytes[3]; CH375_DAT_PORT=Secaddr.bytes[2]; CH375_DAT_PORT=Secaddr.bytes[1]; CH375_DAT_PORT=Secaddr.bytes[0]; CH375_DAT_PORT=1;/*扇区数*/ n=Wait_Interrupt(); if(n!=USB_INT_DISK_READ) return FALSE; for(mBlockCount=0;mBlockCount<8;mBlockCount++) { CH375_CMD_PORT=CMD_RD_USB_DATA; _nop_(); _nop_(); mLength=CH375_DAT_PORT; while(mLength) { *pr++=CH375_DAT_PORT; n=CH375_DAT_PORT; mLength--; } wait_1mS(10);/*这里延时是关键*/ CH375_CMD_PORT=CMD_DISK_RD_GO;/*继续执行读操作*/ n=Wait_Interrupt(); if(n!=USB_INT_DISK_READ) break; } if(n==USB_INT_SUCCESS) return TRUE; else return FALSE; }
非常感谢小小何同志^.^我马上用你的方法试试,呆会来汇报结果!!!
感谢小小何的帮助,在命令CH375_CMD_PORT=CMD_DISK_RD_GO前加10ms延时问题解决!! 再次感谢!!!
我用的正是天朗A10盘,今天找了一下午都没找到原因!!!!!!现在开心了~~~~~~~
我有两个地方不明白,请教 { *pr++=CH375_DAT_PORT; n=CH375_DAT_PORT; 这句做什么用途? mLength--; } wait_1mS(10);/*这里延时是关键*/ 真的要延时吗,我认为不应该需要,就算要也不能10ms这么长
看起来是忽略这些数据!!以保证程序的执行!
这个是mcu_xray 写的!! 不是我写的!!呵呵!
我只是转载了!!
感谢mcu_xray的无私共享!!
另:希望大家将遇到的问题,怎么解决的都写上来!像mcu_xray这样,为大家服务!! 一起进步!
PS:论坛上有很多好的帖子! 要我们好好的吸收!!呵呵