Download: buspirate.v0c.zip
A few weeks ago we wrote about our Bus Pirate universal serial interface tool. We used the recent holiday to add some new features, like a JTAG programmer, macros, frequency measurement, and more. A major code reorganization makes everything simpler to read and update.
Check out the a demonstration of the new features below. We’re compiling a roadmap and wish list, so share your ideas in the comments. You can also see how we used the Bus Pirate to read a smart card and test-drive an I2C crystal oscillator.
New protocols
I2C>m <–setup mode
1. HiZ <– high impedance pins (safe mode)
2. 1-WIRE <– not ready for this release
3. UART
4. i2c
5. SPI
6. JTAG <– interface and programmer
7. Raw2wire
8. Raw3wire
MODE>1
Ensemble de mode 900
HiZ>
This firmware release lists three new protocols.
Hi-Z makes all pins high impedance/input, a safe state that won’t damage an attached circuit. To be safe, the Bus Pirate now starts in this mode.
1-Wire is listed, but we couldn’t include it in this release because we still don’t have any parts to test with our library. This is just a placeholder for now, but it will be added as soon as we get a 1-Wire part to test.
We wrote a simplified JTAG interface that includes a XSVF player for programming JTAG device chains.
**We included a hardware I2C library, but according to the device errata there’s a bug in the 24FJ64GA002 rev3 I2C module. This will work with a different chip (e.g. a 28pin dsPIC33).
Connection table
ÉPINGLER
1-Wire
I2C*
SPI**
RS232
JTAG
B9
SDA
SDA
MOSI
–
TDI
B8
–
SCL
CLK
–
TCK
B7
–
–
MISO
RX
TDO
B6
–
–
CS
TX
TMS
B5
Aux
Aux
Aux
Aux
Aux
Sol
Gnd
Gnd
Gnd
Gnd
Gnd
*also raw 2 wire. **also raw 3 wire.
The new modes connect to the Bus Pirate as described in the table.
New features and settings
Frequency measurement
HiZ>F <– do a frequency count 9xx FREQ count ON AUX: 22199552Hz (22MHz) HiZ>
As seen in the DS1077 demonstration, we added a frequency counter to the Bus Pirate’s AUX pin. ‘F’ steps frequency, maximum of about 50MHz.
Assign axillary control
HiZ>c <– menu c AUX PIN 1. AUX (DEFAULT) 2. CS/TMS MODE>1 <– set AUX control mode 9xx AUX: DEFAULT setting (AUX PIN) HiZ>
Sometimes we need to control the chip select (CS) /JTAG state device (TMS) pins manually. ‘c’ toggles the pin control between the axillary pin and the chip select pin.
Set terminal speed
HiZ>b <– menu b Set serial port speed: (bps) 1. 300 ... 9. 115200 SPEED>9 <– set speed Adjust your terminal and press space to continue HiZ>
‘b’ adjusts the PC-side serial port speed.
Macros
A new syntax addition, ‘(#)’, triggers protocol dependent macros.
JTAG>(0) <–macro 0 0.macro Menu 1.Reset chain 2.Probe chain 3.XSVF player JTAG>
In any mode, use the macro (0) to display a menu of available macros.
I2C address search
I2C>(1) <–scan I2C addresses macro XXX recherche sur l'espace d'adressage 7 bits I2C. Dispositifs trouvés à: 0xB0 0xB1 <–DS1077 responds to write and read address I2c>
The I2C library includes a macro to automatically search the I2C address range for devices. helpful when you work with an unknown chip.
Raw2wire smart card ISO 7813-3 ATR
RAW2WIRE>(1)<–ATR and decode macro ISO 7813-3 ATR 950 AUX LOW 951 AUX HIGH Ticks d'horloge 0xx Swaw2wire 0x01 950 AUX LOW ISO 7813-3 reply: 0xA2 0x13 0x10 0x91<–ATR bytes Protocol: 2 wire <–decoded ATR data Read type: to end<– Data units: 256 <– Data unit length: 8 bits <– Raw2wire>
Macro 1 resets and identifies a smart card. For much more about the ISO7813-3 ATR, see how we used the Bus Pirate to read a smart card.
JTAG
JTAG is a debugging and programming interface for all kinds of electronics. The raw hardware interface can be accessed with the Bus Pirate’s raw 3 wire library, but we added a few features to make it much easier.
JTAG has different modes where data entry does different things. Modes are navigated with the JTAG TMS signal; there are a bunch of JTAG modes, called states.The Bus Pirate’s JTAG library is just the raw 3 wire library, enhanced to help with JTAG state changes.
We only implemented the JTAG states we need to get data in and out of a JTAG device chain: reset, idle, data register, and instruction register. Macro (1) issues a JTAG chain reset, and initializes the chain to the idle state. { puts the JTAG chain in data register mode. [ puts the chain in instruction register mode. ] or } return the chain to the idle state. The Bus Pirate has an internal state device tracker that is smart enough to manage the chain without explicitly returning the chain to idle; in other words, you don’t have to close your tags. The state device tracker reports every state change to help debug problems.
JTAG>[0xfe {rrrr} <– same as [0xfe]{rrrr}
xxx JTAGSM: already IDLE
xxx JTAGSM: IDLE->Instruction Register (DELAYED ONE bit FOR TMS)
610 JTAG ready TO write IR <– JTAG chain instruction register
620 JTAG WRITE: 0xFE <– request ID
xxx JTAGSM: (WROBit retardé) ir-> ralenti au ralenti
XXX JTAGSM: Idle-> Registre des données <-Idle au registre des données
611 JTAG prêt à lire / écrire dr
630 JTAG Lecture: 0x93 Idle <-Back au ralenti
640 jtag ralenti
JTAG>
Voici une interaction courte avec un fichier CPLD XLINX XC9572. Nous allons au registre des instructions ([) et envoyons la commande de demande d’identité de périphérique (0xfe). Ensuite, nous allons le registre des données ({), lisez quatre octets (RRRR ou R: 4 raccourcis) et revenez à Idle (}).
Que sont retardés bit écris?
JTAG exige que le dernier bit de données écrit dans le registre d’instructions soit entré en même temps que le changement d’état. Parce que le pirate de bus n’a aucun moyen de prédire quand nous allons changer d’état, il retardent le dernier bit de chaque octet écrit jusqu’à ce que l’une des trois choses se passe:
Quittez le registre d’instructions avec A},] ou {Commande
Écrire une autre valeur d’octet
Une commande de lecture
Les bits en attente ne sont pas effacés par des opérations binaire (comme! Ou ^). Faites-les avant d’écrire votre dernier octet ou de modifier le code. Nous n’avons pas mis en œuvre en attente d’écriture dans le registre des données, mais il est probablement nécessaire. Vous devrez peut-être exécuter ceci si vous écrivez le registre des données, mais simplement lire, comme nous l’avons fait.
Jtag macros
JTAG> (1) <-maccro 1
XXX JTAGSM: réinitialiser
XXX JTAGSM: réinitialiser-> inactif
JTAG>
JTAG MACRO (1) réinitialise la chaîne JTAG puis l’avance à l’état inactif.
JTAG> (2) <-macro 2
XXX JTAG Chaîne init
XXX JTAGSM: réinitialiser
XXX JTAGSM: réinitialiser-> inactif
XXX JTAGSM: Registre d’instructions Idle-> Enregistrement (retardé un bit pour TMS)
XXX JTAGSM: IR-> Idle
XXX JTAGSM: Idle-> Registre des données
XXX JTAGSM: Dr.> Idle
XXX JTAGSM: réinitialiser
XXX JTAGSM: réinitialiser-> inactif
XXX JTAGSM: Idle-> Registre des données
Signaler XXX JTAG Chain: <-Start du rapport
0x01 dispositif (s)
# 0x01: 0x93 0x40 0x60 0x50 0x59 Idle
JTAG>
Macro (2) réinitialise la chaîne, compte les appareils et signale tous les identifiants de périphérique.
JTAG> (3) <-Maccro 3 6xx joueur JTAG XSVF XXX XON / XOFF Control de flux requis <-Required! XXX Appuyez sur Z pour continuer <- Appuyez sur Z xxx commencer xsvf soumettre <- Soumettez le fichier 6 × 0 xsvf ok <- résultat ou erreur Votre PC a dribillé Max 0x05 octets après XOff (c'est bon) 6xx Appuyez sur Z 5 fois pour continuer <- Continuer JTAG>
Macro 3 est un joueur / programmeur XSVF utilisant le code de Xilinx. XSVF est le format d’octet SVF, comme décrit par Xilinx (PDF). Les fichiers XSVF peuvent être compilés pour n’importe quelle chaîne avec les fichiers de définition de JTAG génériques appropriés, même des périphériques non Xilinx. Nous avons utilisé avec succès les fonctionnalités de transfert binaires dans Hercules et Tera Term pour envoyer des fichiers XSVF au programmeur.
JTAG Dans certains cas, une pause est plus longue qu’il ne prend que le PC pour transférer un octet de données, nous avons donc mis en œuvre le contrôle de flux de logiciel XON / XOFF pour le lecteur XSVF. Votre terminal doit être dans le mode de contrôle de flux XON / XOFF avant de soumettre le fichier XSVF ou le programmateur échouera. Même avec le contrôle de flux logiciel, un PC moderne a déjà envoyé plusieurs octets à travers les couches du système d’exploitation avant de recevoir les signaux de contrôle de flux. Nous traitons de cela en attrapant ces octets avant de continuer, cela est rapporté que le nombre maximum d’octets “dribbled”.
S’il y a une erreur dans le téléchargement, le PC continuera probablement à cracher d’octets au pirate de bus. Pour garder les messages d’erreur visibles et éviter les ordures dans le terminal, le joueur XSVF attend cinq minuscules Z avant de retourner à l’invite. Nous avons choisi cette séquence car elle ne se produira jamais dans un fichier XSVF.
* Notez que le lecteur XSVF ne respecte pas le réglage de la broche JTAG Hi-Z. Est allé ça fait, ça échoue. Soyez prudent des tensions de mélange sans tampon.
Meilleure structure de code
La différence la plus significative entre le micrologiciel Version 0B et 0C est une amélioration massive de la structure de code. Le pirate de bus existait dans de nombreuses incarnations avant de l’avoir emballé pour l’article initial. v.0c harmonise les bibliothèques de code et facilite l’ajout de nouveaux protocoles.
Comment ajouter un protocole personnalisé
Le code Pirate de bus gère l’interface utilisateur et passe deux variables à la bibliothèque de protocoles actifs. La première variable est une commande, telle que cmd_read, cmd_readbulk ou cmd_write. L’ensemble de la commande est défini dans la base.H. La deuxième variable est une valeur facultative. Une commande EASY CMD_READ n’acte aucune valeur, une commande de lecture en vrac transmet le nombre d’octets à lire, une commande d’écriture passe la valeur à écrire dans le bus, etc. Au minimum, un protocole personnalisé a besoin d’une fonction pour recevoir ces variables et les traduire aux actions de bus.
Nous avons utilisé trois techniques différentes pour relier les commandes des actions de bus. Le code facile peut aller directement dans une énorme instruction de commutation, comme SPI.C. Les bibliothèques externes utilisent une seule fonction de liaison, comme I2C.C et M_I2C_1.C. Des protocoles beaucoup plus compliqués utilisent l’instruction de commutation pour appeler les fonctions incluses dans la bibliothèque (Raw2Wire.c, Raw3Wire.c, jtag.c uart.c). Les fonctions utiles pour les terminaux IO sont incluses dans la base.h / c.
En raison des améliorations massives de code, il n’est maintenant que légèrement déroutant d’enregistrer un nouveau protocole avec le pirate de bus:
base.h – créer un définition pour le protocole. La dernière entrée est actuellement “#define Raw3wire 7”, la prochaine entrée pourrait être “#define myCustomwire 8”.
Buspirate.c – Inclure un fichier d’en-tête avec celui qui donne accès à la fonction de traitement. Ajouter une entrée de menu dans la liste Char * [] = liste de variable. La saisie du menu doit être dans la même position sur la liste comme numéro attribué dans la base.h Définir. Si MyCustomwire est le numéro 8, il devrait s’agir de huit heures de variable en mode. Enfin, ajoutez un commutateur supplémentaire à la fonction BPProcess () qui appelle la routine de traitement de la bibliothèque personnalisée lorsque le mode est défini sur “MyCustomwire”.
Prendre plus loin: une liste de souhaits pirater une journée
Nous avons compilé les commentaires que nous avons obtenus dans trois listes de souhaits: protocoles, caractéristiques et macros.
Protocoles
1 fil, avec dénombrement (* prêt dès que nous avons des pièces à tester)
OBD-II (merci [Shadyman])
POUVEZ
MIDI (Wikipedia)
Dmx512-a
IRDA, RC5X, etc.
Certains protocoles nécessiteront un émetteur-récepteur externe.
Caractéristiques
Modulateur de largeur d’impulsion, générateur de fréquence
“Attendre la commande interrompre”
Convertir la mesure de la fréquence au périphérique de capture d’entrée
Autoriser la mesure de fréquence sur n’importe quel code PIN
Afficher un rapport sur les paramètres de configuration actuels et les états PIN.
Valeurs répétées entier pour la lecture en vrac, les tiques d’horloge, les retards, etc.
Un générateur de CRC
Macros
Pont transparent de UART
Initialisation de la carte SD, extrait de méta-donnage et vidage
Programme EEPROM / Dump (I2C / SPI)
Initialisation Nokia 6100 LCD, contrôle
Décodeur de données GPS NMEA GPS
Avez-vous quelque chose à ajouter à la liste?
Télécharger le firmware: buspirate.v0c.zip