microcontrolador de alta velocidad - comunicación pc

Tengo un proyecto en el que tengo que muestrear un bus de 4 bits cada 100 ns continuamente para una aplicación de registro de datos (también necesito una fluctuación de muestreo muy baja). Tengo un uC que puede alcanzar los 300 MHz, por lo que la velocidad no es un problema, pero mi desafío actual es obtener datos del uC a una PC.

40Mbit/s prácticamente descarta UART o similar, dejando USB y Ethernet como posibilidades. ¿Existen otras formas más rápidas y sucias de lograr esta velocidad? O si no, cuál es la mejor manera de comenzar, ya que nunca antes había usado Ethernet/USB en un diseño uC.

Trabajar con un dispositivo USB es bastante fácil, ¿puedes decirnos qué uC y qué ide estás usando?
Un problema mayor puede ser el sistema operativo en la propia PC. A menos que tenga un almacenamiento en búfer significativo en su dispositivo de muestreo, se encontrará con retrasos en la PC que provocarán la pérdida de datos. Para algo como esto, le sugiero que busque alguna forma de interfaz de acceso directo a la memoria de la PC. También "continuamente" a 10 megamuestras por segundo hay MUCHA memoria o espacio en disco.
@Trevor: Las interfaces Ethernet y USB integradas en prácticamente todas las PC disponibles en la actualidad ya están ajustadas para el rendimiento. No debería haber necesidad de preocuparse por la implementación del lado del host con ese nivel de detalle.
@DaveTweed en serio... Tienes una PC con Windows, ¿verdad? Incluso este asunto del SE se cuelga durante unos segundos de vez en cuando cuando el sistema operativo decide ir a hacer algunas tareas domésticas, y tengo una PC decente.
@Trevor: Sí, y esta PC tiene suficiente memoria (16 GB) para almacenar en búfer una gran cantidad de datos cuando sea necesario. Puedo ver videos, descargar archivos enormes, etc., a más de 40 Mbps sostenidos. Esto se está desviando del tema, pero los bloqueos de SE son causados ​​​​principalmente por servidores lentos en el otro extremo, no sucede nada en el navegador. Las páginas SE son terriblemente complejas y requieren literalmente cientos de transacciones de red para hacer cualquier cosa.
Una PC debería poder manejar la velocidad de línea 1000BaseT sin darse cuenta. Por lo tanto, 100BaseT, si elige correctamente los tamaños de paquete (para reducir la sobrecarga y acercarse demasiado a sus 40 Mbps), no debería ser un problema para la PC. Probablemente pueda salirse con la suya haciendo muchas trampas en la pila de red si lo desea, pero vea lo que ve.
dependiendo de los datos, aunque puede ser mejor obtener instrumentos nacionales u otra tarjeta que se conecte a pci o pcie para realizar este registro, no debería tener problemas con el ancho de banda ni con el almacenamiento. solo necesita encontrar la tarjeta/producto adecuado para la señal que desea muestrear.
@MudassirHussain, la mayoría de los microcontroladores "fáciles de usar" con USB solo funcionarán a 12 Mbit/seg. Hay muy pocos que hagan USB HS, y la mayoría requerirá un PHY externo (p. ej., STM32, NXP, etc.). El FX2LP es muy barato y puede hacer fácilmente lo que quieras, pero requiere que trabajes con su 8051. El FX3 puede hacer 2.5 Gbps y usa un ARM7.
@Trevor Diseñé personalmente un dispositivo USB3 usando el FX3; Literalmente, no hubo ningún problema para que una PC de la era 2012 con Linux, OSX o Windows 7/8 mantuviera el flujo de datos de 2.5 Gbps que estaba generando.
@akohlsmith suspiro, no digo que no se pueda hacer, digo que puede encontrarse con problemas que toman mucho más tiempo de lo que imagina para ajustarse. Algo que necesita saber antes de comprometerse con el diseño de hardware.
@ Trevor, entiendo lo que dices. Estoy tratando de decir que no es el problema que parecías plantear en tu primera publicación sobre el tema. Esta era una PC win7 sin sintonizar que se encontró en un entorno de oficina promedio en 2012. YMMV, por supuesto.
¿Cómo se sincroniza el muestreo de la MCU con el tiempo medio en baudios para garantizar una muestra válida? Deslizar las fases del reloj te matará.

Respuestas (2)

Un problema mayor puede ser el sistema operativo en la propia PC. A menos que tenga un almacenamiento en búfer significativo en su dispositivo de muestreo, se encontrará con retrasos en la PC que provocarán la pérdida de datos.

Obtuve un rendimiento total completo de 480Mbps USB entre un micro USB2 y una aplicación de PC Linux escrita en Python. ¡Ni siquiera en C! Utiliza libusb, que recomiendo. libusb le permite iniciar transferencias masivas directamente, sin tener que escribir un controlador. Es bastante simple de usar.

