阅读:1508回复:13
借助一点别人的成果,带给大家一点方便1.GoodLink。GoodLink是靠一个引脚接发光二极管实现的。在 USB设备枚举时LED指示灯将立即闪亮;当PDIUSBD12被成功枚举并配置时, LED指示灯将会始终亮;经过PDIUSBD12的USB数据传输过程中, LED将一闪一闪,传输成功后LED熄灭;在挂起期间,LED熄灭。这种特性可以使我们知道 PDIUSBD12的状态,方便电路调试。 2.单片机的中断应设置为电平触发;中断后一定要读上次传输状态寄存器(命令40-45H),以清 除中断寄存器中的中断标志。这样,PDIUSBD12的中断输出才能变回高电平,这一点非常重要。 3.在接收到Setup包后,一定要调用ACK set up命令重新使能端口0。 4. 在向IN端点写完数据后,一定调用Val i date Buffer(命令FAH),指明缓冲区中的数据有效,可以发送到主机。 5 当读完数据后,一定调用Clear Buffer(命令F2H),以保证可以接收新的包。 6 可以通过调用Read Chip ID(命令FDH)检查PDIUSBD12是否工作。该命令要读两个字节数 据。 USB初始化过程为: ① Set Address Enable; ② Set Endpoint Enable(此时LED亮); ③ Disconnect; ④ delay(1~2 s); ⑤ Connect(即用43h参数调用Set Mode,此时LED灭); ⑥ Read Interrupt Register。 在调试USB单片机程序时,还要特别注意Win dows对USB 设备的枚举顺序: ① GetDeviceDescriptor。主机主要对Length域感兴趣,发送内容一定要正确,特别是第 2字节type一定为0x01,即Device;否则,主机将不响应,或 者再重复2次后放弃。可检查一下对EP0的RX、TX的设置次序。 ② SetAddress。一般为02或03。 ③ 连续3次GetDeviceDescriptor,读取全部设备描述符,一般为 18 B,分为多次传输。如果不正确,主机将不响应或重复2次后放弃。 ④ GetConfigDescriptor。注意第2字节一定为0x02,即config 。 ⑤ GetStringDescriptor(可能没有),根据在设备描述符中是否有 String索引而定。一般先读取LanguageID,再读取product string。 ⑥ 读取全部ConfigDescriptor,次数根据描述符的大小决定(端点个数不同,描述符大小不同),如 果不正确,主机将不响应或再重复2次后放弃。 ⑦ 如果以上步骤都正确,主机将找到新设备,提示安装驱动程序;否则找到未知设备,不可用。 安装驱动程序后,以后的每次PlugIn,枚举次序与以上步骤略有不同,之后会有 SetConfiguration、GetConfiguration和GetInterface等调用。 |
|
最新喜欢:crazyq... |
沙发#
发布于:2004-08-24 11:21
好帖…………
|
|
板凳#
发布于:2004-08-24 11:27
对高手没什么意义,但对新手还是很有帮助的,不是吗!
|
|
地板#
发布于:2004-08-24 14:46
希望大家帮忙顶一下,让更多认为这东东有用的人能够看到它
|
|
地下室#
发布于:2004-08-24 16:59
我顶一下!!谢谢wly76和LikeDDK还有METALWING(好像拼错了)对我们菜鸟的帮助,希望大家能把看到的好东西都上传到这里,和大家分享,争取把这个贴做成精华贴!!!!
|
|
5楼#
发布于:2004-08-24 17:02
狂顶
尤其是对我这样的新新手!很有帮助!!! 思路能更清晰以下 不过。。。。如果把相应的代码贴出来??? 嗬嗬,大家别砸我啊!!!因为是新手嘛!!! 响应的人拼命顶啊!我想搂主不会介意的。对吗? :D :D :D |
|
6楼#
发布于:2004-08-24 17:03
我再顶一下!!呵呵,我现在一边在看d12的固件程序,一边在作proteldxp的制图,在看d12程序的过程中,对有些语句和命令的了解不是非常的深,不知道可不可以在这里贴出来,向几位高手请教一下啊!!!先谢过
|
|
7楼#
发布于:2004-08-24 17:23
谢了,我就喜欢菜问题,因为我也是菜鸟,但我希望,不久的将来
我可以回答不菜的问题,自己也可以成为大虾,和大家不停的交流 会令我提高,我很高兴,希望看到你们解决问题的每一个细节,因为 了解每一个细节的人,才是真正的高手。用不了多久,我相信,会和 你们这些高手一同交流。 |
|
8楼#
发布于:2004-08-25 09:06
好,有你这句话,我就不客气了!!
提问: 1:在周×的固件编程和驱动开发中,他举了一个usb枚举的数据传输过程,第一次读取设备描述符,80 06 00 01 00 00 40 00,其中00 01代表的是字长域,根据不同的请求含义改变,本例中,设备的数值为1,所以应该是0x0001,但是由于usb和c51的数据结构不同,要对数据高低位交换,因此,输出应该位80 06 01 00 00 00 40 00才对啊!!我错了还是周×错了啊??? 2:D12的命令中有一个应答设置命令F1h,接受者是选择的端点,这个命令书上只是说,一个setup信息包的到达将IN缓冲区刷新并禁止对IN和OUT端点的两条命令,是缓冲区有效和清零缓冲区命令。 这一大段话真是越看越迷糊啊!!能帮忙解释一下吗?? |
|
9楼#
发布于:2004-08-25 10:24
第一个问题,我要看一下资料,考虑考虑看能否回答你。
第二个问题看一下有关命令D8重新使能EP0的问题的贴子就明白了。 |
|
10楼#
发布于:2004-08-25 13:21
帖子看了,可是第二个问题我还是没有明白啊!!我再把问题说得具体一些:D12CI.C//D12命令接口
。。。。。。。 //端点应答处理 void D12_AcknowlegeEndpoint(unsigned char endp) { outportb(D12_COMMAND,endp); outportb(D12_COMMAND,0xF1); if(endp==0)outportb(D12_COMMAND,0xF2); } 这个函数到底是怎么回事啊,我有点不明白!! 再加上一个问题: extern IO_REQUEST idata ioRequest; 这个语句中ioRequest是具体干什么的啊??此外,IO_REQUEST是类名,那 idata又是??但我又看到它是一个c51的数据类型,这样的表述到底对不对啊?? |
|
11楼#
发布于:2004-08-25 13:42
呵呵,你如果在上海的话,我可以请你啜一顿啊!!当然不会是青菜,萝卜的啊!!!先给你十分,呵呵,我的分数也不多,不好意思
|
|
12楼#
发布于:2004-08-26 10:03
好,有你这句话,我就不客气了!! 第一个问题,按你的字面理解,是你对了!从电脑上抓下来的数据也是80060100。。。 |
|
|
13楼#
发布于:2004-08-26 13:08
有一个问题,一直不理解,大家讨论一下,zlg书上说,d12上电挂起
suspend为低,请问,d12什么原因会导致上电挂起,怎样解决这个问题,有人碰到过这种状况吗,怎么处理的。 状态:d12没有任何反应,int,suspend为低,3.3v输出正常, clock输出正常,4mhz。不接受指令,没有任何动作。 |
|