Uncategorized

How-to: The Bus Pirate, Universal Serial Interface

Aggiornamento: nuovo firmware con JTAG e altro

Siamo sempre estatici per ottenere un nuovo chip o una carta SIM da interfacciarsi, ma il nostro entusiasmo è tipicamente smorzato dal processo di prototipazione. Interfacciare qualsiasi chip indica normalmente paneboarding a circuito, codice di scrittura e tirare fuori il programmatore; Forse anche un PCB di prototipazione.

Qualche anno fa abbiamo costruito il primo “pirata dell’autobus”, un’interfaccia universale del bus che parla con un sacco di chip da un terminale seriale del PC. Diversi protocolli seriali convenzionali sono supportati a 3,3-5 volte, tra cui I2C, SPI e serial asincrono. Le librerie aggiuntive “RAW” a 2 e 3 fili possono interfacciare quasi tutti i protocolli seriali proprietari. Considerando che questo è stato tale strumento benefico per noi, abbiamo ripulito il codice, documentato il design e lo ha rilasciato qui con specifiche, schematiche e codice sorgente.

Panoramica del concetto

Il pirata del bus è un ponte del terminal seriale a più protocolli di interfaccia IC. Digitino comandi in un terminale seriale sul computer. I comandi vanno al pirata del bus attraverso la porta seriale del PC. Il pirata del bus parla con un microchip nel protocollo corretto e restituisce i risultati al PC.

Tutte le pin output 3.3volts, ma sono tolleranti a 5 Volt. A bordo di alimentazione 3.3 Volt e 5Volt sono disponibili per alimentare il chip collegato. I resistori di pull-up I2C configurabili software completano il pacchetto.

L’interfaccia del terminale seriale funziona con qualsiasi sistema: PC, Mac, Linux, piloti di palma, dispositivi wince, ecc; Nessun crapware richiesto. Abbiamo considerato un dispositivo USB, ma USB non è compatibile con il numero considerevole di dispositivi portatili che hanno una porta seriale. Volevamo anche un dispositivo da 3.3Volt con ingressi tolleranti a 5 Volt, ma molti popolari microcontofronti USB foro passano erano parti a 5 Volt (ad esempio il PIC18FX550).

Il pirata del bus attualmente ‘parla’ Tre protocolli hardware per l’interfaccia ad alta velocità e dispone di due librerie di protocollo software per una facile manipolazione del bus. La teoria e la specifica di ciascun protocollo sono al di là di ciò che possiamo coprire qui, ma dai un’occhiata ad alcuni di questi tutorial:

I2C.

Un lento autobus a 2 fili. Wikipedia è un luogo fantastico per iniziare per lo sfondo I2C. I2c-bus.org, Robot Electronics, Systems Academy Embedded, e Embedded.com hanno rispettabili tutorial I2C.

Spi.

Un bus di base a 3 fili. Wikipedia ha sfondo; Embedded.com ha un tutorial eccezionale e confronto con I2C.

Trasmettitore di ricevitore asincrono universale (UART o seriale)

Un protocollo seriale dipendente dall’orologio e del temporizzazione più noto per il suo aspetto come protocollo della porta seriale del PC. Wikipedia ha sfondo su protocolli seriali asincroni.

Raw 2 Wire.

Questa è una libreria generica di protocollo a 2 fili, simile a I2C ma senza un bit ACK. I2C e molti protocolli proprietari di 2 fili possono essere formati utilizzando le manipolazioni del bus disponibile in questa modalità. Utilizzare questa libreria per funzionare con dispositivi non I2C 2, come SmartCards o Sensirion SHT11 Sensori di temperatura / umidità.

Raw 3 Wire.

Questa è una libreria generica di protocollo a 3 fili, simile a SPI ma senza i vincoli di un modulo hardware. Utilizzare questa libreria per lavorare con dispositivi che utilizzano protocolli a 3 fili compatibili non a 8 bit, come il knock-off del LCD Sparkfun Nokia 6100. Un sacco di protocolli a 3 fili possono essere formati utilizzando le manipolazioni del bus disponibile in questa modalità.

Hardware

Fare clic per un’immagine di posizionamento PCB a dimensione intera (PNG). Terminali a vite Connettiti alle alimentatorie. Una riga di sette intestazioni PIN si collega ai perni IO. Nonostante l’etichetta, è richiesta solo 7volts DC.

SPILLO

Spi.

I2C.

RS232.

B9.

Mosi

SDA.

B8.

Clk.

SCL.

B7.

MISO

Rx.

B6.

Cs.

Tx.

B5.

Aux.

Aux.

Aux.

Terra

Gnd.

Gnd.

Gnd.

