阅读:2016回复:17
8051如何知道USB芯片已经上电并对它进行初始化?
以8051与PDIUSBD12为例,我们现在采用总线取电的模式(即通过VBUS给D12芯片供电),而8051采用板上电源供电。如果我们先打开8051的电源而不插上USB电缆,此时因为USB芯片没有上电,8051也就不可能为D12进行初始化。那D12内部的寄存器就会为默认的状态,中断寄存器的每一位都为0,因为一般没有内部微控制器的USB芯片都是通过中断驱动的,如果中断寄存器为无效状态,那我们插上USB电缆后,就不会有中断给8051,那是用什么机制来通知8051 D12已经上电,可以进行初始化了呢?难道在上电后,D12的中断寄存器会自动被初始化,然后会发送中断请求给8051吗?希望有明白的大侠给予解答,或者把你们实现的方法说一下,多谢了!
|
|
最新喜欢:![]() |
沙发#
发布于:2002-11-25 23:06
1.用51IC的一个IO脚接在USB +5V上,当USB +5V Pin为高电平时,再等个几百毫秒就可以初始化D12了
2.或是判断D12的INT Pin(上拉接在51 Vcc),当INT Pin由高变底后,再等个几百毫秒就可以初始化D12 ;) :P ;) |
|
板凳#
发布于:2002-11-26 09:03
应该是先接USB电缆,然后再接外接电源供电。8051上电后,程序中有对D12初始化的程序,与主机建立连接。
|
|
|
地板#
发布于:2002-11-26 11:16
如果是先插上USB电缆保证USB芯片已经是上电状态,然后再打开设备电源那问题就没有了,不过现在我们使用的情况是必须首先打开设备,因为8051还有一些其他与USB无关的事情要做,这样就会出现如
何通知8051 USB电缆已经插上可以进行初始化的问题。 楼上linguohui的建议我觉得可行,只是不知道有没有人使用过这种方法。而且我还有一些问题。 对于方法1的情况,那51是不是每隔一段时间需要查询一下该IO的状态?因为IO是不能产生硬件中断的,这样的话在有些情况可能会浪费一些CPU的资源,比如说我的51在USB不工作的时候要进行数据采集 ,那我还必须每过几秒钟查询一下USB是否需要初始化,如果需要初始化我还得使用中断嵌套的形式对它初始化,不知道这是否会影响51当前的工作,因为USB初始化需要时间较长。 对于方法2,我觉得需要讨论一下,因为我看了D12的资料,发现它的INT引脚是低有效,这就是说在没有中断产生的情况下,它会持续为高,那只要一上电该管脚就会持续为高(D12没初始化之前应该不会产生中断吧)。怎么才能让INT pin由高变低呢?我看DATASHEET上是按第二种方法接的,不知道有用过的大侠能否解答一下?本人不胜感激!!! |
|
地下室#
发布于:2002-11-26 11:40
如果是先插上USB电缆保证USB芯片已经是上电状态,然后再打开设备电源那问题就没有了,不过现在我们使用的情况是必须首先打开设备,因为8051还有一些其他与USB无关的事情要做,这样就会出现如何通知8051 USB电缆已经插上可以进行初始化的问题。
楼上linguohui的建议我觉得可行,只是不知道有没有人使用过这种方法。而且我还有一些问题。 对于方法1的情况,那51是不是每隔一段时间需要查询一下该IO的状态?因为IO是不能产生硬件中断的,这样的话在有些情况可能会浪费一些CPU的资源,比如说我的51在USB不工作的时候要进行数据采集,那我还必须每过几秒钟查询一下USB是否需要初始化,如果需要初始化我还得使用中断嵌套的形式对它初始化,不知道这是否会影响51当前的工作,因为USB初始化需要时间较长。 对于方法2,我觉得需要讨论一下,因为我看了D12的资料,发现它的INT引脚是低有效,这就是说在没有中断产生的情况下,它会持续为高,那只要一上电该管脚就会持续为高(D12没初始化之前应该不会产生中断吧)。怎么才能让INT pin由高变低呢?我看DATASHEET上是按第二种方法接的,不知道有用过的大侠能否解答一下?本人不胜感激!!! |
|
5楼#
发布于:2002-11-26 12:00
楼上的linguohui大侠,不知道你所给的方法二中的电平由高到低是如何来的? 还有如果D12没有上电,那它的INT引脚是不是是低电平?
|
|
6楼#
发布于:2002-11-26 14:14
只知道8051,新知识不会。
唉,完了完了! |
|
7楼#
发布于:2002-11-26 14:36
楼上的linguohui大侠,不知道你所给的方法二中的电平由高到低是如何来的? 还有如果D12没有上电,那它的INT引脚是不是是低电平? D12手册中有说明的呀,产生中断请求信号,低有效. MCU在第一次检测到此信号后,可以随你怎么处理。 |
|
|
8楼#
发布于:2002-11-26 15:08
楼上的,你的话是什么意思呀,如果你能告诉我USB芯片与DSP的连接情况那就更好了,其实我们做的项目是用PHILIPS的USB2.0芯片ISP1581与DSP进行连接,不过因为ISP1581也是一款没有内置微处理器(8051)的USB芯片,所以与D12比较相似,再加上开发过D12的人肯定比开发过1581的人多,因此我才这样问这个问题。
其实不管是与51连也好,与其它的控制器(DSP或ASIC)也好,没有内置控制器的USB芯片(指的Device类的)一般都是通过“中断”驱动的,都是USB芯片产生中断给外部控制器,外部控制器响应中断并调用相应的程序处理中断。这样的话我先前提到的问题就会出现,如果是设备先上电,那么用什么机制来通知微处理器来对USB芯片进行初始化! ISP1581的基本情况是:64管脚封装,有三种工作模式:一般微处理器(通常与8051相连),共享总线和DMA,我们准备使用第一种。它的接口是8根地址线,16根数据线,读、写、片选和一个输出到微处理器的INT引脚。所有的总线活动都会在这个中断引脚上选择输出来,比如SOF、SETUP令牌、IN和OUT端点中断包括总线复位。但是在上电复位时ISP1581的中断寄存器会处于禁止所有中断的状态,因此也就不可能为微处理器产生中断,那上电复位初始化程序就无法运行。 我现在的问题就是在上电时怎样在INT引脚上产生一个下降沿或上升沿并且低、高电平持续一段时间,从而导致微处理器的硬件中断,为ISP1581进行初始化。 如果有那位大侠用其它的片子实现了这个功能,不妨说出来让小弟参考参考,先行谢过了!! |
|
9楼#
发布于:2002-11-26 15:35
楼上的,你所说的芯片我没用过,不过D12我做过的,我也是单片机用外部电源,其它的用USB总线供电的。
你应该还是先插USB电缆,然后再让单片机工作。因为USB电缆插上后,主机只能给D125伏的电源,但并没和D12通信,所以D12也没有中断产生给单片机。 然后你单片机在开始运行,在单片机的程序中,你可以先运行与USB无关的部分,等你需要和主机进行USB通信了,你就可以向D12写softconnect(这是philips所特有的技术,我想你们用的芯片也应该有),这一步是关键,这样在USB的D+,D-信号线上会有电平改变,从而主机会检测到有外部USB设备,才开始和D12通信,D12也才会产生中断通知你的单片机处理。 :cool: |
|
10楼#
发布于:2002-11-26 15:35
呵呵,jinghuiren老兄问起问题来真是详尽。
你的问题我理解是这样的:单片机先供电的话,即使D12没供电,单片机中断引脚的状态肯定是自己拉高的,这时与D12是没有关系的。 当D12上电后,上位机对Usb是实时检测的,只要Usb设备一上电,上位机要求获取外设的描述苻,自然就产生中断了,所以,你的单片机尽管做自己的事,D12何时上电,有中断就会自动响应的。 呵呵 ,你说对吗? |
|
11楼#
发布于:2002-11-26 15:43
nod.
上面两位把我想说的都说了,呵呵! |
|
|
12楼#
发布于:2002-11-26 15:48
呵呵,看来英雄所见略同啊! :cool:
|
|
13楼#
发布于:2002-11-26 16:02
哎,看来高手就是高手,多谢诸位了!!!
好像给了一次分就不能再给了,上面几位知道的再告诉我怎么改分吧,我要犒劳犒劳诸位,今天是鄙人生日,散分以示庆祝也好!:) |
|
14楼#
发布于:2002-11-26 21:38
D12的INT Pin在上电前后的状态我可以帮你测一下,不过你自己也可以去做测试,这样印象会更深的
|
|
15楼#
发布于:2002-11-26 22:12
那就多谢楼上的仁兄了,因为我们这边的硬件还没做出来,因此没有办法测,可是现在老板就要求确定下来,我也没有办法,只好求救于你们了,实在是太感谢了!
|
|
16楼#
发布于:2002-11-27 21:58
我测过了,当上拉电阻接51 +VCC时,D12在上电前,INT PIN为高电平,
上电后,立马为低电平 |
|
17楼#
发布于:2002-11-28 14:30
多谢楼上的老兄了,您可是救了我一命呀!:),为了这件事老板已经不止骂了我一次了,昨天晚上还又批斗了我一遍!哎,我看资料上总说只要是上电就会产生复位中断,可是就是没说明这个中断是怎么产生的,而且根据他们提供的寄存器资料,全局中断使能在上电时是无效的,因此不可能有中断产生,那这样看来这个机制是通过芯片的硬件来实现的了!在上电时不管中断使不使能,这个有高到底的过程一定是有的,那所有的问题都解决了。多谢多谢了!
|
|