¿Se pueden multiplexar varios pines CS con un registro de desplazamiento?

4

Cuando se comparte una línea de datos SPI entre varios IC y un Arduino, ¿cuáles son exactamente las restricciones de frecuencia del pin CS? ¿Puedo usar un registro de desplazamiento para multiplexar los pines CS (por lo tanto, solo se requiere un pin de E / S, el CS de registro de cambios, fuera del Arduino)? ¿O CS debe estar sincronizado cuidadosamente con SCK (para evitar la basura si CS es demasiado alto "tarde")

    
pregunta joaocandre

3 respuestas

3

Las hojas de datos suelen ser bastante claras sobre los problemas de tiempo relacionados con las líneas de selección de chips, por lo que le insto a que use la hoja de datos relevante para el dispositivo. Algunos dispositivos pueden activarse en el mismo punto en el que se les envían los datos; otros dispositivos necesitan un espacio libre entre el CS que baja y los datos SPI que se aplican.

Sí, puede usar un registro de cambios para seleccionar solo un dispositivo en particular, pero este registro de cambios puede necesitar un lavado regular para garantizar que con el tiempo no se haya "acumulado" un nivel extra bajo que podría causar la selección simultánea de dos chips. En general, usaría un decodificador de 3 a 8 líneas para la selección de chips o líneas GPIO individuales para cada chip periférico.

    
respondido por el Andy aka
2

No es tan simple. Piensa en la secuencia de lo que sucede:

  • Active el CS en el registro de desplazamiento
  • Registre el CS del dispositivo en el registro de desplazamiento
  • Negar el CS al registro de desplazamiento
  • Registre los datos en el dispositivo
  • Active el CS en el registro de desplazamiento
  • Registre los datos CS del nuevo dispositivo en el registro de desplazamiento
  • ...

El último paso es un problema potencial. Dado que la CS para el primer dispositivo aún se afirma mientras esto sucede, se intentará interpretar los "nuevos datos de CS del dispositivo" como datos destinados a ella.

Entonces, aunque puede usar un registro de desplazamiento para seleccionar entre un número arbitrario de líneas de CS de dispositivo, aún necesitará una señal de "CS de dispositivo" separada del Arduino para afirmar (y negar) la línea seleccionada (s). ).

    
respondido por el Dave Tweed
0

Si desea usar un solo GPIO para controlar todas las líneas CS, puede usar un contador de anillo recto . Tiene una única entrada de reloj y n salidas (según el tamaño). De las n salidas, solo una es alta en un momento dado, dependiendo de si las CS son activas o de alto uso, NO las puertas en consecuencia.

Todo lo que tiene que hacer es contar cuántas veces ha marcado el contador de timbre. Si desea poder programar los chips en cualquier orden, también está bien, porque en la mayoría de los circuitos integrados si no hay el número correcto de relojes antes de que se desactive la línea CS, se borran los buffers de entrada.

Así que todo lo que haces:

El contador de timbres del reloj x veces para activar el CS requerido

Reloj en datos

Clock Ring counter una vez para desactivar el CS actual

Enjuague. Repetir.

Sugiero obtener un contador de timbre con al menos un estado más que necesite para tener un estado en el que no haya CS activo, después de cada transferencia de datos, solo marque el contador del timbre en esa posición.

Con respecto a su pregunta original, solo asegúrese de poner una pequeña demora entre la sincronización del timbre y el inicio de la transferencia de datos.

    
respondido por el Tim Mottram

Lea otras preguntas en las etiquetas