Aprovechando la comunicación SPI con 328U

Estoy tratando de extraer datos de una pantalla alfanumérica de 4x14 segmentos controlada a través de 2*595 en serie y 4 transistores. Los datos en serie se alimentan desde STM32f103, su firmware no debe cambiarse. El problema es que Atmega con 16 MHz no puede hacer frente al reloj SPI de 2,2 MHz de ARM. Y es una palabra continua de 16 bits, Atmega solo tiene un búfer SPDR de 8 bits.

¿Existe alguna solución de un solo chip que me permita almacenar datos de la línea de datos y leerlos en un reloj más lento como maestro entre transiciones? No tengo suficientes pines para hacerlo en paralelo. ¿Funcionará el reloj or-wired (diodos) en el 595?

Respuestas (4)

Si tiene acceso a los 595, es posible que pueda registrar los datos en serie de ellos después de que el STM32 los haya cargado. El ATmega monitorearía la señal de bloqueo (quizás usando la interrupción de cambio de pin), luego registraría los datos a través del pin QH 'del segundo 595 una vez que se haya almacenado en los registros de salida.

Debería cambiar la entrada de reloj 595 entre el reloj SPI del STM32 y una salida de reloj del ATmega. Si el reloj SMT32 está inactivo bajo, bastaría con una puerta OR simple, o podría hacer un multiplexor a partir de 4 puertas NAND (un IC 74HC00).

esquemático

simular este circuito : esquema creado con CircuitLab

Latch funciona a 125 Hz y tengo 10 pines.
No sé cómo sucedió eso, ¡se suponía que era un comentario!

Me preocupa que un 328p no sea rival para un Cortex-M3 de 72 MHz con DMA. La velocidad del reloj SPI no es el problema (328p puede subir hasta F_CPU/2), sino el tiempo entre bytes. Puede obtener fácilmente un byte, el periférico SPI le dará una interrupción. Luego debe procesar/almacenar ese byte y esperar al siguiente. Si el STM32 usa DMA, literalmente no hay demora entre bytes, por lo que no importa cómo optimice el código ISR, perderá datos.

Yo atacaría el problema con un SN74LS674 - registro paralelo de entrada y salida en serie de 16 bits. Conéctelo a todas las salidas de los 595 y lea el SPI.

Una solución es un pequeño micro de 8 bits con un subsistema SPI que pueda manejar esta velocidad. 2,2 MHz no es muy alto para SPI, por lo que la mayoría de los micros "modernos" deberían hacerlo y tener suficiente RAM para almacenar todo. La lectura se puede hacer de cualquier manera conveniente para el Arduino.

Probablemente no encontrará un IC personalizado para esta aplicación y, si lo encuentra, será más costoso que un PIC o AVR pequeño de 8 pines. Los microcontroladores son hoy en día a veces más baratos que los 595.

Le sugiero que no necesite trabajar con el registro de desplazamiento de salida de alta velocidad. Lo que usted describe es una pantalla multiplexada simple donde los dígitos individuales (14 segmentos) se encienden durante períodos relativamente largos por las 4 señales de habilitación. Las salidas de datos son estables durante todo el período de visualización de cada dígito.

  1. Lleve las señales de habilitación de cuatro dígitos a 4 pines de entrada de 328p usando el borde descendente (supongo que aquí) para activar una interrupción. Ahora tiene un ISR para cada dígito, ya que está habilitado. Dado que es probable que la velocidad de exploración de los dígitos sea inferior a 2 kHz, puede esperar que cada dígito esté habilitado durante aproximadamente 500 us.

  2. Alimente los bits de datos de 14 segmentos en multiplexores 2 * 8: 1 (74HCT151), con los bits de salida yendo cada uno a un pin de entrada en su 328p.

  3. Utilice tres bits de salida en el 328p para configurar el bit que se recibe desde el byte bajo/alto de los segmentos.

Para el código, cuando reciba una Interrupción de la habilitación de dígitos:

  1. Establezca la selección en cero (0x000) para los multiplexores
  2. Lea el bit LS en cada byte y almacene el valor en 2 ubicaciones de memoria por dígito.
  3. Inc seleccione para recorrer y leer cada bit en el byte bajo/alto.
  4. Retirado

Dado que las interrupciones nunca entran en conflicto, puede usar una sola rutina para leer/repetir y simplemente configurar un puntero para almacenar los bits altos/bajos.

Esto terminaría siendo una solución de 2 chips + MCU, con 6 pines de entrada y 3 pines de salida utilizados en el 328p. Es posible que también necesite resistencias pullup en los transistores de exploración. (debería proporcionar información esquemática para poder determinar la necesidad)