[21IC首页] [21IC资料下载] [21IC器件搜索[alldatasheet网] [中国芯片手册网] [电子查询网] [磁动力工作室] [驱动程序开发网] [射频网络] [液晶之家] [可控硅应用技术网]

Computer○○的家当®

 
 
载入中...
   
                                                         设置为首页      [站长入口]    站点2: [EDN站点]   站点3:[61IC站点]  USB专区: [圈圈的USB专区]




载入中...

日志内容


89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
电脑圈圈 发表于 2006-3-3 14:09:00

USB-D12文件包下载.rar

这是一个用89S52加PDIUSBD12模拟的一个U盘,里面涉及到USB接口,USB大容量存储设备,FAT16文件系统等内容。插入电脑后,可显示移动磁盘盘符及一个文本文件。

       需要说明一下的是,这个包中的原理图,IDE接口部分、74HC573、以及RS232串口等部分,是作为这个实验板的一部分。在这个模拟U盘的程序中,是没有用到的。在下一个“移动硬盘”的例子中,就用到了IDE接口跟74HC573了。至于RS232,那时笔者在调试程序时用的。如果您不需要通过串口调试程序,RS232部分可以不管它。
 
注意:原理图中串口电平转换部分的C8和C10接反了,C11负端应接VDD。D12的SUSPEND(12脚)应该接地。USB接头的D+和D-跟芯的D+和D-之间应该串联22欧姆的匹配电阻。由于图得比较匆忙,所以没留意。右击选择图片另存为可以看到完整图片了.
 

 
 
 
 




阅读全文 | 回复(164) | 引用通告 | 编辑       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2008-5-15 2:59:00

computer00IDE port它不是个什么芯片,是硬盘接口。IDE接口应该听说过吧?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
访客uYPc62(游客)发表评论于2008-5-15 2:33:00

访客uYPc62(游客)printf是为了串行口输出,由于调试USB枚举吧?
我想问一下,IDE PORT具体用的是什么型号的芯片啊?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2008-5-7 20:15:00

computer00能发现新硬件了,应该没坏吧。用BUS HOUND抓数据看看,都返回了些啥。
仔细检查D12是否焊接好了,用我的EDN USB板第一个测试程序读ID看看是否正确。

个人主页 | 引用 | 返回 | 删除 | 回复       


我的D12芯片是不是坏了啊?
lancewood(游客)发表评论于2008-5-7 10:09:00

lancewood(游客)我参照您的电路仿制了一块,S52晶振用的是20M,接在开发板上的,D12枚举后电脑上就是UNKNOW DEVICE,不正常啊?怎么才能插入电脑后,可显示移动磁盘盘符及一个文本文件。是不是D12坏了啊?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
访客wBRe7H(游客)发表评论于2008-2-28 13:23:00

访客wBRe7H(游客)SUSPEND
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-9-9 12:50:00

computer00在WIN XP下,BUS HOUND是不能看到设置地址之前的数据包.
在2000下,好象可以看到所有的数据包。

你所看到的MP3,你还要看看它的端点0大小.如果它的端点0比18字节大,那么它一包就可以全部返回18字节了。
但是D12不一样,D12的端点0只有16字节,所以必须分成两包返回。但是在设置地址之前,主机只会读第一包,
剩下的就不理了。就会进入设置地址阶段。

如果你在返回第一包之后,就检测不到动作了,那么可能是你根本没有正确返回这个数据包。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
ulr(游客)发表评论于2007-9-9 10:13:00

ulr(游客)谢谢:)
恩,这个我看到了,pc第一次发送get_descriptor是为了确认是否真的有usb设备连接到总线上。可是,我插上买来的mp3用bushound抓包,发现每次第一次获取的描述符就是0x12个字节,我的pc装的是win2k,我在其他地方也看到有资料说,第1次是为了确认usb设备的真正连接,但是看到的不太一样,无法判断哪个是实际的过程,大胆的怀疑一下:会不会是bushound没有记录全部的过程?
第2个困难是接收到setup包后,我发送了16个设备描述符,但是之后没有ep0-tx中断发生,也没有其他的标准请求中的任何中断发生,枚举无法进行下去了,正常情况下,这时usb主机会发送其他的中断的,如设置地址,是这样的吗?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-9-8 21:12:00

computer00这个问题我已经回复过好几次了,在未设置地址之前,只需要返回前16(事实上只有8个就够了)个即可,主机不会再去读剩下的2字节. 等设置地址之后,才会读完整的设备描述符. 你在我的其它帖子看看,应该有更详细的说明。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
ulr(游客)发表评论于2007-9-8 20:36:00

