|
日志内容
| 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欧姆的匹配电阻。由于图得比较匆忙,所以没留意。右击选择图片另存为可以看到完整图片了.



|
| 阅读全文 | 回复(192) | 引用通告 | 编辑
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-9-20 20:03:00 |
是的。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
问题(游客)发表评论于2008-9-20 14:12:00 |
code unsigned char DBR[512]中的磁头数与每道扇区数、每簇扇区数这三个参数好像没用哦。因为要计算U盘容量只要两个参数就够了:扇区字节数*扇区数。 问题1:既然没有用,可否设定为其他值? 要计算LBA地址,只需要每FAT扇区数、FAT副本数共两个参数就够了。 读取数据的时候,电脑向U盘发送的是LBA地址——该LBA地址有电脑的windows自动计算完成,是不是这样? 问题2:LBA的取值范围实际就是disk_CAPACITY[8]中前四个字节表示的值?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-9-11 15:31:00 |
解压出错可能是你下载时不完整,使用下载工具下载试试。 关于LBA如何计算,请参看网上的一篇文章《4.5万透视FAT32系统.doc》以及FAT文件系统相关文档。 详细怎么计算我一时跟你说不清楚,得花成千上万字的篇幅。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
有点迷茫(游客)发表评论于2008-9-11 13:02:00 |
程序中 if(LBA==0x40) if(count<=(sizeof(FILE_DATA)-1))pData=FILE_DATA+count; 意思就是LBA==0x40则发送TEXT.txt文件(实际就是FILE_DATA的内容)到电脑; 现在问题是:LBA如何计算?LBA==0x40为什么代表TEXT.txt的逻辑地址?如果想发送TEXT1.txt文件,那么LBA==? 要将多个文件发送到电脑怎么办?假定有100个文件,显然不能用if(LBA==XXXX)语句,太麻烦了。 谢谢指点迷津!
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
有点迷茫(游客)发表评论于2008-9-11 13:01:00 |
 'T', 'E', 'S', 'T', '1', ' ', ' ', ' ', 'T', 'X', 'T', //文件名 0x01, //文件属性,表示磁盘标卷 0x00, //保留 0x00, //创建时间毫秒时间戳 0x00, 0x40, //文件创建时间 0x41, 0x31, //文件创建日期 0x42, 0x31, //最后访问日期 0x00, 0x00, //起始簇号高位字节,FAT12/16必须为0 0x00, 0x40, //最后写时间 0x42, 0x31, //最后写日期 0x02, 0x00, //起始簇低位字节 LSB(sizeof(FILE_DATA)-1),MSB(sizeof(FILE_DATA)-1), 0x00, 0x00, //文件长度 };
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
有点迷茫(游客)发表评论于2008-9-11 12:49:00 |
假定有3个文件,则ROOT_DIR应修改为 code unsigned char ROOT_DIR[32*3]= //根目录 { ..... 'T', 'E', 'S', 'T', '0', ' ', ' ', ' ', 'T', 'X', 'T', //文件名 0x01, //文件属性,表示磁盘标卷 0x00, //保留 0x00, //创建时间毫秒时间戳 0x00, 0x40, //文件创建时间 0x41, 0x31, //文件创建日期 0x42, 0x31, //最后访问日期 0x00, 0x00, //起始簇号高位字节,FAT12/16必须为0 0x00, 0x40, //最后写时间 0x42, 0x31, //最后写日期 0x02, 0x00, //起始簇低位字节 LSB(sizeof(FILE_DATA)-1),MSB(sizeof(FILE_DATA)-1), 0x00, 0x00, //文件长度
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:关于LBA的计算问题 |
|
有点迷茫(游客)发表评论于2008-9-11 12:46:00 |
问题1: 磁盘容量DISK_CAPACITY好像没什么用?该数组与64M好像没有关系? 问题2: 关于LBA的计算问题。每个文件的LBA如何计算?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-5 17:30:00 |
您的那个例子我下了的`` 一解压就报错`````````` 我现在没有专业的板子` 我现在就一面包板子`````````` 呵呵` 连好后 POWER灯亮` 其它没什么状况了` 您能不能告诉我些检查的方法
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-9-5 15:45:00 |
当然要有正确的固件才会识别出设备了。建议你还是用HID设备吧, 可以参考这个例子:http://group.ednchina.com/93/8769.aspx 硬件应该就我们小组里面的USB学习板。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-5 11:27:00 |
我从网上当的 pdiusbd12简单实例 这个您应该看过吧` 整个应该是没有问题的 有驱动 有硬件程序 有上位机程序 现在连好了电路 插上USB接口 没有什么反映 有时候会出现 异常电泳的问题` 要如何才能提示安装驱动呢`? 上位机程序 需要设置些什么呢? 就这样打开那程序 总报找不到设备 那程序改如何用啊? 您知道那程序吗? 就是通过上位机通过d12控制89S52的灯` 您如果没有这个程序 我发一份给您 您帮我看看 有没有问题 好吗? 不胜感激`
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-5 10:14:00 |
OO大侠 请教一下` 电路连对了之后 是不是就会现在有USB插入~? 还是固件要写好才会出现?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-9-4 1:19:00 |
使用DDK那是要自己开发驱动了,也可以看小组里的文章,我有写过一个简单的驱动。 使用HID设备就不用自己开发驱动了,直接只有VC就可以编译。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-3 17:52:00 |
说错了 是DDK 呵呵` 我可以用这个build吗~?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-3 17:50:00 |
我现在就一DKK 可以用这个编译吗~? 怎么写驱动用什么工具过程能说详细点吗?~
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-9-3 12:44:00 |
可以用HID设备的,你看看这个帖:http://group.ednchina.com/93/8769.aspx
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-3 11:23:00 |
OO大侠 请教一下 驱动写在哪啊?~ 我下了个程序 有固件这块,有上位机的,还有驱动的 vc++写的 怎么用呢?~ 驱动要烧到芯片还是 怎么用啊~? 菜鸟一只 见笑了!
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-2 18:41:00 |
还要几个月啊~? 我等不鸟那么长时间了啊 OO大侠! 您能不能搞个简单的pc通过AT89S52和D12通讯的简单例子我啊?~ 急啊!!!! 油箱 clhh123@163.com 谢谢啊!!!!!!! 图和原码最好都有的!!! 最好再多点注释~~~ 呵呵` 以后一定力挺OO大侠的书和bolg
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-9-2 15:26:00 |
快了,再等几个月吧……
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-2 14:29:00 |
您的USB书什么时候出来啊?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-9-1 20:50:00 |
用11.0592M的晶体也可以,就是波特率要改,如果不改,那么波特率只有一半。 IDE PORT是接IDE硬盘的,你没有可以不管它。 ZLG那本书我也看过一下,不是太容易懂。你可以等我的USB书出来看看有没有帮助了。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-1 19:37:00 |
再补充一句啊`` 嘿嘿` 我有本周力功的 固件编程与驱动开发` 不知道你看过没有`` 我看着像天书!OO你如果看过` 请指教一下` 着重看哪些` 怎么看这本书 怎么入手 或者有好的入门书 资料分享给我 谢谢! 最好是那种手把手教的呵呵! 我的油箱:clhh123@163.com 发地址我下载也可以 谢谢
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
CL(游客)发表评论于2008-9-1 19:15:00 |
晶震用11.0592的可以吗?需要调整哪些地方` 我一出道小菜鸟``` 还有那IDE PORT就是OO你说的IDE接口.怎么用呢? 我没有你那样的板子,我就用的面包板,已经完成了89S52于计算机的通讯了 现在想加入USBD12 需要注意些什么? 望OO明示!
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-8-30 21:04:00 |
是的,根据DBR以及FAT协议,可以推测出FAT的LBA。LBA通常有两个,后面一个为备份。是大,最大簇数为65536,但实际上没这么多的,有些簇号是保留的。文件的首簇号由目录项指定,文件首簇的数据肯定不会在根目录中。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
无根(游客)发表评论于2008-8-29 12:51:00 |
请教圈圈: if(LBA==0)return DBR; if(LBA==2)return FAT; if(LBA==0x40)return ZERO; if(LBA==0X0A)return FAT; LBA是怎么来的,FAT16规范规定的吗?LBA==2表示FAT,为什么LBA==0X0A也表示FAT呢? 再问: 对应于FAT16文件系统,FAT理论最大值为(簇数×每醋字节数):65536*2=128K,对不对? 又问: 文件的首簇(第一簇)位于根目录中,第二簇~最后一簇位于FAT表中,对不对? 谢谢!
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-7-20 9:36:00 |
不会吧?是不是你的板子没焊好?这个电路图比较老的,有些地方有更正,并且程序也有bug,你对照我新版的原理图,以及新版的程序试试看。 你可以来这里找到新版的全部相关资料。http://group.ednchina.com/93/8519.aspx
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
usb(游客)发表评论于2008-7-18 22:57:00 |
圈圈啊,求救了,按照你的电路图做了好几块板,每次都是无法识别啊!led亮四五下,然后就出现unkown deveice
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-7-16 15:37:00 |
用AT89C5131 U盘可以是可以,不过不划算,现在有专门的做U盘的芯片。 这个芯片我没用过,下载程序的方法应该在数据手册中有说明。 应该会支持ISP下载功能,或许还可以通过USB口下载程序。或许还支持用编程器烧录。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
anny(游客)发表评论于2008-7-16 14:23:00 |
我想请问如果用AT89C5131可以做U盘吗?是怎么把程序下载到AT89C5131呢?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-5-15 2:59:00 |
IDE port它不是个什么芯片,是硬盘接口。IDE接口应该听说过吧?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
访客uYPc62(游客)发表评论于2008-5-15 2:33:00 |
printf是为了串行口输出,由于调试USB枚举吧? 我想问一下,IDE PORT具体用的是什么型号的芯片啊?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2008-5-7 20:15:00 |
能发现新硬件了,应该没坏吧。用BUS HOUND抓数据看看,都返回了些啥。 仔细检查D12是否焊接好了,用我的EDN USB板第一个测试程序读ID看看是否正确。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| 我的D12芯片是不是坏了啊? |
|
lancewood(游客)发表评论于2008-5-7 10:09:00 |
我参照您的电路仿制了一块,S52晶振用的是20M,接在开发板上的,D12枚举后电脑上就是UNKNOW DEVICE,不正常啊?怎么才能插入电脑后,可显示移动磁盘盘符及一个文本文件。是不是D12坏了啊?
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
访客wBRe7H(游客)发表评论于2008-2-28 13:23:00 |
SUSPEND
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
computer00发表评论于2007-9-9 12:50:00 |
在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 |
谢谢:) 恩,这个我看到了,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 |
这个问题我已经回复过好几次了,在未设置地址之前,只需要返回前16(事实上只有8个就够了)个即可,主机不会再去读剩下的2字节. 等设置地址之后,才会读完整的设备描述符. 你在我的其它帖子看看,应该有更详细的说明。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
ulr(游客)发表评论于2007-9-8 20:36:00 |
哦,我看到了:) 还有个问题,就是接收到主机发送过来的 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 |
回 wahaha: 管它呢,一直为低就低了。反正等下进到主循环中会去处理的。 回 ulr: 那是定义在一个联合(共用体)里面的,我是将整个中断寄存器的值读回,然后通过这个联合,将它分配到一个结构体的位段中去.你找找这个联合的定义。
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
| Re:89S52加USBD12模拟的一个U盘(源码+原理图+实物照片) |
|
ulr(游客)发表评论于2007-9-7 23:26:00 |
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 |
 以下引用computer00在2007-9-7 17:03:00发表的评论: 不用加了吧。后面那么多读的了。现在都跑得好好的了,加个多麻烦。 不是 就是在程序刚开始的时候 如果你不读的话 INT就一直是低吧
|
| 个人主页 | 引用 | 返回 | 删除 | 回复
|
|
用户信息
载入中...
|