Diseño USB OTG

Buenos días,

Estoy teniendo problemas en entender el funcionamiento de la configuración hardware del USB OTG, y no encuentro la manera de aclarar las ideas. Estoy trabajando en el desarrollo de una placa que trabaje tanto como Host como Device (USB OTG). Hasta aquí todo bien, y más cuando hay bastantes esquemas de referencia por la red ( Adjunto a este post ).

Lo que tengo claro es cuando mi placa actúa como Host. Al tener una alimentación aparte, todo funcionará, y en cuanto conecte un esclavo a mi placa, el pin ID irá a GND, cerraré el switch (en mi caso he escogido el AP2151) y alimentaré lo que tenga conectado. Perfecto.

Cuando tengo mi placa como Device, no entiendo como podré alimentar la placa. En el esquema se ven una fuente externa de 5 y 3v3 pero ese voltaje no estará ahí porque no estoy conectado a nada.
Según he leído en el datasheet, el pin USB_VBUS es solo para sensar si hay tensión en el pin. Pero no se usa para coger la alimentación para los reguladores internos ni nada. De donde sacaré la tensión para alimentar el controlador?

Conectar la tensión del USB a la entrada del regulador (5V) no me sirve por diferentes motivos: A veces usaré el USB para actualizar el firmware del chip, si estoy alimentando con una fuente externa, al conectar el USB y actualizar el firmware, la tensión de 5V siempre estará en la línea del USB, así que no podré saber cuándo el cable está conectado o desconectado para correr la actualización. Aparte no tendría ningún sentido tener un Switch para controlar cuando soy Host, y ninguna protección en caso de cortocircuito (peligro para el device que pueda conectar a mi host en caso de tener problemas).

Estoy seguro que no tiene ningún misterio pero me estoy perdiendo algo y no hay formar de averiguar-lo.

A ver si podéis echar-me una mano!

Gracias de antemano!

Saludos
 

Adjuntos

  • OTG.png
    OTG.png
    34.9 KB · Visitas: 64
Por lo que he visto en varios dispositivos como tablets, si el dispositivo es esclavo se carga, deja entrar corriente, y si es master alimenta al dispositivo conectado; deja salir pero no entrar.
No se si eso es reversible o no.
Por ejemplo en la raspberryPI si que se deja alimentar desde el USB pero en este caso solo es usb master.
 
Gracias por la respuesta Scooter.

Exacto. El concepto Host - Device lo tengo claro. El problema es donde conectar físicamente la tensión de entrada cuando mi placa esta actuando como esclavo para alimentar todo mi sistema y no tener los problemas que he comentado anteriormente.
 
Pues lamento no poderte ayudar, no se como funciona.
Puedes revisar el esquema de la raspberryPI que es público que yo sepa, que actuando como master deja que entre corriente para alimentar la placa, y luego si acaso si encuentras esquemas de otros circuitos.

Me parece que la rPI pasa lo que dices; si el "pendrive" que conectes está fastidiado te tumba todo el sistema. En un PC no va así; una vez por error cortocircuité una placa arduino y el USB del PC dejó de funcionar pero al reiniciarlo volvió a funcionar, osea que lleva un "fusible electrónico" que lo protege un tanto, al arduino se le quemó un diodo que tuve que cambiar. (Evidentemente el PC no funciona si se alimenta por el USB)

Si averiguas algo postealo; me interesaría que mi tablet cargase por usb mientras es master.
 
No entiendo el problema.

Cuando tengo mi placa como Device, no entiendo como podré alimentar la placa. En el esquema se ven una fuente externa de 5 y 3v3 pero ese voltaje no estará ahí porque no estoy conectado a nada.

¿Esto significa que no está la fuente externa?

Según he leído en el datasheet, el pin USB_VBUS es solo para sensar si hay tensión en el pin. Pero no se usa para coger la alimentación para los reguladores internos ni nada. De donde sacaré la tensión para alimentar el controlador?

Normalmente se puede llegar a tomar alimentación para el hardware USB del micro, pero no se cual estarás usando. ¿Es una placa de desarrollo?

Conectar la tensión del USB a la entrada del regulador (5V) no me sirve por diferentes motivos: A veces usaré el USB para actualizar el firmware del chip, si estoy alimentando con una fuente externa, al conectar el USB y actualizar el firmware, la tensión de 5V siempre estará en la línea del USB, así que no podré saber cuándo el cable está conectado o desconectado para correr la actualización. Aparte no tendría ningún sentido tener un Switch para controlar cuando soy Host, y ninguna protección en caso de cortocircuito (peligro para el device que pueda conectar a mi host en caso de tener problemas).