Questa tabella mostra le connessioni PIN per ciascuna modalità BUS. La modalità RAW 2 Wire utilizza la stessa configurazione PIN come I2C. La modalità RAW 3 Wire utilizza la stessa configurazione PIN come SPI.

Fare clic per un’immagine del circuito a grandezza naturale (PNG). Il circuito e il PCB vengono creati utilizzando la versione freeware di Cadsoft Eagle. Scarica l’archivio del progetto (zip).

PIC 24FJ64GA002

We used a PIC24FJ64GA002 microcontroller in the Bus Pirate; this is the same chip we used in our mini-server project. It’s fast enough to do everything we want (16MIPS), and the peripheral pin select feature allows the hardware SPI, UART, and I2C modules to share output pins. Each power pin needs a decoupling capacitor(C12,13), and the MCLR function requires a resistor (R7) between pin 1 and 3.3volts. The photo has an internal voltage regulator that requires a 10uF tantalum capacitor (C3), though we used a plain electrolytic capacitor without issue. read about programming and working with this chip in our PIC24F tutorial. If you don’t have a photo debugger, several readers recommend the under-$40 ICD2 clones on eBay.

The photo runs at 3.3volts, but the digital-only pins are 5volt tolerant for interfacing 5volt logic. Pins 14,15,16,17,18,21, and 22, are digital only, which we figured out by looking through the datasheet and eliminating any pins with an analog connection type (table 1-2, pages 11-16). According to the datasheet,Anche i pin I2C sono tolleranti a 5 Volt. C’è un sacco di informazioni in conflitto sul web, ma scheda tecnica Page 230, parametro DI28, afferma chiaramente che l’ingresso massimo per un perno I2C 24FJ64GA002 senza circuiteria analogica è 5.5volta.

I pin 21 e 22 (RB10 / 11) possono pull-up SDA / SCL attraverso resistori R4 e R5.

Max3223cpp.

Questo chip converte l’uscita seriale 3.3Volt su segnali +/- 10volt RS232 compatibili con una porta seriale del PC. Il MAX3223CPP è una versione a 3-5Volt del MAX202, con funzionalità di risparmio energetico extra. I ricetrasmettitori MAX RS232 richiedono quattro condensatori 0,1UF per una pompa di carica (C4,5,7,8) e un condensatore di disaccoppiamento (C17). Abbiamo usato gli stessi condensatori per tutto.

Abbiamo usato un MAX3223Cpp, che non sembra più disponibile. MAX3223EPP + è una versione più recente compatibile con PIN, disponibile su DigiKey per $ 7. Ahia! Nessuna delle funzionalità di risparmio energetico di 3223 vengono utilizzate, quindi un ricetrasmettitore RS232 più economico, più semplice da 3,3 Vert da RS232 deve essere sostituito se in alcun modo possibile.

Riserve energetiche

La maggior parte dei chip può essere alimentata dalla fornitura di forniture da 3.3 Volt di 3.3 Volt di Bus Pirate e 5 Volt. 5volts è fornito da un regolatore comune 7805 (VR2) e due condensatori di disaccoppiamento (C9,10). Un regolatore regolabile LM317 (VR1) è impostato su 3.3volt utilizzando due resistori (R2,3) e richiede due condensatori di disaccoppiamento (C6,7). Il circuito richiede una fornitura DC a 7-10Volt (J1).

Elenco delle parti

Parte
Valore

IC1.
PIC24FJ64GA002-DIP.

IC2.
Max3223cpp (provare max3223eeepp +)

C3.
Condensatore 10UF (preferibilmente tantalio)

C4-13,17.
Condensatori 0,1UF.

R1.
Resistenza 330 ohm.

R2.
Resistenza 240 ohm.

R3.
Resistore 390 Ohm.

R4,5,7.
Resistenza 2k2 ohm.

Vr1.
LM317.

Vr2.
LM7805.

X1.
Morsetto a vite (3 terminali) * Non testato

X2.
Connettore femmina DB9 (porta seriale) * non testata

ICSP, SV3.
.1 “Intestazione pin, angolo ideale

J1.
POWER JACK, PIN 2.1MM

LED1.
LED 3mm (opzionale)

Firmware

Il firmware è scritto in C usando la versione dimostrativa gratuita del compilatore Foto C30. Scopri tutto sul lavoro con questa foto nella nostra introduzione alla serie Photo 24F Series. Scarica l’archivio del progetto (zip).

Main.C – Gestisce l’interfaccia terminale dell’utente.

Buspirate.c – Routine di astrazione che convertono la sintassi in azioni sul bus corretto.

UARTIO.C – IO routine per entrambi gli urt hardware.

M_I2C_1.C – Software di routine I2C di [Michael Pearce]. Non siamo riusciti a far funzionare l’hardware fotografico I2C, quindi abbiamo usato questa preziosa biblioteca. Il software non tiene conto dell’impostazione della velocità I2C e sembra funzionare a circa 5khz.

