Como recién llegado a la programación PIC, estoy buscando algunas ideas sobre cómo implementar SPI entre una MCU maestra y una esclava de la manera más eficiente.
El propósito de este sistema es proporcionar una forma extremadamente flexible de "asignar" hasta 32 pines de salida individuales de la MCU esclava a cualquiera de los 32 pines de entrada de la MCU maestra, utilizando una "matriz" configurable por software.
Para hacer las cosas un poco más claras, agregué un dibujo a continuación:
Alguna otra MCU (no en el dibujo) administra la configuración del mapeo de puertos y transfiere esta información a la MCU esclava como una 'matriz de puertos' a través de I2C.
En el ejemplo del dibujo, el puerto de salida esclavo B, bit 0 (B.0) debe asignarse al pin de entrada maestro A, bit 0 (A.0) Además, la salida B.3 debe asignarse a la entrada A.1 y la salida C .6 debe corresponder a la entrada B.6
Entonces, cuando el pin maestro A.1 sube, el pin esclavo B.3 también debería subir. Desde el punto de vista de la aplicación, eso debería ser sencillo.
Pero, ¿cuál sería la forma más eficiente de leer 32 bits de 4 puertos en el maestro y representarlos en el esclavo como un número entero de 32 bits para que la aplicación proporcione la asignación a sus puertos de salida?
El reloj SPI debe ser al menos de 2 MHz para que sea funcionalmente aceptable. ¿DMA es una solución aquí? ¿Puede dicha solución de transporte basarse en interrupciones/eventos para evitar que la CPU realice encuestas? Los MCU de destino son PIC32MX795.
Definitivamente me vendrían bien algunos consejos para poner en marcha esta comunicación.
¡Gracias de antemano!
Para la transmisión de datos: la forma más fácil de hacerlo es con registros de desplazamiento. No tendrá que preocuparse por microcontroladores lentos, ni por hardware de programación en CPLD.
Tomemos por ejemplo 74HC164 y 74HC166
Puede conectar en cascada cuatro 74HC166 para crear un registro de desplazamiento de entrada/salida en serie de 32 bits y luego deserializar usando cuatro 74HC164 (registro de entrada/salida en serie de 32 bits). Estos chips pueden hacer 100Mhz fácilmente, cuestan casi nada y requieren un circuito mínimo.
El problema es esa "matriz de asignación de pines" que quería usar. Construir esto con puertas sería doloroso.
Si está dispuesto a modificar el protocolo de comunicación usted mismo, la forma más rápida podría ser usar las 4 líneas para enviar los estados de los pines (8 pines de datos por línea).
La idea aquí es usar básicamente un protocolo serial de un solo cable. Dado que no tendrá una línea de reloj, deberá usar algún tipo de bit de inicio para identificar el comienzo de la transmisión.
Digamos que las líneas de datos se mantienen altas cuando están inactivas y 0 es el bit de inicio. Si desea transferir 0x12345678 de datos pin (32 bits), transferiría 0x12 en la primera línea, 0x34 en la segunda línea y así sucesivamente.
El patrón de bits en la primera línea se verá así:
0 0 0 0 1 0 0 1 0
^ es el bit de inicio
En la segunda línea obtendrías:
0 0 0 1 1 0 1 0 0
^ es el bit de inicio
Puedes ver a dónde voy con esto. Es posible que desee agregar un bit de suma de verificación al final para verificar que no tuvo errores de lectura. Para implementar esto, deberá esperar a que la línea baje (puede usar una interrupción para esto) y, desde ese punto, implementar esencialmente cualquier otro algoritmo en serie: muestree la línea varias veces por período de bit (duración máxima de un solo bit ) y asegúrese de que el valor sea estable antes de registrarlo.
Luego, todo lo que tiene que hacer es compactar los datos recopilados de las 4 líneas utilizando algunos cambios de bits y escribirlos directamente en la salida.
Sus requisitos son bastante estrictos (2Mhz, 10us de retraso) para que se realice en un PIC con unas pocas docenas de MIPS. Dicho esto, podría ser posible. Pero todavía no es la mejor herramienta para el trabajo.
¿Conoces los FPGA? Son demasiado grandes y caros para esto, pero algunos pequeños CPLD baratos también pueden hacerlo. En lugar de escribir software, implementaría golpes de bits SPI en VHDL o Verilog en el lado maestro y luego el esclavo podría ser su controlador CNC, PIC u otro CPLD.
gbulmer
peterstevens
crosley
brahans
peterstevens
peterstevens