¿Es seguro interrumpir SPI?

17

Estoy escribiendo en una tarjeta microSD desde mi firmware, pero es la tarea de menor prioridad, así que puede ser interrumpido por otras tareas mientras está en medio de la lectura / escritura.

Ahora, supongamos que me comuniqué con esta tarjeta microSD utilizando un UART. El problema durante las lecturas sería que el RX de hardware FIFO se desbordaría, por lo que el retraso máximo que puedo realizar sería (tamaño FIFO × bytes / segundo), y durante las escrituras no habría ningún problema, porque el otro extremo solo esperaría hasta que envíe el siguiente carácter.

¿Cómo funciona esto ahora que estoy usando SPI? ¿Es la situación la misma que para las escrituras no importa, y para las lecturas depende del tamaño de SPI FIFO?

    
pregunta Muis

2 respuestas

22

La gran mayoría de los dispositivos SPI estarán perfectamente satisfechos a cualquier velocidad de datos por debajo del máximo especificado. Uno podría realizar parte de una transacción, tomar un descanso en cualquier momento, volver unos años más tarde y terminarla. Siempre que no haya fallas en el reloj, la selección o las líneas eléctricas, la transacción se completará normalmente.

Hay tres advertencias principales a tener en cuenta:

  1. En general, una vez que una transacción ha comenzado en un bus SPI, ninguno de los cables en el bus puede usarse para ningún otro propósito hasta que se complete la transacción. En general, esto significa que una interrupción no puede usar un bus SPI, excepto cuando es lo único que usará el bus (puede ser posible que la interrupción tenga uso exclusivo del bus en algunos momentos, y para la mayoría de los usuarios). Programa para uso exclusivo en otros horarios). Algunos dispositivos incluyen pines especiales que les permiten "ignorar" el bus en medio de una transacción, pero incluso con tales características no recomendaría que se interrumpa la interrupción de una transacción SPI con un dispositivo, realice una transacción con otro dispositivo, y luego deje que el código subyacente reanude su transacción con el primero. Mejor tener la interrupción usar un bus SPI separado.
  2. Algunos dispositivos pueden comportarse de manera extraña si una transacción se prolonga durante demasiado tiempo. Algunos chips de reloj en tiempo real, por ejemplo, no almacenan en búfer doble los registros de fecha / hora sino que en su lugar bloquean los eventos de "avance de tiempo" que se producirían durante una transacción y los aplicarán después de que se complete la transacción. Si una transacción demora tanto que llega un segundo evento de avance de tiempo, este último evento se ignorará, lo que hará que el reloj se deslice por esa cantidad de tiempo. Realmente no veo ninguna excusa para diseñar un chip de tal manera (incluso si uno no quisiera el costo de duplicar el búfer de los datos, especificando que el software era responsable de asegurar que su coherencia sería más barata que agregar la lógica de "aplazamiento de actualización", y minimizaría la probabilidad de perturbación del reloj), pero tales chips existen.
  3. Hay algunos dispositivos que utilizan un reloj y una señal de datos, pero que usan una "pausa" para indicar el encuadre. El ejemplo más reciente de esto que encontré fue una cadena de luz LED de controlador por bombilla. No me gustan particularmente tales diseños (uno podría indicar el encuadre utilizando tres bordes ascendentes consecutivos en el cable de datos sin ningún reloj intermedio) pero, nuevamente, tales dispositivos existen.

Si bien ciertos tipos de comunicaciones requieren el uso de tiempos específicos, rara vez hay una razón para que los dispositivos SPI los requieran. No obstante, hay que tener en cuenta la existencia de tales dispositivos.

    
respondido por el supercat
11

Al verificar una copia de la especificación (que no puedo citar por razones de derechos de autor / NDA), la tasa SPI se especifica a partir de 0Hz, lo que implica que la operación estática está bien. Con SPI, solo recupera los datos mientras el dispositivo está siendo sincronizado, por lo que si utiliza un SPI de hardware, solo recibirá algo después de que se hayan enviado los datos (incluso si el valor es 0). Entonces, en ese sentido, es diferente a un UART donde puede recibir datos no solicitados en cualquier momento.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas