¿Selección de dispositivo SPI Flash utilizando SCLK, MOSI y SS?

4

En un sistema con dispositivos N SPI, normalmente tomaría N + 3 pines en el maestro para comunicarse con todos ellos (NxSS, SCLK, MOSI, MISO). Dado que N es grande y el dispositivo maestro (FPGA) está limitado por PIN, estoy considerando las siguientes 2 técnicas para aumentar el número de posibles dispositivos SPI en el sistema; y me gustaría saber si hay alguna razón (adicional) que no se debe utilizar? (He enumerado las razones que se me ocurren al final)

Técnica 1) Utilice las líneas 'K' SCLK (y las líneas 'N' SS) para "seleccionar" dispositivos NxK. Solo 1 línea SCLK estaría activa a la vez.

  • U1: SCLK1 y SS1 (U2 seleccionado pero no recibe reloj)
  • U2: SCLK2 y SS1 (U1 seleccionado pero no recibe reloj)
  • U3: SCLK1 y SS2 (U4 seleccionado pero no recibe reloj)
  • U4: SCLK2 y SS2 (U3 seleccionado pero no recibe reloj)

simular este circuito : esquema creado usando CircuitLab

11 líneas (MISO, MOSI, 5xSS, 4xSCLK) podrían operar una matriz 4x5 de 20 dispositivos).

Técnica 2) Multiplex MOSI, usando líneas 'J' MOSI que envían comandos nulos a todos los dispositivos menos uno, esperando que solo el dispositivo seleccionado responda y los otros sigan teniendo una alta impedancia en MISO.

  • U1: MOSI1 y SS1 (U2 seleccionado pero recibe un comando nulo)
  • U2: MOSI2 y SS1 (U1 seleccionado pero recibe un comando nulo)
  • U3: MOSI1 y SS2 (U4 seleccionado pero recibe un comando nulo)
  • U4: MOSI2 y SS2 (U3 seleccionado pero recibe un comando nulo)

simular este circuito

Nuevamente, 11 líneas podrían operar una matriz 4x5 de 20 dispositivos.

Usando ambos esquemas juntos, los 11 pines podrían usarse como 4xSS, 3xMOSI, 3xSCLK, 1xMISO, totalizando 36 combinaciones de dispositivos seleccionables de forma única (virtualmente seleccionables). Con respecto al flash serie Atmel 25M01, no puedo encontrar ningún problema con el uso de los dos esquemas anteriores. (No conozco a ningún maestro SPI que haga esto; se haría una implementación personalizada en un FPGA).

Las preocupaciones que he considerado son:

  1. Un pulso en SS y no proporcionar un reloj puede poner a un dispositivo esclavo en un estado desconocido, especialmente si hay actividad en MOSI (lo dudo; toda la "actividad" se recibe a través de los bordes SCLK. La documentación de Atmel indica que El esquema de comunicación SPI se "reinicializa" después de cada ciclo de SS)
  2. Un nivel activo en SS ya podría poner el MISO de un chip en modo de manejo (como el flash serie Atmel AT25M01, creo que la mayoría de los chips esperaría un comando antes de salir de alta impedancia).
  3. El envío de un comando NULL aún podría invocar una respuesta; de hecho, no existe una definición de un comando "Nulo", solo el concepto de un comando "no válido". (la documentación de Atmel indica que no responderá a un comando no válido y permanecerá en alta impedancia)
  4. El diseño podría cambiarse algún día y se agregará un dispositivo SPI diferente. ¿La mayoría de los dispositivos Flash SPI abordan las inquietudes anteriores o tengo suerte con el 25M01?
  5. Algunos dispositivos, como el Maxim MAX1242 ADC, toman medidas inmediatas únicamente debido al borde activo de SS; el ADC inicia una conversión en la transición alta → baja.
  6. Edit: Una de las preocupaciones en las que no pensé es en la expansión. (como se mencionó en la respuesta; pensé que merecía mencionarse aquí)
pregunta Michael

2 respuestas

3

Creo que su solución probablemente funcionará, dentro de algunas restricciones. El más obvio es que "todos los esclavos SPI deben mostrar precisamente el mismo comportamiento de bus que un Atmel 25M01". Además, prefiero la técnica 1. Algunas respuestas específicas:

  1. Un PGE en una línea / CS debería siempre hacer que cualquier transacción de bus incompleta finalice inmediatamente, por lo que incluso si se genera un reloj falso impar en los dispositivos seleccionados que no son el objetivo actual, serán Se despeja en funcionamiento normal. Del mismo modo, una ventana / CS que no encierre ninguna transición en SCLK no debería iniciar ninguna transacción de bus.
  2. Esto es más de un problema. Debe estar seguro de que esto no sucederá y, como se indicó, deberá tener claro, para fines de mantenimiento, que los nuevos dispositivos SPI no impulsan activamente la línea MISO hasta que reciban un comando de "lectura". Es posible que desee considerar la posibilidad de fan-out, también; Sé que las salidas de alta impedancia no representan una gran carga, pero vale la pena prestar atención a 19 de ellas.
  3. Si no usas la técnica 2, entonces esto no importa ...
  4. Los dispositivos de memoria SPI, particularmente los más grandes, están cumpliendo cada vez más con los estándares JEDEC para el comportamiento de las comunicaciones. Si elige dispositivos compatibles con JEDEC, no debería tener problemas de interoperabilidad, al menos hasta que cambien los estándares.
  5. Es cierto, pero muchos SPI ADC realmente usan el reloj SPI para ejecutar la máquina de estado de aproximación sucesiva del ADC. Sin ciclos de reloj, sin salida. Dicho esto, podrían conducir el autobús inmediatamente. De vuelta a mi punto original: establezca un estándar y requiera que los dispositivos esclavos que no cumplan con el estándar no estén conectados a la matriz del bus.
respondido por el markt
1

Algunos dispositivos flotarán en su línea de salida hasta que reciban un comando de "lectura", mientras que otros lo conducirán tan pronto como se seleccionen. Si está utilizando dispositivos que harán flotar su salida hasta que reciban un comando, y que cuando se seleccionen quedarán perfectamente satisfechos sin controlar su salida si reciben una secuencia de 00 o FF bytes después de ser seleccionados, y si no le importa usar En las rutinas de bit bang del software, es posible que pueda conectar los dispositivos como un "cubo", con cables CS, cables CLK y cables MOSI, que son los planos, filas y columnas; Sin embargo, la capacitancia en MISO podría ser un problema.

Para controlar 64 dispositivos, podría inclinarme a usar dos chips 74HC138 ( enlace ) - Uno para controlar CS y otro para controlar el reloj; use un 74HC151 ( enlace ) para multiplexar MISO (conectando los chips en grupos de ocho, controlando el reloj y MISO juntos).

    
respondido por el supercat

Lea otras preguntas en las etiquetas