¿Qué es bit banging

23

Soy nuevo en la programación de microcontroladores. Estoy usando el controlador ATmega32-A y el compilador CodeVisionAVR. Estoy utilizando el generador de forma de onda (AD9833) para generar una señal de onda sinusoidal mediante la comunicación SPI. Soy capaz de generar el sinewave con éxito. Ahora estoy pasando esa señal al sensor. La salida del sensor se selecciona a través del multiplexor y se envía al ADC. Ahora quiero leer los valores ADC utilizando la comunicación SPI. He intentado mucho para configurar los registros de ADC. Todavía no está funcionando. Para ver el Código de comunicación SPI, consulte mi publicación anterior Configuración de registros ADC mediante comunicación spi . Estoy utilizando la comunicación USART (RS232) para imprimir valores en PC (PuTTY).

Alguien me aconsejó usar bit-banging. Soy nuevo en ese concepto. ¿Alguien me puede proporcionar un código de ejemplo de un bit banging de comunicación SPI? ¿Cómo iniciar ese procedimiento? ¿Puede alguien proporcionarme un buen material? ¿Necesito algún hardware externo?

He escrito esto, incluidas las conexiones de pin:

#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7

void send_8bit_serial_data(unsigned char data)
{
    int i;  
    ADC_CS=0;
    for (i = 0; i < 8; i++)
    {
        // consider leftmost bit
        // set line high if bit is 1, low if bit is 0
        if (data & 0x80)
            output_high(PORTB.5);
        else
            output_low(PORTB.5);

        // pulse clock to indicate that bit value should be read
        output_low(PORTB.7);
        output_high(PORTB.7);

        // shift byte left so next bit will be leftmost
        data <<= 1;
    }

    // deselect device
    ADC_CS=1;
}
    
pregunta verendra

2 respuestas

22

El bit banging está creando toda la serie de pulsos en el software, en lugar de confiar en una pieza de hardware dentro del microcontrolador.

Muchos microcontroladores tienen un SPI de hardware, y todo lo que tiene que hacer es escribir un byte en el registro de salida, y el controlador SPI desplazará los datos y, al mismo tiempo, recibirá los datos del esclavo. Puede obtener una interrupción cuando se complete la transferencia y luego leer los datos recibidos.

Pero algunos microcontroladores no tienen el hardware SPI incorporado y, luego, hay que simularlo haciendo todo manualmente. SPI tiene varios modos diferentes, usaré este diagrama de pulso como ejemplo:

Entonces, mientras que un controlador SPI dedicado se encarga de todos los pulsos, el cambio de datos y la sincronización, cuando golpeas los bits, debes realizar cada acción por tu cuenta:

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

El SPI de bitbanging es relativamente simple, por ejemplo, el código para I2C de bit bit será más complejo, y necesitarás un temporizador de alguna manera si quieres golpear el protocolo UART.

    
respondido por el stevenvh
4

Bit-banging se refiere al concepto de que las señales que salen o entran en un dispositivo se generan / muestrean mediante software en lugar de hardware. Obviamente, se requiere algo de hardware, pero cuando se utiliza el bit bitging, el único hardware para cada salida es un pestillo que el software puede establecer o eliminar explícitamente, y el único hardware para cada entrada es una interfaz que permite al software probar si está 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 el bit bitging generalmente será una fracción de lo que podría lograrse con un hardware especialmente diseñado, pero fuera de las limitaciones impuestas por la velocidad del procesador, el bit bit es mucho más versátil, y puede ser se usa en circunstancias donde el hardware de propósito general no es muy adecuado y el hardware de propósito 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á un cierto número de pulsos de reloj (típicamente ocho), registrando un dato bit en el borde anterior de cada pulso de reloj y muestreando un bit de datos entrantes en el borde posterior. En general, los puertos estilo SPI de los controladores permitirán configurar una variedad de funciones, pero en algunos casos puede ser necesario interconectar un procesador con un dispositivo que haga algo inusual. Un dispositivo puede requerir que los bits de datos se procesen en múltiplos distintos de ocho, o puede requerir que los datos se envíen y muestreen en el mismo borde del reloj, o puede tener algún otro requisito inusual. Si el hardware en particular en el controlador que está utilizando uno puede admitir los requisitos precisos de uno, excelente (algunos proporcionan números configurables de bits, temporización de transmisión y recepción configurables por separado, etc.) Si no es así, el intercambio de bits puede ser útil. Dependiendo del controlador, la interfaz SPI-ish a menudo demora entre 2 y 10 veces más que permitir que el hardware lo maneje, pero si los requisitos no encajan con el hardware que tiene uno, intercambiar datos más lentamente 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 los más simples y robustos en circunstancias en las que los dispositivos con los que se está comunicando están esperando que el controlador de bit bit genere toda su sincronización, o donde el controlador se le permite esperar, sin distracción, 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 tendrá que ser capaz de reaccionar a estímulos externos dentro de un marco de tiempo relativamente corto, pero no puede destinar el 100% de su energía para observar tales estímulos.

Por ejemplo, supongamos que uno desea que un procesador transmita datos de tipo 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 se habilitan interrupciones, dicha transmisión no es difícil (marque un bit cada siete ciclos de instrucción). Si un PIC no hiciera nada más que esperar un byte de datos de 1200bps entrante, podría ejecutar un bucle de 3 ciclos esperando el bit de inicio, y luego proceder a sincronizar los datos en 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 tiempo suficiente para que el PIC enviara su byte de datos simultáneamente con la lectura del byte entrante. Del mismo modo, un PIC que inició una transmisión de 1200 bps podría ver si el dispositivo con el que se está comunicando estaba enviando una respuesta, si dicha respuesta hubiera corregido el tiempo relativo a la transmisión original . Por otro lado, no habría forma de que los PICs apresuren la gestión de las comunicaciones de bit bang de tal manera que se permita que cualquiera de los dispositivos transmita en cualquier momento que se ajuste (en lugar de tener un dispositivo que podría transmitir cuando lo vio). encaja, y haz lo que quieras 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 desde el primer dispositivo).

    
respondido por el supercat

Lea otras preguntas en las etiquetas