maestro SPI dual con ATmega32u4

1

Surgió una necesidad inesperada en mi diseño, que es controlar 2 dispositivos SPI esclavos simultáneamente. Al principio, por supuesto, planeaba usar el SPI Bus como de costumbre y controlar ambos dispositivos usando los pines / CS para que todo pareciera estar bien.

Al revisar la hoja de datos del dispositivo A hoy, noté que espera todos los datos de una sola vez, lo que significa que no puedo realizar el procedimiento que originalmente había planeado:

1) Seleccione el dispositivo B 2) Leer los datos de B 3) Deseleccionar dispositivo B 4) Seleccione el dispositivo A 5) Escribe los datos de B 6) Deseleccionar dispositivo A 7) Repita hasta que todos los datos de B vayan a A (alrededor de 1.1 Mbit)

El dispositivo A asume que cuando su / CS aumenta, es el final de la secuencia de datos. Por supuesto, no puedo leer todo desde B en una ejecución y almacenarlos en MCU RAM, ya que los datos son mucho más grandes.

Naturalmente, lo siguiente que me vino a la mente es utilizar 2 SPI maestros separados al mismo tiempo: seleccione ambos chips, lea el byte de B y aliméntelo inmediatamente a A.

Entonces, mis preguntas son:

a) ¿Es posible usar un ATmega32u4? Tiene un papel fundamental en el diseño general y el cambio a otro MCU sería un paso atrás.

b) Leí que el USART puede actuar como un segundo maestro SPI. ¿Es eso viable y confiable? ¿Qué tan difícil es implementar?

c) Si, desafortunadamente, no es posible y tengo que cambiar MCU, ¿cuál recomendaría? Tenga en cuenta que la capacidad USB de ATmega32U4 es esencial.

d) ¿Es probable que el nuevo proceso (leído de B, feed to A) cause algún comportamiento inesperado? No parece en mi punto de vista, lo pregunto por si acaso soy un ingeniero nuevo.

¡Cualquier otra idea o dirección es bienvenida! Gracias de antemano.

ACTUALIZACIÓN En caso de que desempeñe un papel importante, el Dispositivo A es un FPGA, mientras que B es una memoria flash. La MCU tiene una doble función: descargue el flujo de bits desde la PC a través de USB y guárdelo en la ROM flash / use el flujo de bits almacenado para configurar el FPGA al reiniciarlo / encenderlo. Tanto el FPGA como el flash usan SPI. De acuerdo con la hoja de datos de la FPGA (familia ice40, Lattice, " Programación y configuración iCE40 "p.26), la imagen debe programarse sin interrupción.

    
pregunta Manos

4 respuestas

3

Es posible que desee adoptar un enfoque diferente por completo. En lugar de conectar la PROM y la FPGA a la µC como dispositivos esclavos, conecte la PROM directamente a la FPGA y permita que la FPGA arranque en el modo maestro SPI en lugar del modo esclavo SPI. Bonificación: el arranque se realizará más rápidamente.

Aún podrá acceder a la PROM desde el µC después de que el FPGA se haya iniciado para actualizaciones de firmware o almacenamiento de datos, pasando las señales de la interfaz SPI del µC a través de la lógica del FPGA.

    
respondido por el Dave Tweed
2

a) Afaik el Atmega tiene solo 1 bus SPI.

b) Sin experiencia (pero soy novato)

c) Yo uso STM # 2 principalmente. Estos tienen 2 buses SPI y si necesitas más, hay versiones que tienen 3 (o incluso más posiblemente). El más barato (cuesta menos que un Arduino) STM32F103C8T6 tiene 2 autobuses SPI.

d) Los buses SPI en el STM32 (y probablemente otros uc) son independientes, por lo que no debería haber ningún problema con el proceso. Sin embargo, dado que STM32 tiene DMA, es posible que pueda hacerlo 'directamente', es decir, enviar los datos SPI entrantes inmediatamente al SPI saliente.

    
respondido por el Michel Keijzers
1

Usted declara que el FPGA asume el final de los datos de configuración cuando se anula la confirmación de CS. ¿Hay un tiempo de espera también? Es decir, si puede tener un retraso indefinido mientras deja la CS activa, ¿se comportará correctamente el dispositivo?

Si simplemente hay una necesidad de evitar que el dispositivo FPGA cierre la transacción, entonces el problema se puede simplificar al mantener el CS seleccionado y no permitir que los comandos de la memoria flash se lean como datos de basura. Para esto, un segundo maestro SPI puede ser excesivo

Sugeriría usar un dispositivo de búfer entre MCU y FPGA para las líneas MISO , MOSI y SCLK , y usarlo para deshabilitar las señales SPI usando el pin de restablecer / habilitar en el dispositivo de búfer.

La transacción se vería como

  1. Activar asíncronamente CS para FPGA
  2. Deshabilitar dispositivo de almacenamiento intermedio
  3. Lea el dispositivo FLASH como de costumbre
  4. Habilitar dispositivo de almacenamiento intermedio
  5. Transacción FPGA (CS ya confirmada)
  6. GOTO 2 hasta que termine
  7. Desincrustación asíncrona de CS para FPGA
respondido por el crasic
0

USART como maestro SPI

Como hoja de datos dice en capitulo 19,

  

El receptor y transmisor en serie sincrónico y asíncrono universal (USART) se puede configurar en un modo de operación compatible con SPI maestro.

Así que puedes tener dos puertos SPI (maestros) independientes para transferir datos entre los esclavos.

Utilizando una I 2 C EEPROM externa

En lugar de un flash SPI, puede conectar una I 2 C EEPROM al puerto TWI (PD0, PD1) en la MCU. I 2 C se llama TWI o Interfaz en serie de 2 hilos en Atmel-ese, pero son esencialmente lo mismo. Desventaja: las EEPROM son generalmente más caras como la memoria flash.

    
respondido por el berendi

Lea otras preguntas en las etiquetas