¿Hay algún chip de puente USB a SPI *esclavo* disponible?

Me gustaría conectar un dispositivo alimentado por batería a USB, sin requerir que los usuarios instalen controladores. Los requisitos de transferencia de datos son moderados, por lo que ~60kbytes/seg del modo HID estaría bien, pero no quiero ser mucho más lento que eso. Es probable que el procesador principal funcione con baterías, incluso cuando se conecta un cable USB, por lo que me gustaría que el procesador entre en reposo cada vez que la PC no se esté comunicando activamente.

He estado considerando usar un puente de USB a serie, pero los que he visto con la mayoría de los microcontroladores requieren que la velocidad de datos sea lo suficientemente lenta como para adaptarse al tiempo de respuesta de interrupción del puerto serie en el peor de los casos. Además, mientras que todos los que he visto permiten que un controlador indique si está listo para recibir datos, ninguno tiene ningún medio para pedirle a un controlador "no listo" que se prepare. Todos los chips de puente USB a SPI que he visto se limitan a actuar como maestros SPI, lo que empeoraría aún más las cosas para cualquier microcontrolador conectado a ellos.

Una interfaz USB que actuara como un esclavo SPI con un pin de interrupción parecería ideal, ya que podría comunicarse muy rápidamente cuando el procesador principal quisiera comunicarse, y podría decirle al procesador principal cuándo necesita atención, pero no perdería datos incluso si la PC debía enviarlo justo cuando el procesador principal quería ir a dormir (la interrupción desencadenaría una activación en aproximadamente 100 microsegundos, después de lo cual el controlador podría preguntar qué sucedió y luego recibir datos). A diferencia de los puentes USB a serie o USB a SPI maestro, que necesitan almacenamiento de configuración no volátil, el maestro SPI al que está conectado puede configurar un puente USB a esclavo SPI, lo que posiblemente reduzca los requisitos de silicio. .

Debería ser posible, al menos, usar un microcontrolador compatible con USB barato y programarlo para que actúe como un puente; si alguien ha hecho algo así y lo ha lanzado como código abierto, lo usaría antes que volver a implementarlo. Podría ser posible usar un UART en lugar de SPI si el dispositivo admitiera el protocolo de enlace y tuviera un pin que indicara cuándo tenía datos para enviar (incluso cuando se retuvo); tal enfoque podría ser necesario cuando se usa un microcontrolador como puente, ya que la mayoría de los microcontroladores son pésimos esclavos SPI. Por otro lado, si tal cosa está disponible como una parte comercial económica, parecería más fácil que tener que comprar chips de microcontrolador y luego programarlos. ¿Alguien tiene alguna recomendación?

Apéndice

Tal vez debería haber aclarado que estoy tratando de encontrar algo realmente barato y estoy evaluando las posibilidades de usar un controlador principal con USB integrado en lugar de usar algún tipo de puente. El uso de un puente puede permitir el uso de un procesador principal más económico que el que se necesitaría de otro modo, y puede simplificar el diseño de la fuente de alimentación (dado que el puente podría alimentarse por USB sin tener que asegurarse de que el procesador reciba alimentación del USB de +5 V en lugar del batería de +6V cuando ambos suministros estaban disponibles); incluso si bridge+CPU termina siendo uno o dos centavos más que una CPU principal compatible con USB, la separación del USB de las otras funciones de la CPU aún podría terminar siendo una "ganancia".

De los diseños que he construido hasta ahora, mi favorito usó un FT245 en combinación con un CPLD ubicado en una placa de teclado/pantalla/USB que se comunicaba con la placa principal a través de una interfaz estilo SPI de 3 hilos (dos cables desde la placa principal ; un cable yendo hacia atrás). Cuando el reloj y los datos estaban en estado inactivo, el CPLD usaría el retorno de datos para indicar cuándo la CPU principal necesitaba repararlo (porque se presionó un botón, los datos llegaron al USB, el USB se conectó/desconectó, etc.) .) La CPU principal podría entonces, en su tiempo libre, despertarse, preguntarle al CPLD qué quería exactamente y hacer lo que fuera necesario. Realmente me gustó ese estilo de comunicación, pero el FT245 y el CPLD juntos cuestan demasiado. Además, poder utilizar HID en lugar de CDC podría mejorar la experiencia del cliente final.

