I2C stands for Inter-Integrated Circuit. I2C is sometimes also referred as TWI, which is short for Two Wire Interface, since it uses only 2 wires for data transmission and synchronization. SDA is the wire on which the actual data transfer happens, which is bi-directional, between different masters and slaves.
SCL is the wire on which the Master device generates a clock for slave device s. I2C supports 7 bit and 10 bit addresses for each device connected to the bus. With 7 bit address its possible to connect up to I2C devices to the same bus, however, some addresses are reserved so practically only devices can be connected at the same time. With 10 bit address a maximum of devices can be connected.
To keep things simple we will be going through 7 bit addressing in this tutorial. For 10 bit addressing you can look up the official I2C specification by NXP, a link to which is given at the bottom of this tutorial. Once you get familiar with the I2C protocol, 10 bit addressing will be a piece of cake. But along the years the specifications was updated many times and now we have a bunch of different speed modes.OLED and Arduino: SPI v.s. I2C (ssd1306)
Even though multiple masters may be present on the I2C bus the arbitration is handled in such a way that there is no corruption of data on bus in case when more than 2 masters try to transmit data at the same time. Since the transmission, synchronization and arbitration is done using only 2 wires on the bus, the communication protocol might be a bit uneasy to understand for beginners. Let us go through I2C protocol basics first. I2C bus is a Byte Oriented bus.
Only a Byte can be transferred at a time. As soon as the START condition is transmitted on the bus, the first byte or the control byte is transmitted.
Image Source: I2C Specification. A Repeat Start condition is similar to a Start condition, except it is sent in place of Stop when the master does not want to loose the control over the bus and wants to complete its transfers in atomic manner when multiple masters are present.
When a master wants to switch to Master Receiver Mode from Master Transmitter mode or vice-versa it sends a Repeated start at the end of the current transfer so it remains master when next transfer starts. In many cases but not all! Like for example interfacing 5V I2C Slave device with a 3. In the mentioned examples it would be 3.
Consider the following image showing basic open-drain driver for I2C:. Here the buffer is used to Receive input data and Mosfet is used to Transmit output data. When the Mosfet is activated it will sink the current from pull-ups resistors which forces the pin to a Logic Low.
Note that it cannot drive the line to HIGH by itself which is obvious. For beginners it better to following the rule of thumb: You need lower resistor values as the speed increases and Vice-versa. Clock Stretching is a mechanism for slave devices to make the master wait until data is ready or slave device has to finish some internal operations like: ADC conversion, Initial internal Write cycle, etc. In practice, many Slave devices do not support clock stretching. Consider 24c16, at24c32, 24lc, etc.In embedded systems, a simple function rarely exists alone.
A simple pushbutton and LEDs controller is useful but if that controller cannot report when a user has pressed a button or share the status its LED indicate, the controllers are not worth their value. Many embedded systems include peripheral devices connected to the microprocessor in order to expand its capabilities. Data transmission between two these entities plays a major role in designing embedded systems.
In general, the medium of data transmission can be either serial or parallel.
High Speed Mode
All these peripheral devices interface with the microcontroller via a serial protocol. Protocol is a language that defines the mode of communication between systems and devices like protocols specify the aspects of inter-device communications including bit ordering, bit pattern meanings, electrical and mechanical aspect.
The key to increase the value is communication on a communication bus of choice for embedded systems of all sizes. Philips Semiconductors presently, NXP Semiconductors has developed a two-wire bus protocol for inter-integrated circuit systems incommonly known as I2C protocol.
We, especially electronics design engineers have worked with this protocol in most of ourprojects. A discussion about understanding the I2C protocol would involve a look into the following:. The above discussion would need the readers to have a basic understanding about:.
The inter-integrated circuit or I2C Protocol is a way of serial communication between different devices to exchange their data with each other. It is a half-duplex bi-directional two-wire bus system for transmitting and receiving data between masters M and slaves S. Masters and Slaves play important role in I2C communication. Master is the one which initiates a communication, generates a clock and terminates the communication and Slave is the one which is handled by master and acts according to the master command.
It can also be possible that multiple masters can communicate with multiple slaves.
Understanding the I2C Protocol
As we know, the bus consists of SCL and SDA line, SCL serial clock line is responsible for synchronizing the communication and is controlled by Master the slave can also control the clock line, we will discuss about this topic later and SDA serial data line is responsible for providing the data bi-directionally and can be used by master or slave or both.
We normally work with standard and fast mode for communication. A brief about them is as follows:.
The first chip on UART was designed in around It requires a minimum of two pins transmitter and receiver pin and a common ground line for data communication. The UART chip is generally found inbuilt in most of the microcontrollers. As only two devices can communicate with each other over a UART bus, it is not well suited for multiple devices communication. The highest data rate UART can support is kbps— kbps which was still a low speed as per the requirements.
It has only three lines i. It is a full duplex serial data communication process. SPI can be used for multiple device communication. SPI is a single-master multi-slave protocol, it cannot support multiple masters communicating with multiple slaves. Because of the drawbacks of UART and SPI, there was need of a protocol which can decrease the number of wires required for communication, have flexible data rates along with multiple master and multiple slave communication.
This broughtI2Cto the picture which have all the desired features of a multi-bus communication.There are applications where the I2C transfer speed is a limiting factor.
To allow for higher transmission rates while retaining a certain amount of compatibility Philips has introduced the HS I2C standard. Here are some details and particularities:. Clock stretching during this mode has a special rule: It is only allowed after the ACK bit and before the 1st bit of the next byte.
Stretching between bits is illegal because the edges of these bits are boosted with an additional current source. See I2C specification rev. Tracii XL 2. Electrical Characteristics The high-speed variant of the I2C bus allows communication up to 3. Both, master and slave device must be highspeed-enabled in order to benefit from this increase.
High-speed IC devices are downward compatible allowing for mixed bus systems. In order to shorten signal rise time HS mode master devices have a combination of an open-drain pull-down and current-source pull-up circuit on the SCL output. HS IC masters can actually source current to the bus which is referred to as boosting. This current source is enabled only!
HS mode master devices can have a built-in bridge to separate lower speed devices from the bus during HS transfer. The main purpose of such bridge is to reduce the capacitive load on the bus and to avoid conflicts caused by low speed devices. Transmission Format A high-speed transmission starts up in full-speed mode, i. Clock Stretching Clock stretching during this mode has a special rule: It is only allowed after the ACK bit and before the 1st bit of the next byte.In a synchronous serial transmission like an RS communication the clock speed is predetermined.
Any deviation is almost fatal as it may cause errors sooner or later. While there is technology available to keep such communication in sync even if the so called baud rate slightly drifts the overall approach is to keep that rate constant and accurate. This has the advantage of predictable transfer timing but it adds the obvious requirement of keeping that constant rate. This is why baud rate calculators are found all over the internet.
On synchronous transmissions like the I2C bus the situation is much more relaxed. The clock is transmitted by the sender and the receiver is always able to synchronize with that clock.
I2C defines several speed grades but the term baud rate is quite unusual in this context. Compliant hardware guaranties that it can handle transmission speed up to the maximum clock rate specified by the mode. This does not imply that a transmission may not take place at any lower speed or even at a somewhat variable bit rate. In fact, a bus master does not even have full control over the actual timing. The reason for this is simple.
The I2C bus uses open drain technology. The bus is kept on a high level and writing to the bus means to pull its level to ground. Depending on bus termination, serial resistors, capacitance, cable length, bus voltage and other factors this process of pulling down the level and releasing it takes some time.
It is therefore good practice for any device to read back the logic level of a modified line both clock and data before proceeding with further actions. A master will write a zero on the bus by first enabling the circuit to pull the bus low, then read back the state of the line and then proceed with the next step. As a consequence a master set to clock at kHz will most likely produce a lower speed on the bus.
As the impact of electrical latency increases with higher clock rates this effect shows more with higher speeds. The I2C bus is intended for inter-IC communication and this usually means small data packets. Since the timing can never be determined exactly and the transmitted information is often short the accuracy of the bus clock is of very little relevance in most applications.
To be on the safe side it is — in case of doubt — a much better idea to keep the maximum bit rate below the maximum rating at any time rather than exceeding it occasionally.Become a subscriber Free Join 29, other subscribers to receive subscriber sale discounts and other free resources. Name : E-Mail : Don't worry -- youre-mail address is totally secure. I promise to use it only to send you MicroZine.
It gives you a fully defined protocol for data transfer between multiple devices over two wires. In this I2C tutorial you will learn all about the 2 wire I2C serial protocol; How easy it is to use, how it works and when to use it. The protocol allows you to connect many devices to a single set of two wires, and then communicate individually with each device. This I2C tutorial shows you how the I2C protocol works at the physical bit level discussing single master mode a single controlling device which is the most common use for I2C in a small system.
Note: Some manufacturers avoid paying royalties, or avoid patent problems, by calling it a 2 wire protocol but it's the same I2C protocol when you examine the timing diagrams.
I2C is a serial protocol that can operate at different speeds kHz, kHz, and 3. Not all chips support all speeds but kHz is commonly supported. Speed is important as the data is transmitted serially, so a faster clock allows a quicker update. The great strength of the protocol is that it only requires two wires, yet can have many connected devices and all of these can transmit and receive data at high speed.
This saves a ton of pcb wiring. Unlike the SPI protocolthe I2C protocol has an acknowledgement feature that means a sending device knows that a receiver has accepted the data. So I2C is more robust in a noisy environment.
Using I2C it is also possible to have multiple master devices making the system more flexible. I2C works by using open drain connections.
The top connection is the Drain, the middle connection is the Gate controller and the Lower connection is the Source. The open drain system simply means that multiple MOSFETS can be connected together at the Drain terminal which is then connected to a pull-up resistor. For I2C you need two open drain connections clock and data. When all devices are inactive then the "pull-ups" pull the signal wire to the supply voltage. At any time a master device can start a transaction by pulling SDA low while SCL is high a unique specific condition that other I2C devices recognise as the start of a master transmission.
The slave device listens to the next 7 serial bits of the address to see if it matches its own address each I2C must have a unique address. At the time that the ACK signal is to be generated the master device releases the SDA line and the open drain output is pulled high. This allows the slave device to generate the ACK signal by pulling it low only for that specific bit period. The master device monitors the I2C bus for this signal from the slave. This indicates that it understood the address.
The diagram further down shows this in graphical form. The Phillips I2C protocol defines the concept of master and slave devices. Slaves simply listen to the bus and act on controls and data that they are sent. The master can send data to a slave or receive data from a slave - slaves do not transfer data between themselves. Multi master operation is a more complex use of I2C that lets you have different controlling devices on the same bus. You only need to use this mode if you have more than one microcontroller on the bus and you want either of them to be the bus master.
Multi master operation involves arbitration of the bus where a master has to fight to get control of the bus and clock synchronisation each may a use a different clock e. Note: Multi master is not covered in this I2C tutorial as the more common use of I2C is to use a single bus master to control peripheral devices e. The I2C interface uses two bi-directional lines meaning that any device could drive either line. In a single master system the master device drives the clock most of the time - the master is in charge of the clock but slaves can influence it to slow it down See Slow Peripherals below.
So you can not do something clever such as keeping the clock line inactive and use the data line as a button press detector to save pins.
You will often will find devices that you realise are I2C compatible but they are labelled as using a '2 wire interface'. The manufacturer is avoiding paying royalties by not using the words 'I2C'!It was invented by Philips and now it is used by almost all major IC manufacturers.
I2C bus is popular because it is simple to use, there can be more than one master, only upper bus speed is defined and only two wires with pull-up resistors are needed to connect almost unlimited number of I2C devices. Each slave device has a unique address. Transfer from and to master device is serial and it is split into 8-bit packets.
All these simple requirements make it very simple to implement I2C interface even with cheap microcontrollers that have no special I2C hardware controller. The initial I2C specifications defined maximum clock frequency of kHz. This was later increased to kHz as Fast mode. There is also a High speed mode which can go up to 3. There are also I2C level shifters which can be used to connect to two I2C buses with different voltages.
Basic I2C communication is using transfers of 8 bits or bytes. Each I2C slave device has a 7-bit address that needs to be unique on the bus. Some devices have fixed I2C address while others have few address lines which determine lower bits of the I2C address. This makes it very easy to have all I2C devices on the bus with unique I2C address.
There are also devices which have bit address as allowed by the specification. If bit 0 in the address byte is set to 1 then the master device will read from the slave I2C device.
Master device needs no address since it generates the clock via SCL and addresses individual I2C slave devices. The communication is initiated by the master device. It generates the Start condition S followed by the address of the slave device B1.
If the bit 0 of the address byte was set to 0 the master device will write to the slave device B2. Otherwise, the next byte will be read from the slave device. Once all bytes are read or written Bn the master device generates Stop condition P. This signals to other devices on the bus that the communication has ended and another device may use the bus. Most I2C devices support repeated start condition. This means that before the communication ends with a stop condition, master device can repeat start condition with address byte and change the mode from writing to reading.Figure 1.
I2C modes and their data rates. In this article, let us discuss I2C modes. There are several possible operating modes for I2C communication. Standard mode: The first one is standard mode, and its data rate is up to Kbps, and almost all STM32 microcontrollers support this mode.
The standard mode was the very first mode introduced when the first I2C specification was released. So, standard mode devices are not upward compatible, and they cannot communicate with the devices of fast mode and above. For example, if the sensor supports only in standard mode and then it cannot communicate with the master, which promotes fast mode. Fast mode: Fast mode is highly compatible and supports data rate up to Kbps, and almost all STM32F4x microcontrollers support this mode.
I2C slave devices widely support fast mode, so a master may use it as long as it knows that the bus capacitance and pull-up strength allow it.
Fast mode devices are downward compatible and can communicate with the standard mode devices in a 0 to Kbps I2C bus system. Some of the STM32F4x microcontrollers support this mode. High-speed mode: The last mode is high-speed mode, and here, the data rate is up to 3.
High-speed mode is compatible with standard I2C devices on the same bus but requires the master has an active pull-up on the clock line is enabled during high-speed transfers.
The STM32F4x family does not support this mode. So, configuring of I2C modes is very important when writing the drivers. Previous Next. I2C Mode. Related Posts. Recent Posts. Recent Comments.