Cosa sta sbattendo un po '


26

Sono nuovo nella programmazione dei microcontrollori. Sto usando il controller ATmega32-A e il compilatore CodeVisionAVR. Sto usando il generatore di forme d'onda (AD9833) per generare un segnale sinusoidale usando la comunicazione SPI. Sono in grado di generare con successo l'onda sinusoidale. Ora sto passando quel segnale al sensore. L'uscita del sensore viene selezionata tramite il multiplexer e inviata all'ADC. Ora voglio leggere i valori ADC usando la comunicazione SPI. Ho provato molto a configurare i registri di ADC. Non funziona ancora. Per vedere il codice di comunicazione SPI dai un'occhiata al mio post precedente Impostazione dei registri ADC usando la comunicazione SPI . Sto usando la comunicazione USART (RS232) per stampare valori su PC (PuTTY).

Qualcuno mi ha consigliato di usare il bit banging. Sono nuovo di questo concetto. Qualcuno può fornirmi un codice di esempio di bit banging della comunicazione SPI. Come iniziare quella procedura? Qualcuno può fornirmi un buon materiale. Ho bisogno di hardware esterno?

Ho scritto questo, comprese le connessioni 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;
}


Il tuo codice sembra a posto a parte l'uscita del clock bassa dovrebbe essere prima dell'impostazione del bit e del ritardo. Hai bisogno di un paio di ritardi per correggere i tempi (quindi l'orologio basso / alto sono all'incirca lo stesso periodo) Dai un'occhiata di nuovo al codice di Steven. Se vuoi leggere anche tu dovrai aggiungere il codice anche per quello.
Oli Glaser,

@OliGlaser Posso usare direttamente questo codice invece del normale codice SPI che per impostare i registri.
verendra,

@verendra - non sono sicuro di cosa intendi con "normale codice SPI". Se si intende invece SPI hardware, all'ADC non importa come vengono generati gli impulsi, purché concordino con il protocollo e i tempi.
Oli Glaser,

Risposte:


25

Il bit banging sta creando l'intera serie di impulsi nel software, invece di fare affidamento su un componente hardware all'interno del microcontrollore.

Molti microcontrollori hanno una SPI hardware e quindi tutto ciò che devi fare è scrivere un byte nel registro di uscita e il controller SPI sposterà i dati e allo stesso tempo riceverà i dati dallo slave. È possibile ottenere un interruzione al termine del trasferimento, quindi leggere i dati ricevuti.

Ma alcuni microcontrollori non hanno l'hardware SPI a bordo e quindi devi simularlo facendo tutto manualmente. SPI ha un numero di modalità diverse, userò questo diagramma di impulsi come esempio:

inserisci qui la descrizione dell'immagine

Quindi, mentre un controller SPI dedicato si prende cura di tutti gli impulsi, lo spostamento dei dati e il timing, quando il bit-banging devi eseguire ogni azione da solo:

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  

La SPI di bit-banging è relativamente semplice, ad esempio il codice per I2C di bit-banging sarà più complesso e in qualche modo avrai bisogno di un timer se vuoi bit-bang il protocollo UART.


2
Potete fornire un codice c di esempio.
verendra,

1
@verendra - Ho aggiunto un esempio di pseudocodice, che dovresti essere in grado di tradurre facilmente in C.
stevenvh

Sto generando con successo Wavefrom usando la comunicazione SPI. Ho problemi con la lettura dei valori ADC utilizzando solo SPI. Devo usare il bit banging per entrambi o solo per leggere i valori ADC. Puoi dare un'occhiata al mio codice per inviare 8 bit, è scrivere? ma sto confondendo come usarlo. Posso inserire questo codice direttamente anziché il mio codice SPI per configurare il registro.
verendra,

@Steven - lo schema che mostri è MSB per primo, quindi devi spostarti a sinistra da 7 e a sinistra da 0. So che non esiste uno standard quindi può essere prima LSB, ma penso che la maggior parte delle periferiche SPI lo faccia in questo modo .
Oli Glaser,

2
@Oli - buon punto, mi sono perso. Lo riparerò, grazie per il feedback. Il motivo per cui non esiste uno standard è che non importa finché il numero di bit trasferiti è uguale alla lunghezza del registro a scorrimento. Recentemente alcuni microcontrollori (come NXP Cortec-M3) hanno un registro a spostamento di lunghezza variabile e quindi la direzione può essere importante. IIRC nell'AVR è possibile selezionare prima MSB o prima LSB.
Stevenvh,

