Update: Neue Firmware mit JTAG und mehr

Wir sind immer ekstatisch, um einen neuen Chip- oder SIM-Karte an die Schnittstelle zu erhalten, aber unsere Begeisterung wird in der Regel durch den Prototyping-Prozess gedämpft. Der Schnittstellen eines jeden Chips zeigt normalerweise ein Breadboarding eine Schaltung, einen Schreibcode an und ziehen Sie den Programmierer aus. Vielleicht sogar eine Prototyping-PCB.

Vor einigen Jahren haben wir den ersten “Bus-Pirat”, einer universellen Busoberfläche, gebaut, die mit vielen Chips von einem PC-Seriell-Terminal spricht. Mehrere herkömmliche serielle Protokolle werden bei 3,3-5 Vielen, einschließlich I2C, SPI und asynchroner Serien, unterstützt. Weitere ‘RAW’ 2- und 3-Wire-Bibliotheken können nahezu alle proprietären seriellen Protokolle angrenzt. In Anbetracht dessen, dass dies ein so nützliches Instrument für uns war, haben wir den Code aufgeräumt, das Design dokumentiert und hier mit Spezifikationen, Schematischen und Quellcode veröffentlicht.

Konzeptübersicht

Der Bus-Pirat ist eine serielle Klemmenbrücke zu mehreren IC-Schnittstellenprotokollen. Wir geben Befehle in ein serielles Terminal auf dem Computer ein. Die Befehle gehen über den seriellen Port zum Bus-Pirat. Der Bus-Pirat spricht mit einem Microchip im richtigen Protokoll und gibt die Ergebnisse an den PC zurück.

Alle Pins Ausgabe 3.3Volts, sind jedoch 5Volt tolerant. Bord 3.3Volt und 5VOLT-Netzteile stehen zur Verfügung, um den angeschlossenen Chip auszuführen. Software-konfigurierbare I2C-Pull-Up-Widerstände vervollständigen das Paket.

Die serielle Terminalschnittstelle arbeitet mit jedem System: PC, Mac, Linux, Palm-Piloten, Wince-Geräten usw. Keine Crapware erforderlich. Wir betrachteten ein USB-Gerät, aber USB ist nicht mit der erheblichen Anzahl von Handgeräten, die einen seriellen Port aufweisen, nicht kompatibel. Wir wollten auch ein 3.3volt-Gerät mit 5Volt-toleranten Eingängen, aber viele beliebte Durchgangsloch-USB-Mikrokontoller waren 5Volt-Teile (z. B. das PIC18FX550).

Der Bus-Pirat spricht derzeit drei Hardwareprotokolle für die Hochgeschwindigkeitsschnittstelle und verfügt über zwei Softwareprotokollbibliotheken für die einfache Busmanipulation. Die Theorie und Spezifikation jedes Protokolls ist jenseits, was wir hier abdecken können, sondern einige dieser Tutorials ansehen:

I2C.

Ein langsamer 2-Drahtbus. Wikipedia ist ein tolles Ort, um für den I2C-Hintergrund zu beginnen. I2c-bus.org, Roboterelektronik, Embedded Systems Academy und Embedded.com haben angesehene I2C-Tutorials.

Spi.

Ein basischer 3-Drahtbus. Wikipedia hat Hintergrund; Embedded.com hat ein großartiges Tutorial und einen Vergleich mit I2C.

Universeller asynchroner Empfänger-Sender (UART oder Serial)

Ein uhr- und zeitabhängiges serielles Protokoll, das am besten für sein Erscheinungsbild als das serielle PC-Protokoll bekannt ist. Wikipedia hat Hintergrund auf asynchronen seriellen Protokollen.

Roh 2 Wire.

Dies ist eine generische 2-Draht-Protokollbibliothek, ähnlich der I2C, jedoch ohne ACK-Bit. I2c und viele proprietäre 2-Draht-Protokolle können mit den in diesem Modus verfügbaren Busmanipulationen gebildet werden. Verwenden Sie diese Bibliothek, um mit Nicht-I2C 2-Draht-Geräten zu arbeiten, wie Smartcards oder Sensirion SHT11 Temperatur- / Feuchtigkeitssensoren.

Raw 3 Wire.

Dies ist eine generische 3-Draht-Protokollbibliothek, ähnlich wie SPI, jedoch ohne die Einschränkungen eines Hardwaremoduls. Verwenden Sie diese Bibliothek, um mit Geräten zu arbeiten, die nicht-8bit-kompatible 3-Draht-Protokolle verwenden, wie der Sparkfun Nokia 6100 LCD-Klopfen. Viele 3 Drahtprotokolle können mit den in diesem Modus verfügbaren Busmanipulationen gebildet werden.

Hardware

Klicken Sie auf eine vollständige PCB-Platzierung (PNG). Schraubklemmen Verbinden Sie sich mit den Netzteilen. Eine Reihe von sieben Pin-Headern verbindet sich mit den IO-Pins. Trotz des Etiketts ist nur 7Volts DC erforderlich.

