Il Bus Pirate : uno strumento davvero utile e versatile. Cos’e´ e come funziona. Esempio di comunicazione con bus 1-Wire

Giovanni Bernardo | 23 settembre 2010
Categorie: dsPIC / PIC24 - Strumentazione

Il Bus Pirate è un semplicissimo dispositivo,  creato da Ian Lesnet, basato su un PIC24F ed un convertitore USB/232, che si interpone tra il nostro computer ed un dispositivo digitale e ci permette di comunicare con esso tramite un’interfaccia sul pc (generalmente un programma terminale come HyperTerminal ma sono comunque disponibili numerosi software creati ad-hoc che permettono di estendere le funzionalità di questo dispositivo).

Detto così potrebbe sembrare alquanto riduttivo, ma se siete abituati a smanettare con memorie eeprom, bus seriali, dispositivi 1Wire ecc ecc potete capire come questa piccola diavoleria possa rivelarsi utile per diagnosticare problemi o semplicemente per imparare il meccanismo di funzionamento di questi componenti.

Per imparare, in particolar modo, lo trovo davvero uno strumento utile e quasi indispensabile se non si vuole perdere tempo a sbattere la testa quando, ad esempio,  “l’eeprom non mi funziona!”.

Il Bus Pirate attualmente è in grado di comunicare sfruttando i seguenti protocolli:

  • 1-Wire
  • I2C
  • SPI
  • JTAG
  • Seriale Asincrono
  • MIDI
  • Tastiera PC
  • LCD HD44780

Oltre a questi è possibile anche dialogare con dispositivi a 2 e a 3 fili controllando i bit. Come se non bastasse sono disponibili anche tante altre caratteristiche aggiuntive, tra cui:

  • Regolatore on board a 5 e a 3.3V per alimentare i dispositivi da analizzare
  • Funzionamento come analizzatore logico a bassa velocità (10Hz – 1MHz)
  • Può funzionare come clone del programmatore STK per gli AVR
  • Generatore PWM da 1KHz a 4MHz
  • Frequenzimetro da 1Hz a 40MHz
  • Controllo servocomandi
  • Sonda di misurazione analogica da 0 a 5.5Volts

Queste ed altre sono illustrate sul sito ufficiale dove possono essere trovate sempre le ultime versioni del firmware (upgradabile tramite bootloader, è comunque possibile accedere anche al connettore ICSP per caricare nuovi firmware: cosa che, per alcune particolari funzioni, potrebbe essere richiesta).

Nota:
Non tutte le funzioni che ho elencato potrebbero essere disponibili sul vostro bus pirate in quanto il firmware viene aggiornato di continuo e vengono sempre implementate nuove funzioni. Fate riferimento ai link in fondo all’articolo per rimanere aggiornati.

Funzionamento del Bus Pirate

Basta collegarlo alla porta USB: verrà rilevato un nuovo dispositivo e si dovranno installare i driver presenti sul sito della FTDI per il convertitore FTDI232 (un esempio di installazione è presente in questo articolo al paragrafo interfacciamento Xbee con il pc).

Una volta installati i drivers è conveniente staccare il bus pirate e quindi riattaccarlo, attendere qualche secondo e quindi avviare Hyperterminal con le seguenti impostazioni, avendo cura di selezionare la nuova porta COM creata dal bus pirate:

Una volta davanti all’interfaccia di hyperterminal, questa apparirà vuota, possiamo procedere direttamente con i comandi (se li conosciamo), oppure (giusto per vedere la schermata inziale), possiamo digitare # seguito da invio per eseguire il reset:

Come vedete si presenta un prompt “HiZ>” che serve ad indicare la modalità di funzionamento correntementa attivata, ovvero “Alta Impedenza”. In pratica tutti i pin del bus pirate si trovano in uno stato di alta impedenza (diciamo pure: “dispositivo messo in sicurezza”).

Digitando ? seguito da invio possiamo visualizzare una schermata di aiuto nella quale sono elencati tutti i comandi disponibili. Tale menù è molto lungo per cui scorrete la finestra del vostro programma terminale verso l’alto per poterlo visualizzare dall’inizio.

Questo elenco comandi cambia a seconda della versione del firmware

Alcuni comandi sono case sensitive, altri accettano indifferentemente la maiuscola o la minuscola. In ogni caso questo è sempre indicato nel menù.

