¿SPI es significativamente más rápido que el bit-banging?

Tengo un proyecto basado en una foto 18f4550. Para escribir en un registro de desplazamiento '595, ¿existe una clara ventaja de usar spi sobre los pines io regulares? Escuché que spi es más rápido, pero no estoy seguro de cómo. ¿Utiliza un reloj diferente y más rápido que el resto del chip, o simplemente es más eficiente? Puedo extraer un byte a través de pines io regulares en una cantidad bastante pequeña de instrucciones. ¿Spi utiliza menos potencia de procesamiento? Me desplazaré con bastante frecuencia durante cálculos bastante intensos, por lo que quiero que se dediquen tantos ciclos como sea posible a mi proceso y que no se produzcan desplazamientos.

Mi razón principal para no querer usar spi es que mi diseño actual haría un poco más difícil acceder a los pines requeridos porque ya estoy usando algunos de ellos para otras cosas y tendría que mezclar las cosas. Quería averiguar qué beneficios hay antes de comenzar a romper las cosas y moverlas.

Puede hacer SPI golpeando bits.

Respuestas (4)

Suponiendo que está comparando un "motor" serial síncrono o periférico spi en el micro para generar la misma secuencia a través de "bit-banging", entonces sí, tiende a ser algo más rápido, pero lo más importante es que el procesador puede transferir un byte completo a el periférico para enviar y luego hacer otras cosas mientras se transmite. En el caso de bit-banging, el procesador tiende a estar atascado durante la transmisión (aunque como el micro tiende a ser el maestro y la mayoría de los periféricos son completamente estáticos, probablemente pueda tolerar una pausa a mitad de byte para atender una interrupción o incluso para sondear cosas: el ADC serial con reloj de interfaz y las tareas de intervalo de muestra son ejemplos notables de excepciones).

En MCU más capaces, incluso puede ser posible programar un controlador DMA para ejecutar una transferencia de varios bytes desde la memoria a través del motor SPI sin más atención del procesador, especialmente si solo son importantes los datos en una dirección.

Pero muchos proyectos de microcontroladores terminan altamente optimizados para su tarea; Si puede prescindir de los ciclos y tolerar la reducción de la velocidad, entonces complicar su software para poder usar cualquier GPIO que haga que el diseño físico sea más limpio no es de ninguna manera una opción poco común.

Si esto ^. Como menciona Chris, la mayor ventaja de usar periféricos de hardware es que puede transferir un byte de datos de un flujo al periférico y recibir una notificación a través de una interrupción si ha terminado de cambiarlo y está listo para otro byte. Esto libera el uso de su CPU para otras cosas mientras se desplaza el byte, lo que puede ser una vida útil en los ciclos de la máquina dada la velocidad en baudios de estos protocolos en serie.
No es una vida para SPI. Si está hablando de velocidad, es posible que esté ejecutando el SPI a 10 MHz, que son solo 10 instrucciones PIC a toda velocidad. Eso no es una edad. Casi el tiempo suficiente para preparar su próximo byte. Apenas es tiempo suficiente para atender una interrupción.
Sería justo decir que mucho depende de la tasa de baudios deseada/requerida, que no se ha indicado. Sin embargo, como señalé, si el micro es el maestro, es posible que se retrase en el envío del siguiente byte, siempre que la aplicación pueda tolerar la irregularidad/reducción en el rendimiento.
@Rocketmagnet, estoy corregido. SPI es mucho más rápido de lo que pensaba; supongo que lo agrupé con protocolos seriales más lentos como UART (donde 9600 baudios es ~ 10 kHz).
También tenga en cuenta que SPI master es relativamente fácil de explotar. El esclavo SPI puede ser algo más difícil ya que las transiciones de reloj y selección de chip deben cronometrarse y manejarse específicamente (como un pin de interrupción externo). Utilizo el estilo SPI master bit bang a menudo en mis proyectos, especialmente si no necesito un alto rendimiento pero quiero una placa limpia (también es bueno para grabar en casa). También tenga en cuenta que es una práctica común hacer lo contrario: cambiar los datos a los registros de desplazamiento (HC595, etc.) usando SPI y un GPIO (clavija).

Ventajas del bit-banging:

  • Control absoluto sobre el protocolo.
  • Si el tiempo para ejecutar instrucciones en el microcontrolador es más rápido que la velocidad en baudios del SPI, puede ser más rápido, pero esto es poco probable. Se necesitaría una tasa de baudios SPI de muy, muy baja velocidad con un microcontrolador de velocidad relativamente alta.
  • Puede tener una latencia menor que una interrupción SPI.
  • Elección de pines.