Debe utilizar DMA de dispersión y recopilación. Lo bueno es que ese debería ser el valor predeterminado. La idea es que pase una lista de búferes vacíos a libusb. Estos se colocan en una lista enlazada que es administrada por el propio hardware USB . Cada vez que su dispositivo envía un paquete, el chip USB dentro de la PC toma un búfer libre de la lista y lo llena. Luego, periódicamente activa una interrupción para que su aplicación pueda recopilar los búferes llenos. Este proceso está completamente administrado por hardware, funcionará incluso si la CPU está ocupada, intercambiando, etc., siempre que le proporcione suficientes búferes libres. La CPU de la PC no se molesta en procesar cada paquete. De hecho, puede pasar grandes búferes (como 64kB) y el hardware USB acumulará paquetes en ellos y hará ping a su aplicación cuando el búfer esté listo para su consumo.

Con suficientes búferes, no debería perder paquetes. No lo hice, y la cosa funcionó durante horas mientras compilaba kernels de Linux y cualquier otra cosa que pudiera arrojarle. ¡Los conjuntos de chips Smart DMA son notablemente inteligentes!

Dado que el micro funciona a 300 MHz, supongo que es una bestia y no tendrá como 1kByte de RAM. Necesitará almacenar en búfer el valor de unos pocos cuadros, por lo que un par de decenas de kilobytes estará bien. Asegúrese de configurar el núcleo USB incorporado con DMA, fifo o recopilación de dispersión adecuados, cualquiera que sea el uso de su chip, pero es importante utilizar el modo más eficiente.

Si elige Ethernet, esto es básicamente lo mismo. Las NIC de PC tienen DMA de dispersión y recopilación, así que simplemente configure el búfer de socket en "yuuuuge" y deje que el hardware haga su trabajo. Puede usar UDP, no necesita TCP.

Sin embargo, Ethernet requerirá la construcción de paquetes UDP en su firmware, lo que lleva un poco de tiempo. El hardware USB2 dividirá los datos en paquetes por usted. Pero Ethernet está aislado y permite longitudes de cable mucho más largas, lo que puede ser útil.

Además, Ethernet no bloqueará una PC. Jugar con USB cuando su dispositivo USB experimental tiene errores puede hacer cosas raras en su PC. Los controladores de su sistema operativo solo se han probado en dispositivos USB que funcionan. Entonces, cuando su micro se bloquea entre algunas fases de la transacción USB, en particular la enumeración, o envía datos falsos que hacen que la pila de controladores sienta repentinamente una necesidad urgente de asignar -1 bytes de memoria, puede esperar que la PC haga "WUT". y tiene que presionar la tecla de Windows (es decir, el botón de reinicio). Uso una computadora portátil chatarra sin datos.

Si le preocupa que UDP pierda paquetes... Lo dejé funcionando durante 24 horas, con dos cables de 10 metros de tienda de dólar y un extensor de tienda de dólar en el medio, sin pérdida de paquetes a 100Mbps full dúplex.

Bueno, eso fue un poco como un volcado de información, pero debería funcionar bien. Estaría más preocupado por cómo su micro sincronizará la adquisición, no espere disparar una interrupción cada 100 ns... necesitará hardware y DMA para esto. Si usa 4 bits, ¿quizás podría hackear el puerto cuádruple SPI? O si asigna un puerto DMA a pines...

Otra solución sería un micro Cypress FX2LP EZ-USB. Tiene un FIFO de hardware, por lo que si le das un reloj, en cada ciclo tomará 8 bits de sus pines de datos y los enviará a la PC a través de una transferencia masiva USB2. Todo en ferretería. Debe escribir sobre una página de código C para el firmware, saludar a la PC, enumerar y conectar el hardware FIFO al punto final USB. Sin embargo, obtienes 8 bits en lugar de 4 ... ¡hey, son 4 bits gratis!

De todos modos. Siendo realistas, uno de estos debería hacer el trabajo.