¿Querés actualizar el firmware cuando el maestro/host USB se desconecta o mientras está activo ?.
¿La placa tiene fuente externa siempre?, ¿aún en el rol de esclavo?.
¿O en modo esclavo la fuente externa no está y querés alimentar la placa a partir de la tensión Vbus del USB?.
 
En mi caso por ejemplo, tengo un tablet que carga por el conector minusb pero si hace de maestro no carga.
Por ejemplo, le pongo un hub con alimentación externa y los dispositivos se alimentan del hub, pero el tablet no carga.
En una raspberry pi si, la mía la tengo así, alimentada de un hub del que cuelgan varios USBs

No se cual es la aplicación que busca vicdela, pero podría ser una tarjeta que siempre se alimente por el USB independientemente de si a ratos el USB es "entrante" o "saliente". Si pincha un pendrive o si pincha un PC
 
Última edición:
Yo leo algo un poco confuso.

Si un dispositivo es device se debera conectar a un host, y ese host le provee tension de 5V desde el pin V_USB.

Un dispositivo no puede ser device si no se conecta a nadie.
 
Estoy desarrollando una placa con un chip EFM32 basado en Cortex M3. Vamos un chip ARM.
Quiero considerar todas las opciones posibles, de las cuales tengo:

1. Mi placa es Master. Tiene alimentación externa y conecto un Slave a mi USB.

Con el esquema adjuntado en el primer post esto esta solucionado gracias al switch. En este punto no hay ningún problema.

2. Mi placa es Esclavo. No tiene alimentación externa y conecto un Master en mi USB.

Esta es la segunda revisión que hago de la placa. En la primera conecté la tensión V_USB a la entrada de los reguladores. Todo genial, ya que si no tengo fuente externa, los 5V del USB van al regulador y alimentan mi placa. En el tercer punto explicaré porque no puedo aplicar esta solución.

3. Mi placa es Esclavo, tengo fuente externa y quiero conectar el USB, por ejemplo, para actualizar el firmware. Una aplicación seria si tengo mi placa en un sistema embebido y conectado por ejemplo a una batería. No puedo desconectar la alimentación externa. Aplicando la solución que hice en mi primera revisión, siempre tendré una tensión de 5V en la V_USB ya que están conectadas entre ellas para poder solucionar los puntos 1 y 2. Lo que no sabia es que el USB stack detecta la conexión o des-conexión del cable para correr cualquier cosa, y con la solución que hice, mi chip cree que nunca he desconectado el USB. Asi que la solución de conectar el V_USB a la entrada del regulador no es valida.
Se me vienen a la cabeza muchas aplicaciones. Por ejemplo una bici eléctrica que este ensamblada con su batería, y se le tenga que actualizar su software sin desconectarla.

Una vez he estado buscando he visto los típicos esquemas de OTG pero no entiendo como se alimentaria mi placa cuando soy device si los 5V provenientes del USB están solo conectados a V_USB. Creo haber entendido en el datasheet que este pin solo sensa si hay una tensión o no, pero nunca como entrada de alimentación del chip.

Muchisimas gracias a todos por la ayuda!
 
Hola,

Fijate en el sitio de Microchip, hay muchas aplicaciones como la que vos comentas.

Para la conexion de V_USB a la entrada de los reguladores tambien tenes que usar un switch controlado, ese switch es normalmente cerrado pero si el dispositivo se despierta en modo host lo abre.

Asimismo necesitas switches para configurar pull-up o pull-down en las dos lineas de datos segun sea modo host o device.
 
Aaaahhh, entonces el problema es que no se puede detectar si hay un host USB conectado o no cuando la placa funciona como device/esclavo con alimentación externa.
¿Y por qué actualizar el firmware solo al desconectar el host/maestro/PC y no mientras está enchufado?. No importa, es curiosidad, lo tomo como requerimiento derivado de que el stack USB no funciona sin la capacidad de detección de host presente a través de la tensión en V_USB.

¿Que tal algo como?
Código:
Vext ---------------regulador---------------Vmcu
            |
Vusb---|>|---
Diodo schottky entre la tensión Vusb que viene del conector USB, y la entrada al regulador que va a estar conectada a Vext.
A su vez el Vusb también estaría conectado al pin Vusb o Vbus del micro.