Desventajas del bit-banging:

  • Requiere mucho más código para manejar -Tiempo de velocidad en baudios -Muestreo confiable de los bits recibidos -Límites del marco del proceso *Cada segmento de código anterior consume tiempo que podría dedicarse a ejecutar otro código.

Ventajas de SPI:

  • La configuración de registros maneja la sincronización de la velocidad de transmisión, el muestreo de bits recibidos y los recuentos de tramas de procesamiento
  • La mayoría de los microcontroladores con SPI tienen un vector de interrupción dedicado para cada periférico SPI (¡Compruebe dos veces su micro!)
  • Una vez configurado, solo necesita verificar si el búfer SPI TX/RX está vacío/lleno y escribir/leer un byte.
  • Si DMA está disponible, el SPI puede transmitir grandes búferes de datos contiguos sin ninguna interferencia de software.

Desventajas de SPI:

  • Un periférico extra para aprender y configurar (¿Es eso realmente una desventaja?)
  • Requiere pines adicionales o multiplexación de pines
  • Costo adicional (tiende a ser insignificante con los microcontroladores actuales)
  • He tenido problemas de ruido con SPI, pero estaban en placas prototipo a velocidades relativamente altas (10 MHz)
  • Elección de pin altamente restringida

Para mí, las ventajas del bit-banging son menores en comparación con las ventajas de SPI. Las desventajas del bit-banging son mucho mayores que las del SPI. Las tres razones principales que puedo ver para elegir bit-banging son para

  1. Protocolo personalizado de baja velocidad
  2. Si la comunicación es de baja velocidad y el resto de la aplicación tiene requisitos de cálculo bajos
  3. O si la comunicación es de baja velocidad y la elección del pin es un problema importante

En el PIC, una implementación de estilo SPI bit-bang convencional toma alrededor de cinco ciclos por bit; con un poco de trabajo en las partes 18Fxx, uno puede reducirlo a aproximadamente cuatro (al costo de aproximadamente tres ciclos por byte de sobrecarga adicional). Ese tiempo se suma al tiempo necesario para obtener datos (normalmente, tres ciclos por byte). Entonces calcule alrededor de 40-43 ciclos por byte. Usando el SPI de hardware, la velocidad mejora a dos ciclos por bit más un par de ciclos adicionales por byte (algunos otros pueden manejar transferencias consecutivas, pero los PIC que he visto no pueden), y mientras el SPI está enviando un byte el procesador puede buscar el siguiente, lo que permite un tiempo total de aproximadamente 18 ciclos/byte, una ganancia de velocidad de aproximadamente 2,5x.

Hola. ¿Tiene algún tutorial sobre bitbanging de alta velocidad en el ensamblaje de PIC? Estoy tratando de optimizar mi programa PIC, después de rascarme la cabeza, he alcanzado la velocidad de 5 ciclos/bit (establecer datos en ALTO, probar bit y configurar datos en BAJO, de lo contrario, omitirlo, configurar el reloj en BAJO, poner el reloj en ALTO). Pero sería interesante ver cómo alguien más podría haberlo hecho de manera diferente. También tengo curiosidad acerca de la solución de 4 ciclos/bit en el PICF18.
En la mayoría de los PIC, generalmente usaría el enfoque de cinco ciclos que describe. Hay dos formas de mejorarlo a cuatro en algunas situaciones: (1) calcular un byte cuyos bits indiquen que un bit difiere del anterior y luego usar "btfsc flipBits,_ / btf DATA_PIN " o "btrsc flipBits , / xorwf DATA_PORT,f" [con W sosteniendo la máscara de bits adecuada]. Alternativamente, uno podría eliminar un ciclo usando IORWF o ANDWF para preestablecer simultáneamente el pin de datos en un estado conocido y configurar el reloj en inactivo.
Éxito. Ahora he llegado a 4 ciclos/bit. Mi nuevo procedimiento: en la inicialización, cargue una máscara de bits en W, cargue el byte en la RAM común, seleccione el banco del puerto. Para transmitir un bit, ANDWF el registro del puerto y W, por lo que tanto los relojes como los datos se configuran en BAJO simultáneamente. Luego pruebe el bit, y sáltelo o configure los datos en ALTO, finalmente configure el reloj en ALTO. Gracias por el consejo, ahora es lo más rápido posible.

Para golpes de bits (BB) olvidaste mencionar:

  1. Ata el procesador para el período de la comunicación. (SPI carga los registros y luego los devuelve para que haga otra cosa)
  2. Las interrupciones de fondo pueden interferir seriamente con el código BB, por lo que solo es útil en diseños de un solo subproceso, recuerde que el código BB debe prestar el 100% de atención al manejo del protocolo.