lamaPLC Communication: I²C

I²C (Inter-Integrated Circuit; pronounced as “eye-squared-C”), alternatively known as I2C, I²C or IIC, is a synchronous, multi-master/multi-slave (controller/target), packet switched, single-ended, serial communication bus invented in 1982 by Philips Semiconductors.

I²C is a common digital communication standard used in various products. The protocol uses a two-wire communication interface, allowing multiple controllers and target peripheral devices. This application note describes many important protocol aspects as a guide to using I²C to communicate with controller devices.

This application note discusses the protocol and the physical layer for I²C communications. Because I²C is often used with data converter devices, examples of communications were provided for a DAC and an ADC to write and read from registers.

Several competitors, such as Siemens, NEC, Texas Instruments, STMicroelectronics, Motorola, Nordic Semiconductor, and Intersil, have introduced compatible I²C products to the market since the mid-1990s.

Protocols Similar to I²C

The I²C specification discusses several other communications protocols based on I²C. These other protocols can be similar and compatible with I²C communication and can be used for specific applications. Some protocols also have defined commands and application-specific extensions for their systems. This section briefly describes the applications for these other protocols, but their systems, applications, and uses are found in elsewhere.

The first of these similar protocols is the Two-Wire Interface, or TWI, which is the same as I²C.

However, there are some minor differences. TWI does not support a START byte and does not support high-speed modes. Generally, TWI-compatible devices are expected to be compatible with I²C, and the protocol can be seen with the same logic analyzers.

The System Management Bus, or SMBus®, is a protocol similar to I²C that is tailored to a specific function. It is commonly used in servers and computer motherboards for power source management. The protocol is very similar to I²C in the communication protocol and can be understood by an I²C controller.

The SMBus protocol has some additional features in comparison to I²C. The SMBus can dynamically set addresses, allowing for quick communications at the start-up of a system. Also, the bus has a 35-ms timeout, which prevents one device from indefinitely tying up the bus. The protocol also has a packet error checking for error detection in data communication. There is an additional line called SMBAlert that is used by target devices as an interrupt to tell the controller about certain events detected by the target device.

The Power Management bus, or PMBus®, is a variant of SMBus defined by Intel. It is used in the digital management of power supplies. This protocol also defines specific commands to retrieve data about the system's voltage, current, and power.

Intelligent Platform Management Interface IPMI is another I²C-based protocol. This protocol is used by baseboard management controllers (BMCs) for autonomous computer subsystems to monitor and manage the system CPU, firmware, and operating system. The protocol uses a standardized message-based interface for a computer motherboard or server. The BMC is always running even when the central system is off, allowing for operation, measurement, and remote management of a system.

There are several other similar protocols discussed in the I²C specifications. Advanced Telecommunications Computing Architecture (ATCA) is a follow-on to Compact PCI used in rack-mounted telecom hardware.

Display Data Channel (DDC) is a monitor or display information protocol that hosts use to control display functions. Finally, C-Bus is another protocol derived from I²C. As mentioned in the reserved address section, this protocol is used in some parts of the world for home and building automation.

I²C is similar in concept to 1-Wire.

I²C specifications

  • In the most common case, the I²C bus contains only one master, but the possibility of a multimaster is also not excluded
  • I²C uses an open-ended pair of wires for data transfer: the serial data line (SDA) and the serial clock signal (SCL). The two wires must be pulled to the operating voltage with resistors. The wires typically operate with a voltage of 5V or 3.3V, but a different voltage specification is also not excluded.

I²C specifications

  • Pull-up resistors are almost always 4.7k
  • In principle, the maximum distance of the bus is 7.6 m, but it is typically used within 2-3 m.
  • The bus typically uses 7- or 10-bit addressing, but sometimes the 16-bit solution also occurs. Typical transmission speeds:
ModeSpeed
Low speed mode10 kbit / sec
standard mode100 kbit / sec
fast mode (FM) 400 kbit / sec
fast mode plus (FM+) 1 Mbit / sec
high-speed mode (HS) 1.7 .. 3.4 Mbit / sec
Ultra-fast mode (UFm) 5 Mbit / sec

Open-Drain Connection

The open-drain connections are used on both SDA and SCL lines and connect to an NMOS transistor. This open-drain connection controls the I2C communication line and pulls the line low or releases the line high. The open-drain refers to the NMOS bus connection when the NMOS is turned OFF. The next pic shows the open-drain connection as the NMOS is turned on:

Open-Drain Connection Pulls Line Low When NMOS is Turned On

The NMOS is set on or off to set the voltage level of the SDA or SCL line. When the NMOS is on, the device pulls current through the resistor to ground, pulling the open-drain line low. Typically, the transition from high to low for I²C is as fast as the NMOS pulls down on SDA or SCL. The NMOS drive strength and any bus capacitance on SDA or SCL determine the transition speed.

When the NMOS turns off, the device stops pulling current, and the pull-up resistor pulls the SDA or SCL line to VDD. The next picture shows an open-drain line as the NMOS is turned off. The pull-up resistor pulls the line high. The transition of the open-drain line is slower because the line is pulled up against the bus capacitance and is not actively driven.

Pullup Resistor Pulls Line High When NMOS is Turned Off

I²C addresses

Different manufacturers' applications and addresses with different lengths (7, 8, or 10 bits) significantly limit the usable address range, which is practically 0x08 .. 0x77.

I²C Arduino

The I²C protocol uses two lines to send and receive data: a serial clock pin (SCL) that the Arduino Controller board pulses regularly, and a serial data pin (SDA) over which data is sent between the two devices.

In I²C, one controller device has one or more peripheral devices connected to the controller's SCL and SDA lines.

As the clock line changes from low to high (known as the rising edge of the clock pulse), a single bit of information is transferred from the board to the I²C device over the SDA line. As the clock line keeps pulsing, more and more bits are sent until a sequence of a 7 or 8-bit address, and a command or data is formed. When this information is sent - bit after bit -, the called upon device executes the request and transmits its data back - if required - to the board over the same line using the clock signal still generated by the Controller on SCL as timing.

I²C Arduino

Each device in the I²C bus is functionally independent from the controller, but will respond with information when prompted by the controller.

Because the I²C protocol allows for each enabled device to have it's own unique address, and as both controller and peripheral devices to take turns communicating over a single line, it is possible for your Arduino board to communicate (in turn) with many devices, or other boards, while using just two pins of your microcontroller.

  • The controller sends out instructions through the I2C bus on the data pin (SDA), and the instructions are prefaced with the address, so that only the correct device listens.
  • Then there is a bit signifying whether the controller wants to read or write.
  • Every message needs to be acknowledged to combat unexpected results. Once the receiver has acknowledged the previous information, it lets the controller know so it can move on to the next set of bits.
  • 8 bits of data
  • Another acknowledgement bit
  • 8 bits of data
  • Another acknowledgement bit

More from Arduino I²C protocol

Arduino applications with I²C communication

I²C Arduino with 3.3V

The I²C communication basically works with 5V, but in certain cases, for example, if there is a 3.3V base voltage unit (ESP32) in the network, then 3.3V is also sufficient for the 5V units. The voltage level can be stabilized with 4.7 kOhm pull-up resistors (SDO, SCL):

I²C Arduino with 3.3V

According to the analysis of Texas Instruments, the above solution does not work, because the HI voltage level does not match between 5V and 3.3V, since in the case of 5V, 3.5V is the high-level-pegel, see here.

PCA3906 I²C Voltage Level Translator

They recommend using the PCA9306 IC for this case.

Sources

I²C topics on lamaPLC