Digitando M seguito da invio possiamo visualizzare il menù per la selezione della modalità di funzionamento:

Il prompt cambia e viene visualizzata tra parentesi la modalità HiZ che è quella di default (da questo menù si può ritornare alla modalità Hiz premendo anche solo invio, pure se era selezionata una modalità differente).

Le selezioni relative al ? sono sempre accessibili. La selezione delle voci del menù M, però è possibile solo quando ci troviamo in modalità Hiz, se ci troviamo in una modalità diversa da HiZ bisogna sempre prima premere M, visualizzare il menù e quindi scegliere la nuova modalità.

Selezionando una modalità diversa dalla HiZ, si illumina sulla scheda il led indicato come “mode”: questo è un avvertimento in quanto su alcuni pin del connettore esterno potrebbero esserci delle tensioni e quindi dobbiamo stare attenti a non creare cortocircuiti.

Esempio pratico : controlliamo una sonda 1wire DS18S20

Non c’è niente di meglio di un esempio pratico per capire come funziona un dispositivo del genere che altrimenti, all’apparenza, può sembrare complicato. Innanzitutto, prima di effettuare qualsiasi prova dobbiamo capire per bene in quali punti bisogna collegare il dispositivo da testare. Diamo quindi un occhio al pinout del connettore, disponibile in questa pagina:

Pinout Bus Pirate delle revisioni 3 e 2GO

Come vedete il pinout cambia leggermente a seconda della versione firmware.

E’ possibile vedere la propria versione digitando i o I dalla riga di comando

Avendo io la versione 3, faccio riferimento al pinout di sinistra (i riquadri gialli indicano i punti da cortocircuitare per fare l’autodiagnosi, cosa di cui non discuterò). Il significato dei nomi dei pin è il seguente:

MOSI Master data out, slave in (SPI, JTAG), Serial data (1-Wire, I2C, KB), TX* (UART)
CLK Clock signal (I2C, SPI, JTAG, KB)
MISO Master data in, slave out (SPI, JTAG) RX (UART)
CS* Chip select (SPI), TMS (JTAG)
AUX Auxiliary IO, frequency probe, pulse-width modulator
ADC Voltage measurement probe (max 6volts)
Vpu Voltage input for on-board pull-up resistors (0-5volts).
+3.3v +3.3volt switchable power supply
+5.0v +5volt switchable power supply
GND Ground, connect to ground of test circuit

Dovendo io testare una sonda 1Wire, utilizzerò i pin MOSI (vedete nella tabella che tale pin è usato per svariate cose tra cui la comunicazione 1Wire) e quindi +5V e GND per l’alimentazione della sonda. Collegherò quindi la mia sonda DS18S20 in questo modo:

Nota:
Sto utilizzando la modalità di alimentazione parassita. Dal momento che la linea 1Wire ha sempre bisogno di una resistenza di pullup, qui l’ho inserita manualmente. Il Bus Pirate ha comunque l’opzione per poter inserire da sè le resistenze di pullup, e a tal proposito è presente una guida su questo argomento.

Personalmente ho arrangiato il tutto su di una breadboard utilizzando cavetti jumper Maschio/Femmina:

Entriamo quindi nel menù relativo al protocollo 1Wire. Digitiamo M (invio) e quindi 2 per selezionare la modalità 1-wire, il prompt cambierà indicando la modalità correntemente attiva:

Chi smanetta coi Pic ad un certo livello, di sicuro conoscerà il nome di Michael Pearce

Bene, ora per prima cosa dobbiamo attivare l’alimentazione, altrimenti sul pin 5V non ci sarà tensione per alimentare la sonda. Le alimentazioni sul bus pirate vengono attivate con W (maiuscola) e disattivate con w (minuscola):

Il Bus Pirate risponde con “POWER SUPPLIES ON” e si accende il led “VREG” sulla scheda.

Il Bus Pirate dispone di una serie di comandi che possono essere utilizzati manualmente per eseguire una serie di operazioni. Ad esempio in questo caso vogliamo conoscere il rom code della sonda collegata. Da datasheet della sonda (sto usando una DS18S20) sappiamo che per eseguire questa operazione dobbiamo inviare il comando di reset seguito dal comando ReadRom (0x33): questo comando restituisce il RomCode di un dispositivo 1Wire nel caso in cui ve ne sia uno solo sulla linea. In  questo caso, dato che ho montato una sola sonda, posso eseguire questa operazione, nel prompt del bus pirate andrò quindi a scrivere:

{ 0x33 r:8

Cosa significa quello che ho scritto? Chiariamo innanzitutto che si tratta di 3 distinti comandi separati da uno spazio.  Cerchiamo quindi di capire cosa fanno:

{ : (si ottiene tenendo premuto ALT, digitando 1 2 3 in sequenza sul tastierino numerico e quindi rilasciando il tasto ALT) comando per inviare il reset della linea. Tale comando è utilizzato da tutti i protocolli disponibili sul bus pirate con significati diversi. In particolare il comando { viene identificato come comando di Start comunicazione. In una comunicazione 1Wire lo start corrisponde al reset (in altri protocolli corrisponderà allo start relativo a quel protocollo, ad esempio sul bus I2C questo comando servirà all’invio del bit di start).

0x33 : è il comando, utilizzato dal bus 1wire, per eseguire il Read Rom, non si tratta quindi di un comando del bus pirate ma di un comando relativo al protocollo che stiamo analizzando, e quindi disponibile sul datasheet del dispositivo.

r:8 : il comando r serve per leggere un byte, mettendo i due punti dopo un comando si specifica al bus pirate che quel comando deve essere ripetuto per il numero di volte specificato dopo i due punti. Qui sto in pratica dicendo al bus pirate che mi deve leggere 8 bytes o, in altri termini, deve eseguire la lettura di un byte per 8 volte.

Il comando in sè, come l’ho scritto, non fa nient’altro che riflettere lo schema illustrato dal datasheet del dispositivo in questione:

  • Il Master invia il comando di reset
  • Il Master invia il comando di lettura romcode e si mette quindi in attesa
  • Lo Slave invia i dati richiesti, nel caso specifico, essendo il romcode costituito da 8 bytes, invierà 8 bytes di dati
  • Il Master deve quindi eseguire la lettura degli 8 bytes

Premendo quindi invio il comando sarà eseguito:

Come vedete il bus pirate risponde con un “READ 0X08 BYTES” seguito dai bytes che ha letto. Questo comando così come l’ho scritto, però, può essere abbreviato in quanto il BusPirate, per ogni protocollo, ha già disponibili una serie di Macro (insiemi di comandi) per eseguire le operazioni più comuni.

Adesso non mi venite a dire: allora perchè mi fai fare tutta questa fatica! Dovevo  spiegarvi il metodo più faticoso per poter poi eseguire cose più complesse? O volete sempre le cose già belle e pronte? :D

Le macro vengono eseguite digitando un codice tra parentesi tonde, per cui ogni volta che incontrate un comando del genere: (x) si tratta di una macro, ovvero una sequenza di operazioni basilari. L’elenco delle macro disponibili, per ogni protocollo, viene ottenuto digitando (0) dalla modalità in cui vogliamo avere l’elenco.  Nel caso del protocollo 1wire avremo:

Come vediamo è disponibile una macro READ ROM, che guarda caso viene eseguita proprio con lo stesso numero utilizzato dal datasheet, ovvero 51 (o 0x33 in esadecimale). Possiamo quindi scrivere semplicemente:

(51)

Per ottenere lo stesso risultato che abbiamo avuto in precedenza ma con una informazione aggiuntiva:

Come vedete il bus pirate risponde dicendo che il reset della linea è andato a buon fine, dopodichè rileva un indirizzo e quindi subito dopo specifica di che tipo di dispositivo si tratta.

Se avete letto l’articolo precedente, sapete di cosa sto parlando

Bene… Dal datasheet della DS18S20, però, vedo che ci sono tanti altri comandi utili che però qui non sono implementati come macro. Questo è ovvio e ha un senso logico: il BusPirate ha le macro applicabili a qualsiasi dispositivo utilizzante tale protocollo, è ovvio quindi che ogni dispositivo in particolare, poi, avrà una serie di comandi associati alla sua specifica funzione.

Nel caso della DS18S20 che sto usando per questa prova, in particolare, c’è il comando per effettuare la lettura dello scratchpad (la memoria ram nella quale vengono memorizzati i dati). Supponendo di voler effettuare una lettura di temperatura, dal datasheet vedo che dovrei eseguire le seguenti operazioni:

  • Reset linea
  • Dal momento che ho un solo dispositivo 1wire sulla linea (e quindi posso evitare di selezionare il dispositivo con cui comunicare), posso inviare il comando Skip Rom (0xCC)
  • Invio quindi il comando Convert T (0x44) che permette alla sonda di avviare la conversione di temperatura e memorizzarne il valore nello scratchpad. La conversione può durare fino a 750mS, quindi se si effettua la lettura dello scratchpad troppo velocemente, potrebbe contenere dati non validi.
  • Nuovo reset linea
  • Nuovo invio comando Skip Rom (0xCC)
  • Invio il comando di lettura dello Scratchpad (0xBE)
  • La sonda mi risponderà inviando gli 8 bytes relativi al contenuto dello scratchpad
  • Devo quindi eseguire la lettura della linea

Sul bus pirate questi comandi possono essere eseguiti in questo modo:

{ 0xCC 0x44

Aspettiamo un po’ in quanto la conversione di temperatura, su questa sonda, richiede massimo 750mS. Questo ritardo è assolutamente importante!

Il ritardo può anche essere inserito da riga di comando utilizzando i comandi & (per ritardo di 1μS) e % (comando disponibile solo sull’ultima versione del firmware, ritardo espresso in millisecondi). Per eseguire ritardi lunghi si utilizzeranno quindi i due punti, esempio &:255 indurrà un ritardo di 255 microsecondi (è il massimo sulla mia revisione di firmware, mettete più ritardi uno dietro l’altro se avete bisogno di tempi più lunghi).

Eseguiamo quindi la lettura dello scratchpad che, come sappiamo, produrrà 9 bytes:

{ 0xCC 0xBE r:9

Il bus pirate risponderà di aver eseguito tutti i comandi e quindi restituirà la lettura dello scratchpad:

Avendo a portata il datasheet possiamo ben interpretare quei bytes restituiti. In particolare sappiamo che sulla sonda DS18S20, il primo byte è la parte bassa del valore di temperatura e il secondo è la parte alta. In particolare i primi due bytes 0x31 0x00 indicano che la temperatura è di 24.5 °C.

Sulla DS18S20 la parte alta indica solo il segno, essendoci tutti 0 vuol dire che la temperatura è positiva. Nella parte bassa il byte 0 rappresenta il decimale (se è 1 dobbiamo aggiungere 0.5°C alla lettura). Togliendo il byte 0 effettuiamo uno shift a destra della restante parte per ottenere il valore intero e aggiungiamo eventualmente il mezzo grado se presente.

Links utili

Puoi andare alla fine dell'articolo e lasciare un commento. I trackback e i ping non sono attualmente consentiti.

  1. #1 da Fabio il 26 agosto 2011

    Salve
    ho letto l’articolo con molto interesse.
    All’inizio viene fatto riferimento ai protocolli supportati dalla scheda (8 in tutto) ma poi quando si rimanda alla pagina per la descrizione del pinout del connettore sono presenti solo 5 protocolli (ad esempio manca LCD Hitachi 44780 che è proprio quello sul quale mi sarebbe piaciuto divertirmi all’inizio). Nel menu ho notato che è presente come 10. LCD (ma anche nel menu c’è qualche discrepanza con l’indicazione dei protocolli).
    Grazie e, sempre, complimenti per il sito
    fabio milano

    • #2 da Giovanni Bernardo il 26 agosto 2011

      Il “problema” (se cosi lo si può definire), deriva dalle numerose versioni firmware che sono state rilasciate. Fai riferimento al sito ufficiale per l’ultima versione di firmware.

      • #3 da Fabio il 27 agosto 2011

        grazie
        in effetti ho provato a consultare il sito con maggior precisione, penso che la risposta si trovi qui:
        http://dangerousprototypes.com/2009/08/13/bus-pirate-hd44780-character-lcd-adapter/
        dovrò leggerlo con attenzione ma da una prima occhiata mi sembra di capire che non è comunque possibile un collegamento diretto: tra il bus pirate e l’LCD c’è in mezzo una adapter board
        un saluto
        fabio milano

  2. #4 da InColdBlood il 11 aprile 2012

    Una domanda, come devo collegare un eventuale ds2432?

  3. #6 da InColdBlood il 11 aprile 2012

    Ho provato ad utilizzare la resistenza di pullup interna ma non va…che resistenza posso provare a mettere?

    mi dice no device detected

  4. #8 da InColdBlood il 12 aprile 2012

    Domani provo meglio in quanto la resistenza che ho messo in pullup era da 4,7 di ma OHM domani ne provo una da 2,2 kOhm visto che ce l’ho disponibile ed la eeprom ds2432 supporta al massimo questa resistenza di pullup

    poi vediamo cosa mi dice.ho provato ad usare quella interna al bus pirate ma ugualmente non ho segni di vita…strana come cosa.

  5. #9 da InColdBlood il 12 aprile 2012

    più che altro non riesco ad interpretare sul datasheet i comandi da dare…

    il datasheet l’ho preso da qui. alla pagine 9 c’è scritto qualcosa.

  6. #10 da InColdBlood il 13 aprile 2012

    Diciamo che sto a questo punto:

    Usato un resistenza di pullup da 1kohm e sembra funzionare. quello che riporta hyperterminal è questo:

    1-WIRE>(0x33)
    BUS RESET OK
    READ ROM (0x33): 0x33 0x05 0x16 0x32 0x02 0x00 0x00 0x58
    Unknown device

    ora cosa devof are?

    • #11 da Giovanni Bernardo il 13 aprile 2012

      0x33 è l’identificativo della famiglia del dispositivo ed indica proprio una memoria DS2432 (bastava usare google, dopotutto), seguono i 6 bytes che identificano in maniera univoca il dispositivo e infine il byte di CRC. Il bus pirate ha quindi riconosciuto correttamente la memoria, non fare caso al fatto che scrive unknown device: nel firmware del bus pirate non potevano ovviamente includere tutti i nomi dei dispositivi (cioè dovevano associare ad ogni codice famiglia il nome del dispositivo).

      Ora che vuoi fare? Lo sai tu cosa ci vuoi fare con questa memoria… E’ una memoria, giusto? Memorizzaci dei dati e leggili…. Ad ogni modo se un occhio al datasheet ce lo davi (http://datasheets.maxim-ic.com/en/ds/DS2432.pdf) avresti letto subito a pagina 7 che richiedeva una resistenza di pullup massimo di 2,2K, per cui capisci che 4,7K non andava bene e 1K va bene.

      Ti dico da subito che non hai scelto un oggetto semplice con cui fare esperimenti e il datasheet che si trova in giro non è completo: manca difatti tutta la parte che spiega come accedere allo scratchpad in cui memorizzare i dati e il datasheet completo lo devi richiedere alla maxim (http://www.maxim-ic.com/datasheet/index.mvp/id/2914/t/al) selezionando “request full datasheet”. Pare difatti che questa memoria sia qualcosa di molto particolare. Di piu non so e non posso dirti.

  7. #12 da InColdBlood il 13 aprile 2012

    E infatti a me manca di fare la lettura che non so come fare.

    come faccio a leggere tutta la memoria che codice devo dare al bus pirate?

    comunque sto dispositivo è da paura…legge anche i biscotti ^_^

    • #13 da Giovanni Bernardo il 13 aprile 2012

      Te l’ho appena detto nel commento precedente: non ne ho la più pallida idea. Sul datasheet disponibile a tutti non c’è scritto. Mettiti di santa pace, fa la richiesta alla maxim di avere il datasheet completo… e leggi…

  8. #14 da InColdBlood il 13 aprile 2012

    ok, datasheet richiesto. Eventualmente poi lo posso mettere qui per avere qualche consiglio?avevo letto male copra…grazie Giovanni

Devi essere collegato per lasciare un commento.

  1. Ancora nessun trackback
Settorezero.com e il logo Zroid™ ©2007÷2017 Giovanni Bernardo - E' vietata la copia e la distribuzione anche parziale dei contenuti di questo sito web senza l'esplicito consenso dell'autore. I contenuti di settorezero.com sono distribuiti sotto una licenza Creative Commons Attribuzione-Non Commerciale-Non Opere derivate 2.5 Italia e sono soggetti alle condizioni definite nel disclaimer. Settorezero.com e tutti i suoi contenuti sono tutelati dalla legge sul diritto d'autore per cui i trasgressori sono perseguibili a norma di legge. Settorezero fa uso dei cookie leggi l'informativa estesa. Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche. Per contattare l'autore siete pregati di utilizzare la sezione contatti. Siamo presenti anche su Facebook e, meno assiduamente, anche su Twitter - Tumblr - Google+ - Blogspot - Youtube.
Creative Commons BY-NC-ND 2.5