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.
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.
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.
Mudasir Hussain
Trevor_G
david tweed
Trevor_G
david tweed
viejo contador de tiempo
viejo contador de tiempo
akohlsmith
akohlsmith
Trevor_G
akohlsmith
analogsystemsrf