I2C (binary)

From DP

Jump to: navigation, search

binic2

The Bus Pirate's new binary modes provide a consistent, logical way to script actions from Python, Perl, etc. We already introduced the new binary bitbang and SPI modes, today we'll document the binary I2C mode. Binary I2C is in firmware v2.6+.

We want your scripts! If you script something for any of the new modes, in any language, we'd like to host it in the example scripts folder.

Contents

[edit] Overview

Enter binary I2C mode by first entering bitbang mode, then send 0x02 to enter I2C mode.

Most I2C mode commands are a single byte. Commands generally return 1 for success, 0 for failure.

[edit] Commands

[edit] 00000000 - Exit to bitbang mode, responds "BBIOx"

This command resets the Bus Pirate into raw bitbang mode from the user terminal. It also resets to raw bitbang mode from raw I2C mode, or any other protocol mode. This command always returns a five byte bitbang version string "BBIOx", where x is the current bitbang protocol version (currently 1).

[edit] 00000001 – Display mode version string, responds "I2Cx"

Once in binary I2C mode, send 0×01 to get the current mode version string. The Bus Pirate responds ‘I2Cx’, where x is the raw I2C protocol version (currently 1). Get the version string at any time by sending 0×01 again. This command is the same in all binary modes, the current mode can always be determined by sending 0x01.

[edit] 00000010 – I2C start bit

Send an I2C start bit. Responds 0x01.

[edit] 00000011 – I2C stop bit

Send an I2C stop bit. Responds 0x01.

[edit] 00000100 - I2C read byte

Reads a byte from the I2C bus, returns the byte. You must ACK or NACK each byte manually!

[edit] 00000110 - ACK bit

Send an I2C ACK bit after reading a byte. Tells a slave device that you will read another byte. Responds 0x01.

[edit] 00000111 - NACK bit

Send an I2C NACK bit after reading a byte. Tells a slave device that you will stop reading, next bit should be an I2C stop bit. Responds oxo1.

[edit] 00001111 - Start bus sniffer

Sniff traffic on an I2C bus.

  • [/] - Start/stop bit
  • \ - escape character precedes a data byte value
  • +/- - ACK/NACK

Sniffed traffic is encoded according to the table above. Data bytes are escaped with the '\' character. Send a single byte to exit, Bus Pirate responds 0x01 on exit.

[edit] 0001xxxx – Bulk I2C write, send 1-16 bytes (0=1byte!)

Bulk I2C allows multi-byte writes. The Bus Pirate expects xxxx+1 data bytes. Up to 16 data bytes can be sent at once. Note that 0000 indicates 1 byte because there’s no reason to send 0.

BP replies 0×01 to the bulk I2C command. After each data byte the Bus Pirate returns the ACK (0x00) or NACK (0x01) bit from the slave device.

[edit] 0100wxyz – Configure peripherals w=power, x=pullups, y=AUX, z=CS

Enable (1) and disable (0) Bus Pirate peripherals and pins. Bit w enables the power supplies, bit x toggles the on-board pull-up resistors, y sets the state of the auxiliary pin, and z sets the chip select pin. Features not present in a specific hardware version are ignored. Bus Pirate responds 0×01 on success.

Note: CS pin always follows the current HiZ pin configuration. AUX is always a normal pin output (0=GND, 1=3.3volts).

Due to a typo this was previously command 0110.

0110000x - Set I2C speed, 1=high (50kHz) 0=low (5kHz)

011000xx - Set I2C speed, 3=~400kHz, 2=~100kHz, 1=~50kHz, 0=~5kHz (updated in v4.2 firmware)

The last bit of the speed command determines the I2C bus speed. Binary mode currently uses the software I2C library, though it may be configurable in a future update. Startup default is high-speed. Bus Pirate responds 0×01 on success.

Personal tools
projects