Conceptualmente, parecería que un chip que fue diseñado para servir como puente entre el USB y una CPU que fue diseñada para comunicarse con él podría ser eléctricamente más simple y económico que las interfaces de USB a otras cosas que he visto desde que salió. no necesitaría ningún tipo de almacenamiento de configuración no volátil y no requeriría muchas opciones de configuración, principalmente habilitaciones para los diversos puntos finales, posiblemente algunos tiempos de espera y una memoria para datos para alimentar al host en el punto final de control. La mayor parte de la otra lógica sería manejada por el procesador conectado. Desafortunadamente, no conozco ningún dispositivo de este tipo que esté realmente a la venta.

Tal vez el chip serial FT232H USB a multiprotocolo pueda hacer lo que usted quiera.
Maxim Integrated ofrece el motor de interfaz serial USB MAX3421E, controlado a través del puerto SPI de un microcontrolador externo. Compre o pruebe MAX3421EEHJ+ directamente del fabricante: maximintegrated.com/en/products/interface/controllers-expanders/… Kit de evaluación y notas de aplicación disponibles. ( Disclosure: Trabajo en Maxim. Esta es una parte más antigua que creo que no estamos promocionando activamente, pero aún está disponible. Menciona el uso del controlador de dispositivo HID, consulte las notas de la aplicación 3936 y 3937). Espero que esto ayude.
La mayoría de los microcontroladores habilitados para USB podrían hacer esto, al menos en la medida en que se pueda hacer. Si bien los micros tienden a "ser más felices" actuando como maestros SPI, la mayoría también pueden ser esclavos.
¿Sería demasiado caro algo como Atmega8U2/16U2?
La diferencia de precio entre MCU con capacidad USB y una combinación de MCU+Bridge en la mayoría de los casos es a favor de una sola MCU. Eso se suma a una PCB más simple y pequeña, que también puede influir en el precio. El único inconveniente es la necesidad de agregar una pila USB a su código.
@Maple: El mercado ha cambiado un poco desde que hice la pregunta original. Ciertamente estoy de acuerdo en que hoy en día el aumento de precio de la funcionalidad USB dentro de un micro ha bajado mucho, pero en 2014 fue significativo.
Oh, me engañó una vieja pregunta una vez más. ¡¿Qué está haciendo ese bot de la comunidad, empujando más y más reliquias todos los días?!

Respuestas (3)

El convertidor FTDI USB a serie siguió mi MCU en modo esclavo SPI.

El firmware simplemente transferiría datos entre el SPI en el puerto a la línea Tx para enviarlos a través del FTDI al puerto USB.

De manera similar, el firmware almacenaría en caché los datos Rx del puerto USB/serie y los colocaría en el búfer SPI Tx a la espera de que se vuelvan a leer.

Dos IC simplemente solución para lograr USB a SPI esclavo.

¿Conoces algún controlador con un modo esclavo SPI decente? Todos los que he visto requieren que la tasa de bytes SPI se configure lo suficientemente lenta como para que el tiempo entre bytes siempre exceda el tiempo más largo que el controlador podría necesitar dedicar (sin interrupciones) a alguna otra tarea.
cuales has mirado? No hay limitaciones de velocidad con PIC hasta donde yo sé. Obtiene una interrupción cuando hay datos recibidos completos, copia el valor del búfer y borra la interrupción, trabajo hecho. Luego, su bucle principal puede analizar si es necesario, preparar la respuesta si es necesario o enviar los datos a chorro al FTDI, que los canalizará a través de un túnel USB/serie. A diferencia de los datos descendentes, la principal diferencia es que cuando recibe datos de la PC, es posible que deba almacenarlos en un búfer esperando que el maestro SPI extraiga los datos.

Creo que, desde el punto de vista del costo y el espacio de la placa, un uC compatible con USB (por ejemplo, el ATTiny85) sería el mejor enfoque. Puede personalizarlo con cualquier protocolo que desee que vea su CPU principal, viene con unos cientos de bytes de RAM para almacenar en búfer mientras se procesa la interrupción de activación, y es un SOP-8 que cuesta literalmente unos centavos.

ATTiny85 no es compatible con USB.
@dim tienes razón, lo siento... olvidé por completo que estos pequeños módulos son en realidad una solución de dos chips con un transceptor USB separado.

Este chip FTDI funciona como un esclavo I2C y parece ser relativamente barato:

http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT200XD.pdf

Y este funciona como un esclavo SPI:

http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT220X.pdf

Creo que el FT220X requiere sus controladores libres de regalías y no actúa como un HID.