ulr(游客)哦,我看到了:)
还有个问题,就是接收到主机发送过来的
setup_packet : 80 06 0001 0000 4000 后,我在get_descriptor()里发送了16个字节的
0x12 0x01 0x01 0x10 0xdc 0x00 0x00 0x10 0x04 0x71 0x06 0x91 0x01 0x00 0x00 0x00设备描述符,之后就一直什么中断都没有了,没有ep0-tx的中断,这样就没有办法继续下去了呀,我很不清楚为什么会没有ep0-tx的中断,这个中断的触发是需要pc上的usb-host发出的吧?可是他没有发出来不知道是为什么呀?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-9-8 3:11:00

computer00回 wahaha: 管它呢,一直为低就低了。反正等下进到主循环中会去处理的。

回 ulr: 那是定义在一个联合(共用体)里面的,我是将整个中断寄存器的值读回,然后通过这个联合,将它分配到一个结构体的位段中去.你找找这个联合的定义。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
ulr(游客)发表评论于2007-9-7 23:26:00

ulr(游客)oo你好,我还有一个问题,在你的main中,调用ep0-in的条件是
if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in){endp0_in();continue;}
但是我没有找到对
Interrupt_Register.Interrupt.control_in_port的附值和初始化操作,所以不太清楚它对调用ep0-in的影响。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
wahaha(游客)发表评论于2007-9-7 19:46:00

wahaha(游客)
以下引用computer00在2007-9-7 17:03:00发表的评论:
不用加了吧。后面那么多读的了。现在都跑得好好的了,加个多麻烦。


不是 就是在程序刚开始的时候
如果你不读的话 INT就一直是低吧

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-9-7 17:03:00

computer00不用加了吧。后面那么多读的了。现在都跑得好好的了,加个多麻烦。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
wahaha(游客)发表评论于2007-9-7 11:09:00

wahaha(游客)对了 00
你的这个程序里
在程序初始化的时候是不是加上D12读取中断寄存器的语句阿~~

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-9-3 13:43:00

computer00使用查询会比中断简单得多。由于这个芯片中断源比较多,在中断时就很难处理,数据的发送和接收之间有些依赖关系。 如果给我用中断来做,就是进入中断后,设置一标志,然后再到主程序里来查询这个标志,那这样搞又有什么意义?还不是要搞成查询方式,那又何必多这么一个步骤?况且这个东西的主要任务就是实现数据通信,所以应该把主要的任务放在数据通信这一块。你看我的USB键盘中,扫描键盘用的就是定时器中断,因为它发生得不平繁。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
ulr(游客)发表评论于2007-9-3 12:31:00

ulr(游客)呵呵,oo你好,我有一个问题,一般的说使用中断会比使用查询的方式效率稍高一些,但是我注意到你的project里使用的是查询的方式,不太清楚为什么会使用查询的方式?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-8-31 10:44:00

computer00FAT16的短文件名必须全部大写。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
wasai(游客)发表评论于2007-8-31 10:14:00

wasai(游客)OO 大师 你好:
我参照你的代码实现了一个虚拟U盘,但有一个莫名其妙的问题想请教,
我把ROOT_DIR 中的目录名或文件名改成小写或大小写混合写,windows端就打不开,通过
BUS HOUND 发现windows根本没有发送READ命令。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-8-25 11:24:00

computer00发现程序的一个BUG,有些朋友提到枚举不正常,可能是下面这个函数的问题,替换它再试试.

