¿Compartir el reloj y los datos para 74HC595 y CD4021B Shift Register?

4

¿Los registros de cambios de salida (74HC595) y los registros de cambios de entrada (CD4021B) comparten el mismo reloj y líneas de datos en Arduino usando SPI, con diferentes pines de bloqueo que "activan" cualquiera de las cadenas para cambios de entrada o salida?

Creo que esto debería funcionar, pero aún no tengo todas las partes que necesito para hacer un prototipo. Ya tengo todas esas partes para una solución que NO funciona, y estoy intentando omitir el paso de "opps, esto no funcionará". :-)

Actualmente estoy usando SPI de un Arduino Pro Micro (5v) para dirigir una cadena de 74HC595 registros de desplazamiento para un banco multiplexado de paneles de visualización de 7 segmentos. Cada "Tablero de visualización" tiene dos 74HC595 para manejar un conjunto de monitores, y se conecta mediante un cable plano al siguiente tablero (idéntico), que es el siguiente en una serie de tableros de exhibición encadenados. Esto está construido y funcionando muy bien. Uso un bucle de lo siguiente para escribir datos en los registros de desplazamiento 74HC595.

SPI.transfer(myByteOut);

Me gustaría agregar un sensor de IR (Vishay TSOP75356WTR) a cada placa. El Arduino podría detectar si el sensor IR en cada tablero encadenado es alto o bajo.

Mi plan es expandir la configuración del tablero de visualización existente agregando una cadena paralela de registros de cambio de entrada ( CD4021B ?) Para regresar al Arduino las lecturas del sensor IR de cada placa. Esto se haría a través de un bucle de

myByteIn = SPI.transfer(0);

¿Una cadena de 74HC595 y una de CD4021B pueden compartir los mismos datos y líneas de reloj, usando diferentes pines de "traba" para alternar entre la lectura de mi entrada (CD4021B) y la escritura de mi salida (74HC595)?

Se requiere alta velocidad, y Arduino solo tiene un par de alta velocidad basado en hardware, así que necesito compartir el reloj y los pines de datos. ¿Eso funcionará? ¿Algo malo con mi plan?

    
pregunta starvingmind

2 respuestas

2

Si puedo responder mi propia pregunta. Deberia de funcionar. He aquí cómo con arduino sobre SPI.

void setup() {
    //Setup SPI
    SPI.begin();
    //Setup CD4021
    pinMode(CD4021_PSC_PIN9, OUTPUT);
    digitalWrite(CD4021_PSC_PIN9,HIGH);
    //Setup 74HC595
    pinMode(HC595_LATCH_PIN12, OUTPUT);
    digitalWrite(HC595_LATCH_PIN12,HIGH);
}

void loop(){
    //Shift out to 74HC595
    digitalWrite(HC595_LATCH_PIN12,LOW);
    SPI.transfer(BYTE_DATAOUT);
    digitalWrite(HC595_LATCH_PIN12,HIGH);

    //Shift in from CD4021B
    digitalWrite(CD4021_PSC_PIN9,LOW);
    BYTE_DATAIN = SPI.transfer(0x00);
    digitalWrite(CD4021_PSC_PIN9,HIGH);
}

Aprendió de aquí , de alguien que ha hecho esta implementación exacta anteriormente.

    
respondido por el starvingmind
2

Si ambos pueden operar a una frecuencia de reloj SPI mutua, entonces no veo un problema. SPI es un protocolo de comunicación de un solo extremo, por lo que no debería haber ningún problema al conectar dos cables a la misma conexión.

Solo tendrá que asegurarse de tener en cuenta qué bits están almacenados actualmente en los registros en todo momento para que pueda asegurarse de que se traba en el momento adecuado.

En cuanto al código, no estoy seguro de si el entorno arduino le permitirá conectar dos dispositivos al mismo objeto SPI, ya que tendrá su propio cierre adjunto al objeto, pero le permitirá saber que cualquier dato una línea de datos SPI irá a ambos dispositivos, solo tendrá que bloquearlos de manera inteligente.

    
respondido por el Funkyguy

Lea otras preguntas en las etiquetas