El diodo va a impedir que la tensión Vext "se meta" en Vusb. Pero si no hay Vext la placa seguiría funcionando igual solo con Vusb.
Desconozco si eso es posible, a lo mejor en la placa Vusb se conecta directamente a la entrada del regulador y no hay posibilidad de meter el diodo. Habría que ver el esquemático de la placa.
 
@chclau

Le echare un ojo a Microchip, a ver si encuentro algo parecido a lo que quiero. Comentaré por aquí cuando lo tenga todo bien mirado.

@Ardogan

Exacto, el sensar Vusb es un requerimiento del stack USB.

Si no he entendido mal tu idea, es la que usé en un proyecto antiguo. El problema es que con esta configuración el diodo schottky no me deja alimentar a un posible esclavo. Es decir con la fuente externa, si quiero alimentar un slave en mi placa, no podré alimentarlo.

Yo me encargo del diseño de la placa asi que se puede hacer cualquier invento :D
 
@chclau

Si no he entendido mal tu idea, es la que usé en un proyecto antiguo. El problema es que con esta configuración el diodo schottky no me deja alimentar a un posible esclavo. Es decir con la fuente externa, si quiero alimentar un slave en mi placa, no podré alimentarlo.

Yo me encargo del diseño de la placa asi que se puede hacer cualquier invento :D

Entonces, la idea es poder utilizar el usb como esclavo o maestro, y que cuando haya esclavo no se meta alimentación en el pin USB que va al micro, porque en tal caso la API/stack USB lo detectaría como maestro, ¿es así?.
En tal caso que tal algo como :
Código:
Vext---------------regulador------Vmcu
              |
Vusb-----|>|---
       |
       -----pmosfet------Vusb(micro)
              |
EN_AP(micro)---


Vext--------AP2151-------Vusb
              |
EN_AP(micro)---

Vusb: terminal del conector USB
Vusb(micro): terminal del microcontrolador, utilizado por la API para comunicación USB

EN_AP = 1: pmosfet off, sin conexión entre Vusb y Vusb(micro), con conexión entre Vext y Vusb
EN_AP = 0: pmosfet on, con conexión entre Vusb y Vusb(micro), sin conexión entre Vext y Vusb

Nota: verificar tiempos de encendido de mosfet y ap2151 para que no haya cortos transitorios

Bueno, si estás diseñando la placa podrías unificar ap2151 y pmosfet poniendo 2 pmosfet o 2 ap2151 (para reducir diversidad de componentes).

Se podría utilizar el pin ID del connector USB OTG para activar/desactivar los mosfet/llaves y así queda resuelto en hardware. No sé que pasa con el pin ID al insertar un host vs insertar device. Creo que en un caso queda a GND y en el otro flotante, ¿pero cual es cual?.
 
Entonces, la idea es poder utilizar el usb como esclavo o maestro, y que cuando haya esclavo no se meta alimentación en el pin USB que va al micro, porque en tal caso la API/stack USB lo detectaría como maestro, ¿es así?.

Exacto ! :)

En tal caso que tal algo como :
Código:
Vext---------------regulador------Vmcu
              |
Vusb-----|>|---
       |
       -----pmosfet------Vusb(micro)
              |
EN_AP(micro)---


Vext--------AP2151-------Vusb
              |
EN_AP(micro)---

Vusb: terminal del conector USB
Vusb(micro): terminal del microcontrolador, utilizado por la API para comunicación USB

EN_AP = 1: pmosfet off, sin conexión entre Vusb y Vusb(micro), con conexión entre Vext y Vusb
EN_AP = 0: pmosfet on, con conexión entre Vusb y Vusb(micro), sin conexión entre Vext y Vusb

Nota: verificar tiempos de encendido de mosfet y ap2151 para que no haya cortos transitorios

Muy interesante ! Muchísimas gracias. Imagino que tendré que poner una carga en la Drain para asegurar el cambio de estado del MOSFET. Tengo dos candidatos, a ver que te parecen:

http://www.mouser.com/ds/2/115/DMP21D0UT-278045.pdf

o

https://www.fairchildsemi.com/datasheets/FD/FDV304P.pdf

Muy parecidos. Solo cambia un poco la corriente que pueden aguantar 0.5 vs 0.41A. Creo que me decantaré por el primero para asegurar.

Me preocupa un poco el Schottky. Debería buscar uno que tenga una Vforward pequeñísima para que no me afecte a los componentes que trabajan con 5V cuando mi placa es device. He encontrado este :

http://www.mouser.com/ds/2/302/PMEGXX05EH_EJ_SER-353436.pdf