STIFT

Spi.

I2C.

Rs232.

B9

Mossi

Sda

B8.

Klumpen

SCL.

B7.

Miso.

Rx

B6.

Cs.

Tx.

B5.

AUX.

AUX.

AUX.

Boden

Gnd

Gnd

Gnd

Diese Tabelle zeigt die PIN-Anschlüsse für jeden Busmodus. RAW 2 Wire-Modus verwendet dieselbe PIN-Konfiguration wie I2C. RAW 3 Wire-Modus verwendet dieselbe PIN-Konfiguration wie SPI.

Klicken Sie hier, um ein Kreislaufbild in voller Größe (PNG). Die Kreislauf- und PCB werden mit der Freeware-Version von CADSOFT Eagle erstellt. Laden Sie das Projektarchiv (ZIP) herunter.

PIC 24FJ64GA002.

Wir haben einen PIC24FJ64GA002-Mikrocontroller im Bus-Pirat verwendet; Dies ist derselbe Chip, den wir in unserem Mini-Server-Projekt verwendet haben. Es ist schnell genug, um alles zu tun, was wir wollen (16mips), und die Peripherie-Pin-Select-Funktion ermöglicht es den Hardware-SPI, UART- und I2C-Modulen, um Ausgangsstifte zu teilen. Jeder Leistungsstift benötigt einen Entkopplungskondensator (C12,13), und die MCLR-Funktion erfordert einen Widerstand (R7) zwischen Pin 1 und 3,3VOLTS. Das Foto verfügt über einen internen Spannungsregler, der einen 10UF-Tantal-Kondensator (C3) erfordert, der jedoch einen einfachen Elektrolytkondensator ohnesion verwendet haben. Lesen Sie über das Programmieren und arbeiten Sie mit diesem Chip in unserem PIC24F-Tutorial. Wenn Sie kein Foto-Debugger haben, empfehlen mehrere Leser die Under- $ 40-ICD2-Klone auf eBay.

Das Foto läuft bei 3.3Volts, aber die digitalen Stifte sind 5Volt tolerant für die Schnittstelle 5Volt-Logik. Die Pins 14,15,16,17,18,21 und 22 sind nur digital, die wir herausgefunden haben, indem wir durch das Datenblatt gesucht haben, und beseitigen alle Pins mit einem analogen Verbindungstyp (Tabelle 1-2, Seiten 11-16). Nach dem DatenblattI2C 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. Autsch! 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.

Netzteile

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).

Stückliste

Teil
Wert

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

Die Firmware ist mit der kostenlosen Demonstrationsversion des Foto-C30-Compilers in C geschrieben. Erfahren Sie alles über das Arbeiten mit diesem Foto in unserer Einführung in die FOTO 24F-Serie. Laden Sie das Projektarchiv (ZIP) herunter.

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).

Menüpunkte

Menu options are single character commands that don’t involve data transfers. enter the character, followed by , to access the menu.

? – 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 asynchreinigermaßen

] oder} – Enddaten schreiben. SPI / RAW 3 Wire: Chip Wählen Sie deaktiviert. I2c / roh 2 Draht: Stoppen Sie den Zustand. RS232: Schließen Sie UART.

R / R – Lesen Sie Byte. SPI / RAW 3 Wire: Senden Sie Dummy-Byte, return lesen. I2C: Lesen Sie Byte mit ACK. RAW 2 Draht: Lesen Sie 8 Bits. RS232: Überprüfen Sie das UART für Byte und geben Sie zurück, oder fehlgeschlagen, wenn sie leer ist. Verwenden Sie 0R1 … 255 Für Bulk liest bis zu 255 Bytes.

0b – diesen binären Wert schreiben. Das Format ist 0B00000000 für ein Byte, aber teilweise Bytes sind auch in Ordnung: 0B1001.

0h oder 0x – diesen Hex-Wert schreiben. Das Format ist 0H01 oder 0x01. Teilbytes sind in Ordnung: 0xa. A-F kann Kleinbuchstaben oder Großbuchstaben sein.

0-255 – Schreiben Sie diesen Dezimalwert. Jede Zahl, die nicht von 0x, 0h oder 0b vorausgeht, wird als Dezimalwert interpretiert.

oder Raumwert-Trennzeichen. Verwenden Sie ein Koma oder einen Platz, um Zahlen zu trennen. Jede Kombination ist in Ordnung, es ist kein Trennzeichen zwischen Nummernwerten erforderlich: {0xA6,0, 0 16 5 0B111 0HAF}.

Direkte Bus-Manipulationsbefehle für den RAW 2-Drahtmodus und den RAW-3-Drahtmodus.
^ – Senden Sie eine Uhr an. Verwenden Sie 0 ^ 1 … 255 für mehrere Uhrakten.

/ und \ – Kippzeilenhöhe hoch (/) und niedrig (\). Inklusive Taktverzögerung (100US).

