SPI entre MCUs

1

Como recién llegado a la programación PIC, busco algunas ideas sobre cómo implementar SPI entre un MCU maestro y esclavo de la manera más eficiente.

El propósito de este sistema es proporcionar una manera extremadamente flexible de 'mapear' hasta 32 pines de salida individuales de la MCU esclava a cualquiera de los 32 pines de entrada de la MCU maestra, usando una 'matriz' configurable por software .

Para aclarar un poco más las cosas, agregué un dibujo a continuación:

AlgunaotraMCU(quenoseencuentraeneldibujo)administralaconfiguracióndelmapeodepuertosytransfiereestainformaciónalaMCUesclavacomouna"matriz de puertos" a través de I2C.

En el ejemplo de 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 asignarse a la entrada B.6

Entonces, cuando el pin maestro A.1 se eleva, el pin esclavo B.3 también debería subir. Desde el punto de vista de la aplicación, eso debería ser más firme.

Pero, ¿cuál sería la forma más eficiente de leer 32 bits desde 4 puertos en el maestro y tenerlos representados en el esclavo como un 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 2MHZ para ser funcionalmente aceptable. ¿Es DMA una solución aquí? ¿Puede dicha solución de transporte estar basada en interrupciones / eventos para evitar que la CPU realice el sondeo? Los MCU de destino son PIC32MX795.

Definitivamente, podría usar algunos consejos para hacer que esta comunicación continúe.

Gracias de antemano!

    
pregunta Peterstevens

3 respuestas

1

Para la transmisión de datos: la forma más fácil de hacerlo es con los registros de desplazamiento. No tendrá que preocuparse por los microcontroladores lentos, ni tampoco sobre la programación del hardware en CPLD.

Tomemos por ejemplo 74HC164 y 74HC166

Puede conectar en cascada cuatro 74HC166 para crear un registro de desplazamiento de entrada / salida en paralelo de 32 bits y luego deserializar usando cuatro 74HC164 (registro de entrada en paralelo / salida en paralelo de 32 bits). Estos chips pueden hacer 100Mhz fácilmente, cuestan casi nada y requieren un mínimo de circuitos alrededor.

El problema es que la "matriz de asignación de pin" que querías usar. Construir esto con puertas sería doloroso.

    
respondido por el student
0

Si usted mismo está dispuesto a golpear el protocolo de comunicación, la forma más rápida sería utilizar las 4 líneas para enviar los estados de los pines (8 pines de datos por línea).

La idea aquí es utilizar básicamente un protocolo serie de un solo cable. Como 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 de 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ás:

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 comprobación al final para verificar que no tuvo errores de lectura. Para implementar esto, tendrá que esperar a que la línea baje (puede usar una interrupción para esto), y desde ese punto implementando esencialmente cualquier otro algoritmo serial - muestre 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 grabarlo.

Luego, todo lo que tienes que hacer es compactar los datos recopilados de las 4 líneas con algunos cambios de bits y escribirlos directamente en la salida.

    
respondido por el Catsunami
0

Sus requisitos son bastante estrictos (2Mhz, 10us delay) para que se realice en un PIC con 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 CPLD pequeños pueden hacerlo también. En lugar de escribir software, implementaría SPI bit banging en VHDL o Verilog en el lado maestro y luego esclavo podría ser su controlador CNC, PIC u otro CPLD.     

respondido por el student

Lea otras preguntas en las etiquetas