Uppdatering: Ny firmware med JTAG och mer
Vi är alltid extatisk för att få ett nytt chip eller SIM-kort till gränssnittet, men vår entusiasm dämpas vanligtvis av prototypsprocessen. Interfacing något chip indikerar normalt brödbräda en krets, skrivkod och hämtar programmeraren; Kanske även en prototypande PCB.
För några år sedan byggde vi den första “busspiraten”, ett universellt bussgränssnitt som talar med mycket chips från en PC-seriell terminal. Flera konventionella seriella protokoll stöds vid 3,3-5Volts, inklusive I2C, SPI och asynkron seriell. Ytterligare “råa” 2- och 3-trådsbibliotek kan gränsa nästan alla proprietära seriella protokoll. Med tanke på att detta har varit ett sådant fördelaktigt verktyg för oss, städade vi upp koden, dokumenterade designen och släppte den här med specs, schematisk och källkod.
Konceptöversikt
Busspiraten är en seriell terminalbro till flera IC-gränssnittsprotokoll. Vi skriver kommandon till en seriell terminal på datorn. Kommandon går till bussen pirat genom PC-seriell port. Busspiraten talar till en mikrochip i rätt protokoll och returnerar resultaten till datorn.
Alla Pins-utgång 3.3 Volts, men är 5Volt toleranta. Ombord 3.3Volt och 5Volt nätaggregat är tillgängliga för att driva det anslutna chipet. Programvara Konfigurerbara I2C-uppdragsmotstånd Slutför paketet.
Det seriella terminalgränssnittet fungerar med vilket system som helst: PC, Mac, Linux, Palm piloter, Wince-enheter, etc; Ingen crapware krävs. Vi ansåg en USB-enhet, men USB är inte kompatibel med det stora antalet handhållna enheter som har en seriell port. Vi ville också ha en 3,3 volt-enhet med 5Volt toleranta ingångar, men många populära genomgående USB-mikrokontroller var 5Volt-delar (t.ex. PIC18FX550).
Busspiraten “Talar” tre hårdvaruprotokoll för höghastighetsgränssnitt och har två programvaruprotokollbibliotek för enkel bussmanipulation. Teorin och specifikationen för varje protokoll är bortom vad vi kan täcka här, men kolla in några av dessa handledning:
I2c
En långsam 2 trådbuss. Wikipedia är en utmärkt plats att börja för i2c bakgrund. I2c-bus.org, robotelektronik, inbäddade systemakademin och inbäddade.com har respektabla I2C-handledning.
Spi
En grundläggande 3 trådbuss. Wikipedia har bakgrund; Embedded.com har en fantastisk handledning och jämförelse med I2C.
Universal asynkron mottagare sändare (UART eller serie)
Ett klocka och tidsberoende seriellt protokoll som är mest känt för sitt utseende som PC-seriell portprotokoll. Wikipedia har bakgrund på asynkrona seriella protokoll.
RAW 2 WIRE
Detta är ett generiskt 2-tråds protokollbibliotek, liknande I2C men utan en ACK-bit. I2C och massor av proprietära 2 trådprotokoll kan bildas med hjälp av bussmanipuleringarna i detta läge. Använd det här biblioteket för att fungera med icke-I2C 2-trådar, som smartkort eller sensirion SHT11 temperatur / fuktighetssensorer.
RAW 3 WIRE
Detta är ett generiskt 3-tråds protokollbibliotek, som liknar SPI men utan begränsningar i en hårdvarumodul. Använd det här biblioteket för att fungera med enheter som använder icke-8bit-kompatibla 3-tråds protokoll, som Sparkfun Nokia 6100 LCD-knapp. Massor av 3 trådprotokoll kan bildas med hjälp av bussmanipuleringarna i detta läge.
Hårdvara
Klicka för en full storlek PCB-placering bild (PNG). Skruvterminaler ansluts till strömförsörjningen. En rad med sju stiftshuvud ansluts till IO-stiften. Trots etiketten krävs endast 7Volts DC.
STIFT
Spi
I2c
RS232
B9
Mosi
Sda
–
B8
Klick
Summa
–
B7
Missa
–
Rx
B6
Cs
–
Tx
B5
Aux
Aux
Aux
Jord
Gnida
Gnida
Gnida
Tabellen visar stiftanslutningarna för varje bussläge. RAW 2 WIRE-läget använder samma PIN-konfiguration som I2C. RAW 3 WIRE-läget använder samma PIN-konfiguration som SPI.
Klicka för en Full Size-kretsbild (PNG). Kretskortet och PCB skapas med hjälp av freeware-versionen av Cadsoft Eagle. Ladda ner projektarkivet (ZIP).
PIC 24FJ64GA002
Vi använde en PIC24FJ64GA002 mikrokontroller i busspiraten; Detta är samma chip som vi använde i vårt mini-serverprojekt. Det är tillräckligt snabbt för att göra allt vi vill ha (16Mips), och funktionen perifer PIN-väljare tillåter maskinvaru-SPI, UART och I2C-modulerna att dela utgångspinnar. Varje strömstift behöver en avkopplingskondensator (C12, 13) och MCLR-funktionen kräver ett motstånd (R7) mellan stift 1 och 3.3 volt. Bilden har en intern spänningsregulator som kräver en 10uf tantal kondensator (C3), även om vi använde en vanlig elektrolytkondensator utan problem. Läs om programmering och arbetar med detta chip i vår pic24f-handledning. Om du inte har en Photo Deugger rekommenderar flera läsare under- $ 40 ICD2-klonerna på eBay.
Fotoet körs vid 3.3 volter, men de digitala pinnarna är 5Volt toleranta för att gränsa 5Volt logik. PINS 14,15,16,17,18,21, och 22, är endast digitala, som vi tänkte genom att titta igenom databladet och eliminera några stift med en analog anslutningstyp (tabell 1-2, sidorna 11-16). Enligt databladet,I2C pins are also 5volt tolerant. There’s a bunch of conflicting information on the web, but datasheet page 230, parameter DI28, clearly states that the max input for a 24FJ64GA002 I2C pin without analog circuitry is 5.5volts.
Pins 21 and 22 (RB10/11) can pull-up SDA/SCL through resistors R4 and R5.
MAX3223CPP
This chip converts 3.3volt serial output to +/-10volt RS232 signals compatible with a PC serial port. The MAX3223CPP is a 3-5volt version of the MAX202, with extra power saving features. MAX RS232 transceivers require four 0.1uF capacitors for a charge pump (C4,5,7,8), and one decoupling capacitor (C17). We used the same capacitors for everything.
We used a MAX3223CPP, which doesn’t seem to be available anymore. MAX3223EEPP+ is a pin-compatible newer version, available at Digikey for $7. aj! None of the 3223’s power saving features are used, so a cheaper, simpler 3.3volt RS232 transceiver must be substituted if in any way possible.
Nätaggregat
Most chips can be powered from the Bus Pirate’s on-board 3.3volt and 5volt supplies. 5volts is supplied by a common 7805 regulator (VR2) and two decoupling capacitors (C9,10). An LM317 adjustable regulator (VR1) is set to 3.3volts using two resistors (R2,3), and requires two decoupling capacitors (C6,7). The circuit requires a 7-10volt DC supply (J1).
Part list
Del
Värde
IC1
PIC24FJ64GA002-DIP
IC2
MAX3223CPP (try MAX3223EEPP+)
C3
10uF capacitor (preferably tantalum)
C4-13,17
0.1uF capacitors
R1
330 ohm resistor
R2
240 ohm resistor
R3
390 ohm resistor
R4,5,7
2K2 ohm resistor
VR1
LM317
VR2
LM7805
X1
Screw clamp (3 terminals) *untested
X2
DB9 female connector (serial port) *untested
ICSP,SV3
.1″ pin header, ideal angle
J1
Power jack, 2.1mm pin
LED1
3mm LED (optional)
Firmware
The firmware is written in C using the complimentary demonstration version of the photo C30 compiler. learn all about working with this photo in our introduction to the photo 24F series. Ladda ner projektarkivet (ZIP).
main.c – Handles the user terminal interface.
busPirate.c – Abstraction routines that convert syntax to actions on the proper bus.
uartIO.c – IO routines for both hardware UARTs.
m_i2c_1.c – software I2C routines by [Michael Pearce]. We couldn’t get the photo hardware I2C to work, so we used this valuable library. The software doesn’t take into account the I2C speed setting, and seems to work at about 5KHz.
SPI.c – routines that drive the hardware SPI module.
raw2wire.c – software 2-wire interface library.
raw3wire.c – software 3-wire (SPI) interface library.
User input is held in a 4000 byte buffer until a newline character (enter) is detected. If the first character of the input is a menu option (see below), the menu dialog is shown, otherwise the string is parsed for data to send over the bus (see syntax). The code consists of an embarrassing number of switch statements and spaghetti code.
Terminal interface
Rather than write a junk piece of software to control the device, we gave it a serial command line interface that will work with any ASCII terminal. The bus pirate responds to commands with three digit result codes and a short message. The codes are created with PC automation in mind. We’ve included a table of result codes in the project archive (zip).
Menu options
Menu options are single character commands that don’t involve data transfers. enter the character, followed by
? – show a help menu with commands and syntax.
M – set the bus mode (SPI, I2C, UART, raw 2 wire, raw 3 wire). followed right away by a prompt for speed, polarity, and output state (mode dependent).
Bus speeds: SPI:30, 125, 250, 1000KHz. I2C:100, 400, 1000KHz. UART: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200bps. Raw modes: 1, 10, 50KHz.
Inverse clock setting sets the idle state opposite of normal (normal SPI:idle low; normal UART:idle high): SPI:idle high; UART:idle low.
Some modes have optional high-z output modes for use with pull-up resistors (Low=ground, High=input).
L – Toggle bit transmit/receive order: most/least significant bit first.
P – SDA/SCL pin pull-up resistor toggle (3.3volts). only valid in I2C and raw 2 wire modes.
O – set number output display format. The terminal can display numbers as decimal, hexadecimal, and binary ASCII values. A fourth format sends the raw, unprocessed byte for reading ASCII formatted text.
Syntax
A basic syntax is used to communicate with chips over a bus. Syntax commands have generic functions that normally apply to all bus types.
A/a/@ – Toggle auxiliary pin. capital “A” sets AUX high, small “a” sets to ground. @ sets aux to input (high impedance mode) and reads the pin value.
[ – start data write. SPI/raw 3 wire: chip select enabled. I2C/raw 2 wire: start condition. RS232: open UART, discard received bytes.
{ – start data write with reads. same as [, except: SPI/raw 3 wire: show the read byte for each write. RS232: display data as it arrives asynchronously.
] eller} – slutdata skriva. SPI / RAW 3 Wire: Chip Välj inaktiverad. I2C / RAW 2 Wire: Stopp villkor. RS232: Stäng UART.
R / R – Läs byte. Spi / RAW 3 Wire: Skicka dummy byte, returläsning. I2C: Läs byte med ack. RAW 2 WIRE: Läs 8 bitar. RS232: Kontrollera UART för byte och retur, eller misslyckas om det är tomt. Använd 0R1 … 255 för bulk läser upp till 255 byte.
0b – Skriv detta binära värde. Formatet är 0B00000000 för en byte, men delvis byte är också bra: 0B1001.
0H eller 0x – skriv detta hex-värde. Formatet är 0H01 eller 0x01. Delvis byte är bra: 0xa. A-F kan vara små bokstäver eller stora bokstäver.
0-255 – Skriv detta decimalvärde. Eventuellt antal som inte föregås av 0x, 0H eller 0B tolkas som ett decimaltvärde.
eller rymdvärdeavgränsare. Använd en koma eller en plats för att separera siffror. Vilken kombination som helst är bra, ingen avgränsare krävs mellan icke-talvärden: {0xa6,0, 0 16 5 0b111 0Haf}.
Direktbussmanipulationskommandon för RAW 2 Wire Mode och RAW 3 Wire-läge.
^ – Skicka en klocka tick. Använd 0 ^ 1 … 255 för flera klockor.
/ och \ – Växla klocknivå hög (/) och lågt (\). Innehåller klockfördröjning (100US).
– / _ – Växla datatillstånd högt (-) och lågt (_). Innehåller datainställningsfördröjning (20us).
! – Läs en bit med klocka.
. – Läs datastillstånd (ingen klocka).
& – Fördröjning 1us. Använd 0 & 1 … 255 för flera förseningar.
Använder det
Här är två exempel som visar bussen pirat i aktion. Terminalerna måste ställas in på ASCII-läge med lokalt eko, vi använde Windows Serial Terminal. PC-sidan seriell anslutning är 115200bps, 8N1. Busspiratet måste svara på någon enkelriktad matningstyp (0x0a, 0x0d), eller båda (Windows-stil).
.I2C / SPI – Flash 24LC1025 EEPROM
Microchips EEproms är populära permanenta lagringsminneschips, 24LC1025 har 128Kbytes lagring med ett I2C-gränssnitt. Vi kan testa detta chip utan brödbräda en stor krets eller skrivkod.
Bilden visar en 24lc1025 ansluten till busspiraten. EEPROM fungerar från 2,7 till 5Volts, så vi använde 3.3Volt-tillförseln från bussens pirat för att driva kretsen. SDA / SCL-uppdragsmotstånd håller I2C-bussen hög och eliminerar behovet av externa motstånd. En enda 0,1uf kondensator avvecklar EEPROM från strömförsörjningen.
Installation i2c-läge
Först sätter vi bussen pirat för I2C-läge och aktiverar pull-up-motstånden. Med tanke på att busspiratet för närvarande använder ett program för programvara i2c, har hastighetsinställningen inte en effekt.
Spi> m <-enter m för läge Välj 1. SPI 2. I2C 3. UART 4. RAW 2 WIRE 5. RAW 3 WIRE Läge> 2 <-enter 2 för i2c 900 lägesuppsättning Ange hastighet: 1. 100kHz (standard) 2. 400kHz (snabbläge) 3. 1MHz (hög hastighet) Hastighet> 1 <-Speed gör inte riktigt ... 901 Speed Set 202 I2C redo, P / P för pullups I2c> p <-Able the I2C Pull-Up-motstånden 205 i2c pullup på I2c>
Skriv till EEPROM (I2C)
Alla I2C-operationer börjar med ett startläge {eller [, och sluta med ett stoppläge} eller]. En skriv börjar genom att adressera enheten (1 byte) och försöker hitta en bekräftelsebit (ACK). Om EEPROM svarar kan vi skicka datalplatsen för att skriva (2 byte) och data nyttolast (n bytes). Busspiratet kontrollerar automatiskt för en ACK i slutet av varje skrivning och ACKs vardera läser.
24LC1025-basadressen är 1010xxy, där XX räknas ut av tillståndet av stift 2 och 3, och Y läser (1) eller skriv (0). Vi bundna stift 2 och 3 höga, vilket gör den fullständiga skrivadressen 1010110. Vi börjar skriva till enheten på den första datalositionen (0 0) och skriv en till tretton med hjälp av en mix av datainmatningsformat (1 … 13) .
I2c> {0b10100110 0 0 1 2 3 4 5 6 7 8 9 10 0xb 0xc 13} <-I2C-kommando 210 i2c startvillkor <-bus start 220 I2C Skriv: 0xa6 Fick Ack: Ja <-Address skickad och Ack fick 220 I2C Skriv: 0x00 har Ack: Ja <-Write Adress 220 I2C Skriv: 0x00 har Ack: Ja <-Write Adress 220 I2C Skriv: 0x01 Fick Ack: Ja <-data ... 220 I2C Skriv: 0x0d fick Ack: Ja 240 i2c stoppa villkoret I2c>
Läs från EEPROM (I2C)
Att läsa 24LC1025 tar två steg. För det första anger ett skrivkommando utan data adresspekaren. För det andra, en läs comm