- ¿Qué es Bit Banging?
- Cuándo usar Bit Banging
- Algoritmo para la comunicación en serie mediante Bit Banging
- Bit golpeando sobre SPI
- Ejemplo de Bit Banging: comunicación SPI en Arduino
- Desventajas de Bit Banging
- UART a través de Bit banging en Arduino
Las interfaces de comunicación son uno de los factores que se consideran al seleccionar un microcontrolador que se utilizará para un proyecto. El diseñador se asegura de que el microcontrolador seleccionado tenga todas las interfaces necesarias para comunicarse con todos los demás componentes que se utilizarán para el producto. La existencia de algunas de estas interfaces como SPI e I2C en el microcontrolador aumenta invariablemente el costo de dichos microcontroladores y, dependiendo del presupuesto de BOM, puede hacer que el microcontrolador deseado no sea asequible. En situaciones como estas, las técnicas como Bit Banging entran en juego.
¿Qué es Bit Banging?
Bit banging es una técnica para la comunicación en serie en la que todo el proceso de comunicación se maneja a través de software en lugar de hardware dedicado. Para transmitir datos, la técnica implica el uso de software para codificar los datos en señales y pulsos que se utilizan para manipular el estado de un pin de E / S de un microcontrolador que sirve como pin Tx para enviar datos al dispositivo de destino. Para recibir datos, la técnica implica muestrear el estado del pin Rx después de ciertos intervalos que están determinados por la velocidad de comunicación en baudios. El software establece todos los parámetros necesarios para lograr esta comunicación, incluida la sincronización, la temporización, los niveles, etc., que generalmente se deciden mediante hardware dedicado cuando no se utiliza el golpe de bits.
Cuándo usar Bit Banging
Bit-Banging se usa generalmente en situaciones en las que un microcontrolador con la interfaz requerida no está disponible o cuando cambiar a un microcontrolador con la interfaz requerida puede ser demasiado costoso. Por tanto, proporciona una forma económica de permitir que el mismo dispositivo se comunique utilizando varios protocolos. Un microcontrolador que está previamente habilitado para comunicación UART solamente, puede equiparse para comunicarse usando SPI y 12C mediante bit banging.
Algoritmo para la comunicación en serie mediante Bit Banging
Si bien el código para implementar el golpe de bits puede diferir entre diversos microcontroladores y también puede variar para diferentes protocolos en serie, el procedimiento / algoritmo para implementar el golpe de bits es el mismo en todas las plataformas.
Para enviar datos, por ejemplo, se utiliza el pseudocódigo siguiente;
- comienzo
- Enviar bit de inicio
- Espere a que el tiempo se corresponda con la velocidad en baudios del receptor
- Enviar bit de datos
- Espere a que la duración se corresponda con la velocidad en baudios del receptor nuevamente
- Compruebe si se han enviado todos los bits de datos. Si no, vaya a 4. Si es así, vaya a 7
- Enviar bit de parada
- Detener
La recepción de datos tiende a ser un poco más compleja, por lo general se utiliza una interrupción para determinar cuándo hay datos disponibles en el pin del receptor. Esto ayuda a garantizar que el microcontrolador no desperdicie demasiada potencia de procesamiento. Aunque ciertas implementaciones usan cualquiera de los pines de E / S de los microcontroladores, las posibilidades de ruido y errores, si probablemente no se manejan, son mayores. El algoritmo para recibir datos mediante interrupciones se explica a continuación.
- comienzo
- Habilitar interrupción en el pin Rx
- Cuando se activa la interrupción, obtenga el bit de inicio
- Espere el tiempo de acuerdo con la velocidad en baudios
- Leer el pin de Rx
- Repita desde 4 hasta que se hayan recibido todos los datos
- Espere el tiempo de acuerdo con la velocidad en baudios
- Compruebe el bit de parada
- Detener
Bit golpeando sobre SPI
Como se mencionó anteriormente, el bit banging para diferentes protocolos funciona de manera diferente y, por lo tanto, es importante leer sobre cada protocolo para comprender el encuadre y el reloj de datos antes de intentar implementarlo. Tomando el modo SPI 1 como ejemplo, el valor base del reloj es siempre 0 y los datos siempre se envían o reciben en el flanco ascendente del reloj. El diagrama de tiempo para el protocolo de comunicación SPI Modo 1 se muestra a continuación.
Para implementar esto, se puede utilizar el siguiente algoritmo;
- comienzo
- Configure el pin SS bajo para comenzar la comunicación
- Configure el pin para Master Out Slave In (MOSI) en el primer bit de los datos que se enviarán
- Configure el pin del reloj (SCK) alto para que los datos sean transmitidos por el maestro y recibidos por el esclavo
- Leer el estado del Master in Slave Out (MISO) para recibir el primer bit de datos del esclavo
- Configure SCK Low, para que los datos se puedan enviar en el siguiente flanco ascendente
- Vaya a 2 hasta que se hayan transmitido todos los bits de datos.
- Establezca el pin SS en Alto para detener la transmisión.
- Detener
Ejemplo de Bit Banging: comunicación SPI en Arduino
Como ejemplo, implementemos el algoritmo para la comunicación SPI a través de bit banging en Arduino para mostrar cómo los datos pueden ser bit-banged sobre SPI usando el siguiente código.
Comenzamos declarando los pines del Arduino que se utilizarán.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Valor a enviar byte slaveData = 0; // para almacenar el valor enviado por el esclavo
A continuación, pasamos a la función void setup () donde se declara el estado de los pines. Solo el pin Master in Slave out (MISO) se declara como entrada, ya que es el único pin que recibe datos. Todos los demás pines se declaran como salida. Después de declarar los modos de pin, el pin SS se establece en HIGH. La razón de esto es garantizar que el proceso esté libre de errores y que la comunicación solo se inicie cuando esté configurado en bajo.
configuración vacía () { pinMode (MISOPin, INPUT); pinMode (SSPin, SALIDA); pinMode (SCKPin, SALIDA); pinMode (MOSIPin, SALIDA); digitalWrite (SSPin, ALTO); }
A continuación, iniciamos el ciclo para enviar datos. Tenga en cuenta que este bucle seguirá enviando los datos repetidamente.
Comenzamos el ciclo escribiendo el pin SS bajo, para iniciar el comienzo de la comunicación, y llamamos a la función bitbangdata que divide los datos predefinidos en bits y los envía. Una vez hecho esto, escribimos el pin SS HIGH para indicar el final de la transmisión de datos.
bucle vacío () { digitalWrite (SSPin, LOW); // SS low slaveData = bitBangData (sendData); // transmisión de datos digitalWrite (SSPin, HIGH); // SS alto de nuevo }
El bitbangdata () la función se escribe a continuación. La función toma los datos que se enviarán y los descompone en bits y los envía haciendo un bucle sobre el código para la transmisión como se indica en el paso 7 del algoritmo.
byte bitBangData (byte _send) // Esta función transmite los datos vía bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bits en un byte { digitalWrite (MOSIPin, bitRead (_send, i)); // Establecer MOSI digitalWrite (SCKPin, HIGH); // SCK alto bitWrite (_receive, i, digitalRead (MISOPin)); // Captura MISO digitalWrite (SCKPin, LOW); // SCK bajo } return _receive; // Devuelve los datos recibidos }
Desventajas de Bit Banging
Sin embargo, la adopción de bit banging debería ser una decisión bien pensada, ya que existen varias desventajas de bit banging que pueden hacer que no sea confiable para su implementación en ciertas soluciones. Los golpes de bits aumentan la potencia consumida por el microcontrolador debido a la alta potencia de procesamiento consumida por el proceso. En comparación con el hardware dedicado, se producen más errores de comunicación, como fallas y fluctuaciones, cuando se usa bit bang, especialmente cuando el microcontrolador realiza la comunicación de datos al mismo tiempo que otras tareas. La comunicación a través de golpe de bits ocurre a una fracción de la velocidad con la que ocurre cuando se usa hardware dedicado. Esto puede ser importante en ciertas aplicaciones y puede hacer que los golpes de bits sean una opción "no tan buena".
El golpe de bits se utiliza para todo tipo de comunicaciones en serie, incluidas; RS-232, comunicación serial asíncrona, UART, SPI e I2C.
UART a través de Bit banging en Arduino
Una de las implementaciones populares de bit banging es la biblioteca de serie del software Arduino que permite que Arduino se comunique a través de UART sin usar los pines UART de hardware dedicados (D0 y D1). Esto brinda mucha flexibilidad ya que los usuarios pueden conectar tantos dispositivos en serie como la cantidad de pines en la placa Arduino pueda admitir.