SPI.C – Routine che guidano il modulo Hardware SPI.

Raw2wire.c – Libreria di interfaccia a 2 fili software.

Raw3wire.c – Libreria di interfaccia del software a 3 fili (SPI).

L’ingresso dell’utente è tenuto in un buffer di 4000 byte fino a quando viene rilevato un carattere di nuova riga (immettere). Se il primo carattere dell’ingresso è un’opzione di menu (vedi sotto), viene visualizzata la finestra di dialogo del menu, altrimenti la stringa viene analizzata per i dati da inviare sul bus (vedere la sintassi). Il codice è costituito da un numero imbarazzante di dichiarazioni di switch e codice di spaghetti.

Interfaccia del terminale

Piuttosto che scrivere un pezzo di software spazzatura per controllare il dispositivo, abbiamo dato un’interfaccia di riga di comando seriale che funzionerà con qualsiasi terminale ASCII. Il pirata dell’autobus risponde ai comandi con i codici risultato a tre cifre e un breve messaggio. I codici sono creati con l’automazione del PC in mente. Abbiamo incluso un tavolo di codici risultato nell’archivio del progetto (zip).

Opzioni del menu

Le opzioni del menu sono comandi di caratteri singoli che non coinvolgono i trasferimenti di dati. Immettere il carattere, seguito da , per accedere al menu.

? – Mostra un menu di aiuto con comandi e sintassi.

M – Impostare la modalità BUS (SPI, I2C, UART, RAW 2 Wire, Raw 3 Wire). seguito subito da un prompt per la velocità, la polarità e lo stato di uscita (dipendente dalla modalità).

Velocità del bus: SPI: 30, 125, 250, 1000KHz. I2C: 100, 400, 1000KHz. UART: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200bps. Modalità RAW: 1, 10, 50KHz.

L’impostazione dell’orologio inverso imposta lo stato inattivo opposto di Normal (Normal SPI: inattivo basso; UART normale: IDLE ALTO): SPI: Italiano alto; UART: inattivo basso.

Alcune modalità hanno modalità di uscita High-Z opzionali per l’uso con resistori a pull-up (basso = terra, alto = ingresso).

L – Toggle Bit Transmit / Ricevi Ordine: la maggior parte / meno significativa bit prima.

P – SDA / SCL Pin Toggle Resistor (3.3Volts). Valido solo in modalità I2C e RAW 2 Wire.

O – Formato di visualizzazione dell’uscita numero impostato. Il terminale può visualizzare i numeri come valori decimale, esadecimale e ASCII binari. Un quarto formato invia il byte crudo e non trasformato per la lettura del testo formattato ASCII.

Sintassi

Una sintassi di base viene utilizzata per comunicare con chip su un autobus. I comandi di sintassi hanno funzioni generiche che normalmente si applicano a tutti i tipi di autobus.

A / A / @ – Toggle Ausiliary Pin. Capitale “A” Set AUX HIGH, PICCOLO “A” Set a terra. @ Imposta AUX per immettere (modalità ad alta impedenza) e legge il valore PIN.