– / _ – Kippdatenstatus hoch (-) und niedrig (_). Enthält eine Dateneinstellungsverzögerung (20US).

Schnitte – Lesen Sie ein Bit mit Uhr.

. – Lesen Sie den Datenstift (keine Uhr).

& – Verzögerung 1US. Verwenden Sie 0 & 1 … 255 für mehrere Verzögerungen.

Es benutzen

Hier sind zwei Beispiele, die den Bus-Pirat in Aktion zeigen. Terminals müssen mit lokalem Echo auf den ASCII-Modus eingestellt sein, wir haben das serielle Windows-Anschluss verwendet. Die serielle PC-Side-Verbindung beträgt 115200bps, 8n1. Der Bus-Pirat muss auf einen einzelnen Zeilenfuttertyp (0x0a, 0x0d) oder beides (Windows-Stil) reagieren.

.I2c / SPI – Flash 24lc1025 EEPROM

Die EEPROMs von Microchip sind beliebte Permanent-Speicher-Speicherchips, der 24LC1025 verfügt über 128 KB-Speicher mit einer I2C-Schnittstelle. Wir können diesen Chip protestieren, ohne dass Brotbraten einen großen Kreislauf oder einen Schreibcode birgt.

Das Bild zeigt einen 24lc1025, der mit dem Bus-Pirat verbunden ist. Das EEPROM arbeitet von 2,7 auf 5 volts, sodass wir die 3,3Volt-Versorgung vom Bus-Pirat verwendet haben, um den Stromkreis auszuführen. Die Bord-SDA / SCL-Pull-Up-Widerstände halten den I2C-Bus hoch und beseitigen den Bedarf an externen Widerständen. Ein einzelner 0,1UF-Kondensator entkoppelt den EEPROM von der Stromversorgung.

Setup-I2C-Modus

Erstens setzen wir den Bus-Pirat für den I2C-Modus ein und aktivieren Sie die Pull-Up-Widerstände. In Anbetracht dessen, dass der Bus-Pirat derzeit eine Software-I2C-Bibliothek verwendet, hat die Geschwindigkeitseinstellung nicht wirklich wirksam.

SPI> M <-ENTER M für MODE SELECT 1. SPI 2. I2C. 3. UART. 4. RAW 2 Draht 5. RAW 3 Draht Modus> 2 <-Enter 2 für i2c 900-Modus-Set. Geschwindigkeit einstellen: 1. 100 kHz (Standard) 2. 400 kHz (Fast-Modus) 3. 1 MHz (hohe Geschwindigkeit) Geschwindigkeit> 1 <-Speed ​​tut nicht wirklich etwas ... 901 Geschwindigkeits-Set. 202 I2C bereit, p / p für Pullups I2c> p <-Enable Die I2C-Pull-Up-Widerstände 205 I2C Pullup auf I2c >.

Schreiben Sie in EEPROM (I2C)

Alle I2C-Vorgänge beginnen mit einem Startzustand {oder [, und enden mit einem Stoppzustand} oder]. Ein Schreiben beginnt, indem Sie das Gerät (1 Byte) ansprechen und versuchen, ein Bestätigungsbit (ACK) zu finden. Wenn der EEPROM antwortet, können wir den Datenspeicherort an das Schreiben (2 Bytes) und die Daten-Nutzlast (N Bytes) senden. Der Bus-Pirat prüft automatisch nach einem ACK am Ende jedes Schreibens, und die ACKS werden jeweils gelesen.

Die 24lc1025-Basisadresse beträgt 1010 ×xy, wobei XX von dem Zustand der Pins 2 und 3 herausgefunden wird, und y ist ein Leser (1) oder einen Schreibmodus (0). Wir haben die Pins 2 und 3 hoch gebunden, um die vollständige Schreibadresse 1010110 herzustellen. Wir fangen an, am ersten Datenstandort (0 0) auf das Gerät zu schreiben, und schreibe einen bis dreizehn mit einer Mischung aus Dateneingabeformaten (1 … 13) .

I2c> {0b10100110 0 0 1 2 3 4 5 6 7 8 9 10 0xb 0xc 13} <-i2c-Befehl 210 I2C-Startbedingung <-bus Start 220 i2c schreiben: 0xa6 wurde ACK: Ja <-Dress gesendet und Ack erhalten 220 i2c schreiben: 0x00 wurde ACK: Ja <-write Adresse 220 i2c schreiben: 0x00 wurde ACK: Ja <-write Adresse 220 i2c schreiben: 0x01 Erhaltene ACK: Ja <-Data ... 220 i2c schreiben: 0x0d hat ACK: Ja 240 I2C-Stopp-Bedingung I2c >.

Aus dem EEPROM lesen (I2C)

Das Lesen des 24LC1025 erfordert zwei Schritte. Erstens stellt ein Schreibbefehl ohne Daten den Adresszeiger ein. Zweitens ein gelesenes Comm

Leave A Comment

Recommended Posts