/***************************设置地址***************************************/
void set_usb_address(void)
{
usb_flags.flags.set_addr=1;
set_usb_addr(Control_Data.DeviceRequest.wValue);
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
while(select_endpoint(1)&0x01);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-7-27 10:18:00

computer00"经过了四五次 GET STATUS  CLEAR FEATURE SET FEATURE" 那是因为你的设备的上拉电阻已经连通了,这时集线器就会报告状态,你看到的这些,就是主机跟根集线器之间的数据交换。然后就是获取描述符,但是你的设备对获取描述符的数据包并没有用ACK响应,所以你连一个数据包都看不到。应该是你程序的问题,在复位后要准备好应答以及返回数据包等。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
wahaha(游客)发表评论于2007-7-24 23:04:00

wahaha(游客)oo你好
现在我刚开始做USB 看了你的东西 感觉收获很大
目前固件程序已经编好 我用BUS HOUND 来观察USB数据流
在经过了四五次 GET STATUS  CLEAR FEATURE SET FEATURE 之后便跳出“无法识别的USB设备”  发现PC根本没有发送设备描述符的请求??不知道为什么? 另外 LED灯能亮四五下
麻烦oole

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-6-9 22:09:00

computer00有可能是程序的问题,也可能是硬件连接的问题,也有可能是芯片坏了,不过这个可能性比较小,但也不能排除这种可能。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-9 21:07:00

lwsmileoo你好!我的还是有问题哈!上电之后CLKOUT输出为4M,执行程序改变那个频率,可是它没变,还是4M。这样的话是不是说明是没有执行程序啊?有没有可能D12坏掉了呢?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-6-5 14:56:00

computer00有些内容是放在FLASH中的,例如FAT表,目录等等,由操作系统负责管理. 而关于磁盘信息,MRB等,应该由固件负责填写。而格式化等操作,我认为也由固件来实现比较好.
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
zhiy66(游客)发表评论于2007-6-5 12:14:00

zhiy66(游客)OO您好,看你程序收获颇大,谢谢啊。不过还有个问题想请教你一下。在你的固件中包含了U盘的文件系统的内容,这部分内容在真正的U盘开发中不应该包含在固件中吧?所以我想知道在真正设计中文件系统这部分的内容应该怎么实现?期待你的回答
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-6-4 0:08:00

computer00程序没有运行,当然一直为低了。程序运行了,并且你的程序要是正确的,它才不会一直为低.
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-3 22:35:00

lwsmile上拉了一个电阻还是不行,不插USB线的时候为高,插上USB线后就一直为低了,我现在都还没运行程序,运行程序也是没有反应,5555。。。。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-3 22:07:00

lwsmile没有运行程序的时候就为低了啊,是不是INT_N信号要接上拉电阻啊?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-6-3 21:16:00

computer00也许是程序哪里搞错了吧. 先写最基本的测试程序,例如设置时钟频率等,看是否可以正确控制. 另外要确认电路是否连接正确。 我的原理图中有些小错误,已经用文字注明,请注意。中断信号一直有,也许是你的程序没有去读中断寄存器,导致中断没有清除.
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-3 20:54:00

lwsmile圈圈啊,为什么我的上电之后INT_N信号为低啊?感觉为高才对啊
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-3 18:59:00

lwsmile快不行了哈。。。
为什么我的INT_N信号一直为低啊?奇怪,应该为高才对啊

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-3 18:45:00

lwsmile大师啊,发现不了设备怎么办啊?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-6-3 16:16:00

computer00USB大容量存储设备是不需要自己写驱动程序的,WINDOWS已经自带了驱动程序,只要你连上电脑,它就会自动帮你加载驱动程序。

调试USB可以使用BUS HOUND这个软件:
http://computer00.21ic.org/user1/2198/archives/2006/22941.html

而串口查看则可以使用超级终端:
http://computer00.21ic.org/user1/2198/archives/2006/11009.html

或者使用其它的串口调试助手.

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-3 14:49:00

lwsmile你好!我又来拉!我想问一下你在调这个东西时,上层的驱动程序和调试的应用程序用的哪个啊?能不能给我发一份啊?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-3 14:14:00

lwsmile谢谢啦
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-6-3 13:57:00

computer00枚举也不一定要用到中断。在我的系统中都未使用中断,都是在主程序中查询的。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
lwsmile发表评论于2007-6-3 13:31:00

lwsmile电脑圈圈你好!我的系统不能用中断,现在连上D12后发现不了设备,也读取不到设备ID号。。。。
我想问的是,枚举的时候也要用到中断是吧?不用中断怎么枚举阿?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
computer00发表评论于2007-6-2 3:23:00

computer00也许已经又收到数据包了吧. 又或许是操作不对。 也有可能是芯片的BUG,这东西很难说的。
个人主页 | 引用 | 返回 | 删除 | 回复       


我的clear buffer不起作用
lxy(游客)发表评论于2007-6-1 16:36:00

lxy(游客)圈圈,我使用clear_buffer函数清零缓冲后,再用select_endpoint查看端点缓冲状态,它还是显示满,什么原因啊?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片)
zhiy66(游客)发表评论于2007-5-23 17:49:00

zhiy66(游客)不好意思,我在你的第二个代码中找到了你定义的函数,上面的问题解决了。麻烦你了
个人主页 | 引用 | 返回 | 删除 | 回复       

发表评论:
载入中...

 
 

 

用户信息

载入中...

    
    
 
家当信息
载入中...

站长简介:  

    Computer00,男。B型血,天蝎座。爱好电子技术及计算机技术。21IC中国电子网[技术交流]版版主。

 

最新回复

载入中...

圈圈公告 
载入中...

最新家当

载入中...

友情链接 

 

家当主题

载入中...

最新留言

载入中...

搜我的家当 

          chunyang工作室
        为您提供无线通讯模块