Actualización: probé la solución que propuse en los comentarios en la práctica (utilizando el pin E en el 138 IC durante el cambio de dispositivo de destino) y de hecho funcionó. Lee todo el tema si quieres más detalles.
Estoy intentando multiplexar varios dispositivos SPI utilizando un 74HC138 multiplexor de 3 a 8 . La lógica de mi programa cambió de típico "establecer CS bajo, SPI fuera, establecer CS alto" a algo como:
void selectDevice(int n) {
digitalWrite(mux0, n & (1 << 0));
digitalWrite(mux1, n & (1 << 1));
digitalWrite(mux2, n & (1 << 2));
}
selectDevice(3); // my device
spiOut();
selectDevice(7); // dummy, not used
Funciona perfectamente si solo hay un dispositivo con el que estoy hablando. Sin embargo, hay algunos problemas cuando dos o más dispositivos se usan de esa manera.
Esta brillante respuesta tiene esto:
La línea CS baja, el reloj se desplaza y se desplaza esencialmente en los bits de entrada y elimina los bits de salida, hasta que finaliza la transacción, momento en el cual la línea CS pasa a nivel alto. Cuando su línea CS es alta, los dispositivos esclavos no se comunican: ignoran las líneas CLK y MOSI, y ponen su pin MISO en un estado de alta impedancia para permitir que otra persona lo use.
Este tendría sentido, pero parece contradecirse directamente con el 74HC595 comportamiento de registro de cambios para bajo - > alto ST_CP (así que mi CS) transición de pin:
los contenidos de las etapas de registro de desplazamiento (QnS interno) se transfieren a el registro de almacenamiento y las etapas de salida paralelas
La tabla de comportamiento y el diagrama funcional básicamente indican que ST_CP es irrelevante cuando los datos entran en SH_CP / DS, y se almacenarán en el registro de desplazamiento. Eso significaría que si escribo algunos datos en otros dispositivos, y luego alterno brevemente el pin ST_CP, ¡escribiré esta basura! (asumiendo que la salida esté siempre habilitada).
Como lo veo, esto es precisamente lo que hace mi código de selección, porque los bits no se voltean de inmediato; El multiplexor pasará por otros pines. ¿Eso significa que necesito un pin separado para deshabilitar (hacer alto) todas de las salidas mux durante el cambio? ¿Estoy entendiendo esto correctamente?