Bit-banging se refiere al concepto de que las señales que salen o entran en un dispositivo sean generadas / muestreadas por software en lugar de hardware. Obviamente, se requiere un poco de hardware, pero cuando se utiliza el bit-banging, el único hardware para cada salida es un pestillo que el software puede establecer o borrar explícitamente, y el único hardware para cada entrada es una interfaz para permitir que el software pruebe si es alto o bajo (y normalmente ejecuta una rama condicional para un estado pero no para el otro).
La velocidad máxima que se puede lograr con bit-banging generalmente será una fracción de lo que se podría lograr con hardware especialmente diseñado, pero fuera de las limitaciones impuestas por la velocidad del procesador, bit-banging es mucho más versátil y puede usarse en circunstancias donde el hardware de uso general no es del todo adecuado y el hardware de uso especial no sería rentable.
Por ejemplo, muchos controladores tienen un puerto "estilo SPI" que se comporta esencialmente de la siguiente manera: cuando se escribe un byte en un determinado registro, el hardware generará una cierta cantidad de pulsos de reloj (normalmente ocho), registrando un bit de datos en el borde delantero de cada pulso de reloj y muestreo de un bit de datos entrantes en el borde posterior. En general, los puertos de estilo SPI de los controladores permitirán configurar una variedad de características, pero en algunos casos puede ser necesario interconectar un procesador con un dispositivo que hace algo inusual. Un dispositivo puede requerir que los bits de datos se procesen en múltiplos que no sean ocho, o puede requerir que los datos se emitan y muestreen en el mismo borde del reloj, o puede tener algún otro requisito inusual. Si el hardware particular en el controlador que uno está usando puede soportar los requisitos precisos de uno, genial (algunos proporcionan números configurables de bits, temporización de transmisión y recepción configurable por separado, etc.) Si no, el golpeteo de bits puede ser útil. Dependiendo del controlador, los golpes de bits de una interfaz SPI-ish a menudo demorarán entre 2 y 10 veces más que dejar que el hardware lo maneje, pero si los requisitos no se ajustan al hardware que uno tiene, el intercambio de datos más lento puede ser mejor que no poder hacerlo en absoluto.
Una cosa importante a tener en cuenta con los diseños de bit-banged es que son más simples y robustos en circunstancias en las que los dispositivos con los que se comunican están esperando que el controlador de bit bitging genere todos sus tiempos, o donde el controlador podrá espere, sin distracciones, a que llegue un evento, y donde podrá hacer todo lo que necesita hacer con ese evento antes de que llegue cualquier otro evento sobre el que deba actuar. Son mucho menos robustos en circunstancias en las que un dispositivo necesitará poder reaccionar a estímulos externos dentro de un período de tiempo relativamente corto, pero no puede usar el 100% de su energía para observar dichos estímulos.
Por ejemplo, supongamos que uno desea que un procesador transmita datos de estilo UART en serie a una velocidad muy alta en relación con su velocidad de reloj (por ejemplo, un PIC que ejecuta 8.192 instrucciones por segundo desea emitir datos a 1200 bps). Si no hay interrupciones habilitadas, dicha transmisión no es difícil (reloj un bit cada siete ciclos de instrucción). Si un PIC no estuviera haciendo nada más que esperar un byte de datos entrante de 1200bps, podría ejecutar un ciclo de 3 ciclos esperando el bit de inicio, y luego proceder a registrar los datos a intervalos de siete ciclos. De hecho, si un PIC tenía un byte de datos listo para enviar cuando llegó un byte de datos entrante, siete ciclos por bit serían suficiente tiempo para que el PIC envíe su byte de datos simultáneamente con la lectura del byte entrante. Igualmente,si tal respuesta hubiera fijado el tiempo relativo a la transmisión original . Por otro lado, los PIC no tendrían forma de manejar las comunicaciones bit-bang de tal manera que se permitiera a cualquiera de los dispositivos transmitir en cualquier momento que lo considerara conveniente (en lugar de tener un dispositivo que pudiera transmitir cuando viera encajar y hacer lo que quiera cuando no esté transmitiendo, y un dispositivo que tendría que pasar la mayor parte de su tiempo haciendo nada más que esperar las transmisiones del primer dispositivo).