[- Iniziare i dati scrivi. SPI / RAW 3 WIRE: Chip Select abilitato. I2C / RAW 2 Wire: Start Condizione. RS232: aperto UART, scartare i byte ricevute.

{- Inizia i dati scrivere con letture. Come [, eccetto: SPI / RAW 3 Wire: mostra il byte di lettura per ogni scrittura. RS232: visualizza i dati in quanto arriva Asynchronorly.

] o} – Scrittura dei dati di fine. SPI / RAW 3 Wire: Chip Select Disabilitato. I2C / RAW 2 WIRE: condizione di arresto. RS232: chiudi UART.

R / r – Leggi byte. SPI / RAW 3 Wire: invia dummy byte, restituire leggi. I2C: leggi byte con ACK. Raw 2 Wire: leggi 8 bit. RS232: controllare UART per byte e ritorno o fallire se vuoto. Utilizzare 0R1 … 255 per la Bulk legge fino a 255 byte.

0b – Scrivi questo valore binario. Il formato è 0B00000000 per un byte, ma anche i byte parziali sono fini: 0b1001.

0h o 0x – Scrivi questo valore esadecimale. Il formato è 0H01 o 0x01. Byte parziali vanno bene: 0xa. A-F può essere minuscole o lettere maiuscole.

0-255 – Scrivi questo valore decimale. Qualsiasi numero non preceduto da 0x, 0h o 0b è interpretato come valore decimale.

o delimitatore del valore di spazio. Utilizzare un coma o uno spazio per separare i numeri. Qualsiasi combinazione va bene, nessun delimitatore è richiesto tra i valori non numerici: {0xa6,0, 0 16 5 0b111 0HAF}.

Comandi di manipolazione del bus diretto per la modalità RAW 2 Wire e la modalità RAW 3 Wire.
^ – Invia un segno di spunta dell’orologio. Utilizzare 0 ^ 1 … 255 per più zecche di orologio.

/ e \ – a levetta il livello dell’orologio alto (/) e basso (\). Include il ritardo dell’orologio (100US).

– / _ – Toggle Data State High (-) e Low (_). Include il ritardo di impostazione dei dati (20US).

! – Leggi un bit con orologio.

. – Leggi lo stato dei dati dei dati (nessun orologio).

& – ritardare 1us. Utilizzare 0 e 1 … 255 per più ritardi.

Usandolo

Ecco due esempi che mostrano il pirata dell’autobus in azione. I terminali devono essere impostati sulla modalità ASCII con ECHO locale, abbiamo utilizzato il terminale seriale di Windows. La connessione seriale lato PC è 115200bps, 8N1. Il pirata del bus deve rispondere a qualsiasi tipo di alimentazione a linea singola (0x0a, 0x0D) o entrambi (stile Windows).

.I2C / SPI – Flash 24LC1025 EEPROM

Le EEPROM di Microchip sono popolari chip di memoria permanente-stoccaggio, il 24LC1025 ha 128kBytes di memoria con un’interfaccia I2C. Possiamo testare questo chip senza pane-imbarco un grande circuito o un codice di scrittura.

L’immagine mostra un 24LC1025 collegato al pirata del bus. La EEPROM funziona da 2,7 a 5volt, quindi abbiamo utilizzato la fornitura di 3.3 Volt dal pirata del bus per alimentare il circuito. Le resistenze estraibili SDA / SCL di bordo tengono alto il bus I2C ed eliminano la necessità di resistori esterni. Un singolo condensatore da 0,1UF disaccoppia la EEPROM dall’alimentazione.

Setup Modalità I2C.

Innanzitutto, installiamo il pirata dell’autobus per la modalità I2C e consente ai resistori pull-up. Considerando che il pirata dell’autobus utilizza attualmente una libreria I2C del software, l’impostazione della velocità non ha davvero un effetto.

SPI> M <-ENTER M PER MODALITÀ SELECT 1. SPI. 2. I2C. 3. UART. 4. Raw 2 Wire 5. Raw 3 Wire Modalità> 2 <-ENTER 2 per I2C Set di modalità 900 Impostare la velocità: 1. 100khz (standard) 2. 400KHz (modalità veloce) 3. 1MHz (alta velocità) Velocità> 1 <-speed non fa davvero nulla ... 901 set di velocità 202 I2C Pronto, P / P per Pullups I2C> P <-Enable I resistori di tiro I2C 205 Pull-up I2C I2c >.

Scrivi a Eeprom (I2C)

Tutte le operazioni I2C iniziano con una condizione di avvio {o [e termina con una condizione di arresto} o]. Una scrittura inizia rivoltando al dispositivo (1 byte) e cercando di trovare un bit di riconoscimento (ACK). Se la EEPROM risponde, possiamo inviare la posizione dei dati per scrivere (2 byte) e il carico utile dei dati (byte n). Il pirata dell’autobus controlla automaticamente un ACK alla fine di ogni scrittura, e Acks ogni lettura.

L’indirizzo di base 24LC1025 è 1010xxy, dove XX è capito dallo stato dei Pin 2 e 3 e Y è la lettura (1) o la modalità scrittura (0). Abbiamo legato i perni 2 e 3 in alto, rendendo l’indirizzo completo della scrittura 1010110. Iniziamo a scrivere sul dispositivo alla prima posizione dei dati (0 0) e scriverne uno a tredici utilizzando un mix di formati di input dei dati (1 … 13) .

I2C> {0B10100110 0 0 1 2 3 4 5 6 7 8 9 10 0XB 0xC 13} <-I2C Command Condizione di avvio di 210 I2C <-BUS START 220 I2C Scrivi: 0xa6 ottenuto ACK: sì <-Address inviato e ACK ricevuto 220 I2C Scrivi: 0x00 GOT ACK: Sì <-Drive Indirizzo 220 I2C Scrivi: 0x00 GOT ACK: Sì <-Drive Indirizzo 220 I2C Scrivi: 0x01 ottenuto ACK: sì <-Data ... 220 I2C Scrivi: 0x0D ha ottenuto ACK: sì 240 condizione di arresto I2C I2c >.

Leggi da EEPROM (I2C)

Leggere il 24LC1025 prende due gradini. Innanzitutto, un comando di scrittura senza dati imposta il puntatore dell’indirizzo. Secondo, una lettura comm