I2C Commander (I2CC)¶
Consider a case where you need to interface with some embedded relatively low-level device. For example, an environmental sensor, an accelerometer, a PWM generator that controls LEDs or something else. More often than not you will be interacting with such devices using I2C protocol. This is a very low-level two-wire protocol that can connect multiple devices on the same bus.

Two wires that define the I2C bus are the serial clock line (SCL) and serial data line (SDL). Any given device connected on the bus is either a master or a slave. Master is the only device that initiates communication to a slave, and it is the one that drives the clock line. Note that while, in general, multiple masters on the same bus are possible, not every master supports logic for negotiating between masters. Slave devices are passive. They watch clock and data lines and respond when requested by the master. The I2C protocol defines only slave device addressing and commands when a master writes something to a slave or reads from one. Based on this low-level communication protocol, devices define the next higher-level abstraction. Typically, abstraction of registers with their addresses and values and commands on the I2C bus to read and write such registers. Above that, in the vendor specification datasheets, you find the next level of abstraction related to even higher-level concepts, such as the internal state of the device, how to control data acquisition, perform calibration, and so on.

I2C Commander is a GUI application that allows you to address all three levels of abstraction when interfacing with I2C devices. To that end it controls generic I2C master device that can send and receive arbitrary commands on the bus. At the moment it uses I²CDriver dongle that on one end connects to the host computer over USB and on the other end has pins to connect it to the I2C bus.