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

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

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)