6

Il bit-banging si riferisce al concetto di far generare / campionare i segnali che escono o arrivano in un dispositivo dal software piuttosto che dall'hardware. Ovviamente è necessario un po 'di hardware, ma quando si utilizza il bit-banging, l'unico hardware per ogni output è un latch che può essere impostato o cancellato in modo esplicito dal software e l'unico hardware per ciascun input è un'interfaccia che consente al software di testare se è alto o basso (e in genere esegue un ramo condizionale per uno stato ma non per l'altro).

La velocità massima che può essere raggiunta con il bit-banging sarà generalmente una frazione di ciò che potrebbe essere ottenuto con hardware appositamente progettato, ma al di fuori dei limiti imposti dalla velocità del processore, il bit-banging è molto più versatile e può essere utilizzato in circostanze dove l'hardware generico non è del tutto adatto e l'hardware speciale non sarebbe conveniente.

Ad esempio, molti controller dispongono di una porta "SPI-style" che si comporta essenzialmente come segue: quando un byte viene scritto in un determinato registro, l'hardware genererà un numero di impulsi di clock (in genere otto), eseguendo il clock di un bit di dati sul fronte di ogni impulso di clock e campionamento di un bit di dati in entrata sul fronte di uscita. Generalmente, le porte in stile SPI dei controller consentiranno di configurare una varietà di funzionalità, ma in alcuni casi potrebbe essere necessario interfacciare un processore con un dispositivo che fa qualcosa di insolito. Un dispositivo può richiedere che i bit di dati vengano elaborati in multipli diversi da otto, oppure può essere necessario che i dati vengano emessi e campionati sullo stesso fronte di clock, oppure potrebbero avere altri requisiti insoliti. Se l'hardware particolare sul controller che si sta utilizzando può supportare i propri requisiti precisi, ottimo (alcuni forniscono numeri configurabili di bit, tempi di trasmissione e ricezione configurabili separatamente, ecc.) In caso contrario, il bang-bit può essere utile. A seconda del controller, il bit-bang di un'interfaccia SPI richiede spesso 2-10 volte il tempo necessario per consentire all'hardware di gestirlo, ma se i requisiti non si adattano a quello dell'hardware, lo scambio di dati più lentamente potrebbe essere migliore di non riuscire a farlo affatto.

Una cosa importante da notare con i disegni a bit di bit è che sono i più semplici e robusti in circostanze in cui o i dispositivi con cui si comunica sono in attesa sul controller di bang-bit per generare tutti i loro tempi, o dove il controller sarà autorizzato a attendere, senza distrazione, che arrivi un evento e dove sarà in grado di fare tutto ciò che deve fare con quell'evento prima che arrivi qualsiasi altro evento su cui deve agire. Sono molto meno robusti nelle circostanze in cui un dispositivo dovrà essere in grado di reagire agli stimoli esterni entro un intervallo di tempo relativamente breve, ma non può utilizzare il 100% della sua energia per osservare tali stimoli.

Ad esempio, supponiamo che si desideri che un processore trasmetta i dati in stile UART in serie a una velocità molto elevata rispetto alla sua velocità di clock (ad esempio un PIC che esegue 8.192 istruzioni al secondo desidera emettere dati a 1200 bps). Se non sono abilitati interrupt, tale trasmissione non è difficile (clock di un bit ogni sette cicli di istruzione). Se un PIC non stava facendo altro che attendere un byte di dati in arrivo a 1200 bps, poteva eseguire un ciclo a 3 cicli in attesa del bit di avvio, quindi procedere con il clock dei dati a intervalli di sette cicli. In effetti, se un PIC avesse un byte di dati pronto per l'invio all'arrivo di un byte di dati in entrata, sette cicli per bit sarebbero sufficienti per consentire al PIC di inviare il suo byte di dati contemporaneamente alla lettura del byte in arrivo. Allo stesso modo,se tale risposta avrebbe un tempo fisso rispetto alla trasmissione originale . D'altra parte, i PIC non avrebbero la possibilità di gestire le comunicazioni bit-bang in modo tale da consentire a entrambi i dispositivi di trasmettere in qualsiasi momento ritenuto opportuno (al contrario di avere un dispositivo in grado di trasmettere quando vide adattarsi e fare tutto ciò che gli piaceva quando non trasmetteva, e un dispositivo che avrebbe dovuto spendere la maggior parte dei suoi tempi non facendo altro che aspettare le trasmissioni dal primo dispositivo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.