Al tocar la comunicación SPI con 328U

1

Estoy intentando 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 que ejecuta 16MHz no puede hacer frente al reloj SPI de 2.2MHz 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 las transiciones? No tengo suficientes alfileres para hacerlo en paralelo. ¿Funcionará el cableado (diodos) en el 595?

    
pregunta FeroFixxer

4 respuestas

0

Si tiene acceso a la 595s, entonces podrá despachar los datos en serie después de que hayan sido cargados por el STM32. El ATmega monitorearía la señal de enclavamiento (tal vez usando una interrupción de cambio de pin), luego registrará los datos a través del pin QH 'del segundo 595 una vez que se haya almacenado en los registros de salida.

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

simular este circuito : esquema creado usando CircuitLab

    
respondido por el Bruce Abbott
1

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

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

    
respondido por el filo
0

Una solución es una pequeña micro de 8 bits con un subsistema SPI que puede 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 amortiguar todo. Se puede leer de cualquier manera conveniente para el Arduino.

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

    
respondido por el pipe
0

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

  1. Lleve las señales de habilitación de cuatro dígitos a 4 pines de entrada 328p usando el flanco descendente (supongo que aquí) para desencadenar una interrupción. Ahora tiene un ISR para cada dígito cuando está habilitado. Dado que es probable que la velocidad de escaneo de los dígitos sea inferior a 2 kHz o menos, por lo que podría esperar que cada dígito esté habilitado para aproximadamente 500 us.

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

  3. Use tres bits de salida en el 328p para establecer el bit que se recibe del byte bajo / alto de los segmentos.

Para el código, cuando reciba una interrupción desde el dígito habilite:

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

Dado que las interrupciones nunca entran en conflicto, puede usar una sola rutina para leer / hacer un bucle y simplemente configurar un puntero para almacenar los bits alto / bajo.

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. También es posible que necesite resistencias pullup en los transistores de exploración. (deberá proporcionar información esquemática para poder determinar la necesidad)

    
respondido por el Jack Creasey

Lea otras preguntas en las etiquetas