¿Cómo puedo amortiguar SPI?

Tengo una placa con un dispositivo que emite datos a través de SPI (como dispositivo esclavo) y un microcontrolador. El dispositivo indica que los datos están disponibles (24 bits) configurando un determinado pin bajo, alrededor de 8000 veces por segundo. Si los datos no se leen antes de que esté disponible el siguiente dato, se pierden. Desafortunadamente, el microcontrolador a veces puede estar ocupado con otra tarea, tanto como 1-2 milisegundos.

Me gustaría alguna forma de leer los datos del dispositivo siempre que esté disponible en un FIFO o un búfer de algún tipo. El microcontrolador puede recuperar esos datos más tarde cuando no esté ocupado. También quiero poder leer/escribir SPI directamente en el dispositivo cuando el búfer está vacío. ¿Cuál es la mejor manera de configurar eso?

Puede haber algunas formas de hacer esto: DMA, uso de interrupciones, μC adicionales separados para hacer el almacenamiento en búfer. ¿Qué tipo de μC tienes? ¿Puede tener una interrupción en medio de su tarea de 1-2 mseg?
@NickAlexeev: Es una variante de Cortex-M0. La tarea no se puede interrumpir, la CPU no está disponible en absoluto durante eso. No hay SPI DMA aunque me han dicho que puede estar disponible en futuras revisiones de este uC. Estoy interesado en el uso de otro chip (idealmente realmente simple y pequeño, no uC completo) para hacer esto. ¡Gracias!
¿Puedes vincular el micro que estás usando? La mejor respuesta dependerá de las capacidades del chip. Su descripción se ajusta al Nordic Semiconductor nRF51 (incluida la pésima compatibilidad con SPI), pero el núcleo M0 se abre camino en todo tipo de dispositivos interesantes, por lo que no quiero asumir nada.
Creo que @markrages tiene razón, pero me pregunto acerca de la posibilidad de un paso simple que convierta el SPI en un protocolo que pueda usar DMA en su plataforma. Creo que todavía sería un microcontrolador, pero al menos evitarías la memoria compartida.
relacionado: Nuevo en microcontroladores... opciones para levantarse y funcionar de manera económica , que también analiza SPI y almacenamiento en búfer.

Respuestas (1)

Me temo que la respuesta será un microcontrolador u otro dispositivo programable. Mi razonamiento es el siguiente:

  1. El sensor es un dispositivo esclavo, no un maestro.

  2. Los dispositivos esclavos necesitan un reloj externo para registrar los datos.

  3. Pero solo 24 pulsos de reloj.

  4. Los dispositivos lógicos simples generalmente no están configurados para hacer su propio reloj.

  5. Por lo tanto, la solución más simple será un microcontrolador con dos periféricos SPI y suficiente memoria para almacenar en búfer su máxima latencia de interrupción. Elija un micro con un reloj interno y voltaje de suministro adecuado para su circuito. Quizás MSP430F5151 .

Ahora, si su sensor fuera un maestro SPI, entonces podría ser inteligente con pines multiplexados y simplemente usar una SRAM serial de Microchip , configurar la escritura con el microcontrolador y luego dejar que el sensor continúe escribiendo en la RAM. Consulte, por ejemplo, el analizador lógico Logic Shrimp para el uso creativo de piezas de RAM en serie.

Cálculo del consumo de energía con microcontrolador.

Por pedido popular, calculemos el consumo actual del MSP430 que vinculé arriba.

MSP430 logra bajo consumo de energía con un reloj DCO de alta velocidad conmutable, que solo tendrá que funcionar durante la transferencia de datos.

Elijamos un reloj SPI de 8 MHz. Por lo tanto, la transferencia de 24 bits tardará 24/(8 MHz) o 3 microsegundos. De la hoja de datos, el DCO toma un máximo de 1,6 mA y un máximo de 6,5 microsegundos para comenzar a 8 MHz. Entonces, la transferencia completa toma alrededor de 10 microsegundos. Cada transferencia requiere 1,6 mA * 10 microsegundos o 16 nC. 8000 transferencias / seg es una corriente promedio de 128 microamperios. Pero duplique esto, porque también tenemos que leer en voz alta. (Esto es un poco pesimista, ya que el reloj no necesita funcionar durante una transacción de esclavo SPI). Digamos una corriente promedio de 256 microamperios.

Interesante, preferiría enviar datos desde mi dispositivo a la memoria, pero el dispositivo es un esclavo SPI. ¿Hay alguna solución más pequeña/de menor potencia que un micro? ¿Quizás un CPLD o un FPGA diminuto se pueden usar como un puente SPI esclavo a esclavo?
Un CPLD o FPGA podría funcionar, pero no presenta ninguna ventaja sobre un microcontrolador que yo pueda ver.