Aunque Vf es 0.35V... sé que es baja pero me sigue pareciendo mucho...(4.65V) Aguanta una corriente constante de 0.5A así que debería ir bien... que opinas?

Se podría utilizar el pin ID del connector USB OTG para activar/desactivar los mosfet/llaves y así queda resuelto en hardware. No sé que pasa con el pin ID al insertar un host vs insertar device. Creo que en un caso queda a GND y en el otro flotante, ¿pero cual es cual?.

En los próximos días probaré de montarlo en una proto para testearlo y te digo. Si no recuerdo mal lo del ID, device esta a GND y master flotando...

Muchísimas gracias por la ayuda de nuevo.
 
Imagino que tendré que poner una carga en la Drain para asegurar el cambio de estado del MOSFET.

¿Me falta un resistor pero no se si en el drain, no sería un pull-up en el gate?. Ah... me parece que estamos imaginando el mosfet conectado de distinta forma, vos pensaste:
Código:
Vext---------------regulador------Vmcu
              |
Vusb-----|>|---
       |
       -----S-G D-----Vusb(micro)
              |    
       EN-----|
y yo pensé

Código:
Vext·--------------regulador------·Vmcu
              |
Vusb·----|>|---
       |
       -----D-G S-----Vusb(micro)
              |
       EN-----|
El resistor hay que ponerlo entre el gate G y GND o Vusb, dependiendo si queremos que este normalmente en on o en off respectivamente (es decir, con el pin EN flotante).

Creo que funcionaría de las 2 maneras, pero el riesgo es que si queremos que este normalmente en off (resitor entre G y Vusb) se puede terminar aplicando al pin del micro una tensión Vusb >Vmcu lo que se debe evitar, a menos que sea 5V tolerant.

Tengo dos candidatos, a ver que te parecen:

http://www.mouser.com/ds/2/115/DMP21D0UT-278045.pdf

o

https://www.fairchildsemi.com/datasheets/FD/FDV304P.pdf

Muy parecidos. Solo cambia un poco la corriente que pueden aguantar 0.5 vs 0.41A. Creo que me decantaré por el primero para asegurar.

Más que la corriente me preocupa el Vgs-threshold, que es un poco bajo. Si la señal EN viene del micro y es de 3.3V precisamos un threshold superior a:
Vusb - nivel alto = (peor caso) = 5V - 3V = 2V

De lo contrario el mosfet va a quedar encendido siempre, aunque pongamos en la pata EN 0V o 3.3V no se va a apagar.
Entonces pienso que con un pmosfet logic level con Vgs>2.5V podría andar.
Ver por ejemplo
http://www.digikey.com/product-search/en/discrete-semiconductor-products/fets-single/1376381
Columna "FET feature" elegir "logic level 2.5V" hasta 4V máximo (sino no lo vamos a poder encender :p ),


Me preocupa un poco el Schottky. Debería buscar uno que tenga una Vforward pequeñísima para que no me afecte a los componentes que trabajan con 5V cuando mi placa es device. He encontrado este :

http://www.mouser.com/ds/2/302/PMEGXX05EH_EJ_SER-353436.pdf

Aunque Vf es 0.35V... sé que es baja pero me sigue pareciendo mucho...(4.65V) Aguanta una corriente constante de 0.5A así que debería ir bien... que opinas?

Ah, no sabía que había cosas alimentadas con 5V (aparte de la pata de Vusb del micro que con 4V debería poder detectarlo). También depende con que tensión de entrada trabaja el regulador que alimenta al micro (LDO, switching, lineal).

Pero si la caída de tensión es problemática, mosfet!!!!. Seguimos con mosfet p para bajar diversidad de componentes.

¿Andará algo como esto?:

Código:
Gnd ---res--+       
            |      
Vext--------+-----+--regulador------Vmcu
            |     |
Vusb---+--S G D --+   (equivale a diodo si hay Vusb> Vext)
       |
       +----S-G D-----Vusb(micro)
       |      |
      res     |  (pmosfet on cuando EN = 0, 
       |      |   pin EN debe soportar Vusb)
EN-----+------+
En los próximos días probaré de montarlo en una proto para testearlo y te digo. Si no recuerdo mal lo del ID, device esta a GND y master flotando...

Muchísimas gracias por la ayuda de nuevo.

Guarda!!!, que no estoy 100% seguro de que lo que propongo pueda funcionar, a tomar todo con pinzas que si empieza a salir humo yo no sé nada :rolleyes:
 
jajajaja lo sé! por eso probaré primero en proto :D

La opción del Schottky me convence más que poner otro MOSFET. La caída es 0.35. He revisado la tensión de alimentación mínima para los componentes con 5V y es de 4.5. Y el regulador es un switching con salida ajustable. En el peor de los casos reajusto el calculo de resistencias contando que tengo de entrada 4.65 en lugar de 5 y sigo teniendo los mismos 3V3 a la salida

No acabo de entender el problema con la tensión de threshold. Es la tensión mínima g-s que necesito para cerrar d-s. Controlando con un micro, con la entrada de 3V3 ya lo satura, no? si es baja ( el caso que puse eran 0.7, ya funcionará no? ) o estoy liandome con los canales n y p :D

El tema de la carga, me refería a poner una carga en si, no una de pull up/down para definir un estado. Me he encontrado en situaciones, que sin carga en el drain, el MOSFET no me cambiaba totalmente de estado... es decir, empezaba a funcionar perfectamente en cuanto ponia una resistencia entre la drain y massa. Pero eso es un tema aparte que un día tendré que sentarme a evaluar

Adjunto esquemático de lo que probaré en proto
 

Adjuntos

  • IMG_20150508_110810.jpg
    IMG_20150508_110810.jpg
    77 KB · Visitas: 20
Buenos días,

Simplemente para cerrar el tema y ayudar a alguien si tiene alguna duda similar.

Finalmente la implementación hablada en el hilo si que pudo ser testeada con éxito y desde el punto de vista eléctrico todo funcionó perfectamente. Solo un apunte: para switchear el AP2141 son necesarios 5V asi que una I/O normal no me funcionaba (3V3): tuve que usar un MOSFET (esquema del ultimo post).

Por desgracia, el hecho de habilitar y deshabilitar el MOSFET con un I/O no fue suficiente ya que necesitaba sensar la tensión del USB para el USB stack.

La última bala que queda por quemar es la de probar de controlar el FET con el ID del USB. Por desgracia, no tengo tiempo de probarlo ahora mismo, aunque si encuentro el hueco, lo probaré y os comentaré resultados.

Un saludo y muchísimas gracias por la ayuda :)
 
Hola amigos del foro.

Tengo una duda y necesito ver si ustedes me pueden ayudar con ella: ¿Si yo ocupo una Resistencia de 3.4KΩ y solo tengo una de 4.7ΩK, la puedo usar en ves de la de 3.4KΩ, osea en un circuito puedo usar una resistencia de más alto valor que el valor de la resistencia que ocupo?

Es que no tengo un OTG con entrada tipo C para el celular (un OTG es un cable adaptador para conectar un mouse, un teclado o una memoria USB al celular por la entrada de carga) y estoy haciendo uno que vi en YouTube con un conector tipo C de un cable que tengo dañado, pero el conector está en buen estado y todo lo que ocupó es quitar la resistencia propia que tiene conector tipo C y soldar un resistencia de 3.4KΩ entre el pin de color violeta y el pin GND del conector tipo C y con eso ya funciona.

Espero sus respuestas, gracias...
 
Hola amigos del foro.
Hola
Tengo una duda y necesito ver si ustedes me pueden ayudar con ella: ¿Si yo ocupo una Resistencia de 3.4KΩ y solo tengo una de 4.7ΩK, la puedo usar en ves de la de 3.4KΩ, osea en un circuito puedo usar una resistencia de más alto valor que el valor de la resistencia que ocupo?
No, no puedes. Si se pudiera solo se fabricaría de uno de los dos valores. De hecho en ocasiones hacen falta más valores para según qué montajes, hay muchas series de valores de resistencias.
En algún caso particular es posible que si. En general NO
Es que no tengo un OTG con entrada tipo C para el celular (un OTG es un cable adaptador para conectar un mouse, un teclado o una memoria USB al celular por la entrada de carga) y estoy haciendo uno que vi en YouTube con un conector tipo C de un cable que tengo dañado, pero el conector está en buen estado y todo lo que ocupó es quitar la resistencia propia que tiene conector tipo C y soldar un resistencia de 3.4KΩ entre el pin de color violeta y el pin GND del conector tipo C y con eso ya funciona.
Prueba a ver, en ese caso particular es posible que funcione indistintamente de uno u otro modo. Si no va tampoco vas a romper nada. Puede que funcione con un teléfono y con otro no.
Lee las especificaciones del OTG y pruebas.
Es un tema muchas veces tratado en el foro y muchas veces respondido, si hubieses buscado lo habrías visto.
Espero sus respuestas, gracias...
Ahí las tienes, de nada.
 
Atrás
Arriba