+1 Buena respuesta. Es bueno que el usuario sea consciente de lo que implica todo el panorama antes de que dedique una cantidad considerable de tiempo y dinero a desarrollar el hardware y el software. ¿Cuál era el punto que estaba tratando de hacer antes de que me borraran... suspiro?
Sí estoy de acuerdo. Lo que salva a la PC es el motor DMA de dispersión y recopilación en el conjunto de chips USB. Incluso si la CPU está atascada haciendo otra cosa, seguirá transfiriéndose. Es probable que FX2LP sea el más simple. Me tomó como un día hacerlo funcionar con libusb, y nunca antes había hecho un USB... es un chip simple.
Estaba investigando un poco más en los uC de la serie TMS320 y aparentemente sus USB no pueden manejar las velocidades que necesito. Al ver cómo tengo que escribir esto desde cero y porque el tiempo es esencial (se acerca una propuesta de subvención), ¿es el chip cyperess una buena manera de hacerlo? Además, he usado el analizador lógico Salee, pero no transmite constantemente, sino que almacena en búfer, vuelca y vuelve a funcionar y este es un lugar en el que no puedo permitirme perder paquetes.
Lo siento, pero no puede obtener un rendimiento de "480 Mbps completo" en USB 2.0 sin importar qué. El USB tiene sobrecarga de marco (SOF-EOP1-EOP2), sobrecarga de protocolo (IN-ACK, el relleno de bits no permite que el sistema programe más de 11 búferes masivos por microtrama, conservadoramente 10), y hay una sobrecarga de sistema para administrar TRB . Además de la sobrecarga del sistema de archivos. Lo mejor que se puede hacer es alrededor de 45 MBps o 360 Mbps.
@AliChen: por supuesto, como Ethernet de "100 Mbps" también incluye gastos generales y da como resultado unos 10 MB/s más o menos, USB 480 Mbps incluye gastos generales... en cuanto al ancho de banda neto de alrededor de 45 MB/s, suena bien. Mucho para las necesidades de OP. Estaba enfatizando que incluso una aplicación de PC de prueba de concepto escrita en python no tiene problemas con el ancho de banda, ya que eso parecía ser una gran duda para OP. El hardware moderno es asombroso. En cuanto a la sobrecarga del sistema de archivos, no habría ninguna, ya que este no es un dispositivo de almacenamiento masivo...
Escribir en Python todavía depende de quizás 1000 años de ingeniería que Microsoft y/o Linux invirtieron en el controlador de host USB xHCI/EHCI/OHCI/UHCI. La aplicación escrita en Phyton es una prueba de que ehci.sys funciona según lo previsto. Y OP necesita almacenar sus resultados en algún lugar. [A su velocidad de datos, un disco duro de 2T puede almacenar alrededor de 4 a 5 días de registro de datos].
Hola a todos, ¡Gracias por la entrada! 45 MB/s es suficiente si es cierto. Comenzamos con 5 MB/s y podemos llegar a 20 si todo funciona. En cuanto al almacenamiento de datos, se está utilizando para experimentos preliminares de conteo de fotones, por lo que la adquisición de datos solo debe durar entre 3 y 5 horas. @peufeu, parece que está sugiriendo que el FX2LP puede transferir datos a través de un bus paralelo. Nuestros datos que estamos leyendo se pueden configurar como una interfaz paralela de 4 bits: ¿es posible configurar el chip pero hacer que los datos de la adquisición se alimenten directamente sin pasar por el uC?
@JasonYang Sí, FX2LP tiene un puerto paralelo con una luz estroboscópica y un reloj. Dispone de varias opciones de configuración vía firmware. Básicamente, aliméntelo con bits y un reloj, se transferirá a la PC. Sin embargo, es un puerto de 8 bits, por lo que obtendrá cuatro bits adicionales sin usar que puede eliminar en el software de la PC, o tendrá que agregar un circuito lógico con algunas chanclas para convertir dos segmentos de 4 bits en 8 bits. .
@AliChen Recomiendo FX2LP porque lo he usado antes, pero ¿sería más simple un chip FTDI para el caso de OP?
@peufeu, ¡Gracias por la sugerencia! voy a mirar esto Por el lado del software, ¿tiene algún código de referencia sobre cómo acceder a los datos a través de USB? ¿Es similar a leer un puerto serie o se necesitará una configuración adicional?
google "tutorial de libusb python" encontrará un ejemplo, agregue "Cypress FX2" debería encontrar un firmware de ejemplo para el FX2. Hice esto hace unos 10 años, así que no recuerdo los detalles exactos, pero libusb + Cypress FX2 es una combinación popular debido a que no necesita controladores. Se necesita alguna configuración, pero por lo que recuerdo, era bastante simple (como, código de ejemplo de copiar y pegar, bingo)

Su velocidad de datos sostenida efectiva es de 5 Mbytes/s. Esta tasa debería ser bastante fácil de manejar con cualquier chip FIFO USB 2.0, Cypress o FTDI. USB 2.0 puede soportar 35-40 Mbytes/s de una manera. Creo que ambas empresas ofrecen ejemplos de sistemas de adquisición de datos basados ​​en sus arquitecturas, con controladores gratuitos para PC. La mayoría de los llamados "oscopios de PC" y "analizadores lógicos de PC" están construidos alrededor de estos chips USB-FIFO.

Todo lo que necesita para garantizar al menos un simple almacenamiento en búfer de ping-pong de su lado, empaquete dos nibble de 4 bits en un byte, eso es todo.