Understanding The Differences And Applications Of SPI, UART, I2C Communication

Click the blue "One口Linux" in the top left corner and select "Set as Favorite"
Read the latest articles first
【Resource】Learning Path for Embedded Driver Engineers
【Resource】A Comprehensive IoT Project Based on Linux Suitable for Your Resume
【Resource】Linux Embedded Knowledge Mind Map – Free Download
【Thanks】My new book “Learning ARM from Scratch” is officially online
Understanding The Differences And Applications Of SPI, UART, I2C Communication
1

Communication between electronic devices is like communication between humans; both parties need to speak the same language. In electronic products, these languages are called communication protocols.

I previously shared separate articles on SPI, UART, and I2C communication; this article provides a comparison of them.

Serial vs Parallel

Electronic devices communicate by sending data bits back and forth. Bits are binary and can only be 1 or 0. Through rapid changes in voltage, bits are transmitted from one device to another. In systems operating at 5V, “0” is communicated through a short pulse at 0V, while “1” is communicated through a short pulse at 5V.

Data bits can be transmitted in parallel or serially. In parallel communication, data bits are transmitted simultaneously on multiple lines. The image below shows the parallel transmission of the letter “C” in binary (01000011):

Understanding The Differences And Applications Of SPI, UART, I2C Communication

In serial communication, bits are sent one by one over a single line. The image below shows the serial transmission of the letter “C” in binary (01000011):

Understanding The Differences And Applications Of SPI, UART, I2C Communication

SPI Communication

SPI is a common device communication protocol. Its unique advantage is that it allows for uninterrupted data transmission, enabling continuous sending or receiving of any number of bits. In contrast, I2C and UART send data in packets with a fixed number of bits.

In SPI devices, the devices are divided intomaster and slave systems. The master is the controlling device (usually a microcontroller), while the slave (usually a sensor, display, or storage chip) receives commands from the master.

A complete SPI communication setup includes four signal lines:MOSI (Master Output/Slave Input) – signal line where the master outputs and the slave inputs. MISO (Master Input/Slave Output) – signal line where the master inputs and the slave outputs. SCLK (Clock) – clock signal. SS/CS (Slave Select/Chip Select) – chip select signal.

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Characteristics of SPI Protocol

In practice, the number of slaves is limited by the load capacitance of the system, which can reduce the master’s ability to switch accurately between voltage levels.

Working Principle

Clock Signal

Each clock cycle transmits one bit of data, thus the speed of data transmission depends on the frequency of the clock signal. The clock signal is generated by the master, meaning SPI communication is always initiated by the master.

Any communication protocol that shares a clock signal is termed synchronous. SPI is a synchronous communication protocol, while some asynchronous communications do not use a clock signal. For example, in UART communication, both parties operate at a pre-configured baud rate, which determines the speed and timing of data transmission.

Chip Select Signal

The master enables communication by pulling the slave’s CS/SS low. In idle/non-transmission states, the chip select line remains high. There can be multiple CS/SS pins on the master, allowing it to communicate with multiple different slaves.

Understanding The Differences And Applications Of SPI, UART, I2C Communication

If the master has only one chip select pin available, the slaves can be connected as follows:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

MOSI and MISO

The master sends data to the slave serially via MOSI, and the slave can also send data back to the master via MISO, allowing both to occur simultaneously. Thus, theoretically, SPI is a full-duplex communication protocol.

Transmission Steps

1. The master outputs the clock signal

Understanding The Differences And Applications Of SPI, UART, I2C Communication

2. The master pulls the SS/CS pin low to activate the slave

Understanding The Differences And Applications Of SPI, UART, I2C Communication

3. The master sends data to the slave via MOSI

Understanding The Differences And Applications Of SPI, UART, I2C Communication

4. If a response is needed, the slave returns data to the master via MISO

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Using SPI has its pros and cons, and when choosing between different communication protocols, one should consider the project requirements thoroughly.

Advantages and Disadvantages

Advantages

SPI communication has no start or stop bits, allowing data to flow continuously without interruption; it does not have a complex slave addressing system like I2C, and its data transmission rate is higher than I2C (almost twice as fast). With separate MISO and MOSI lines, data can be sent and received simultaneously.

Disadvantages

SPI uses four lines (I2C and UART use two lines), does not have a confirmation of successful signal receipt (I2C has this feature), and lacks any form of error checking (like parity bits in UART).

Understanding The Differences And Applications Of SPI, UART, I2C Communication

UART stands for Universal Asynchronous Receiver/Transmitter, also known as serial communication. Unlike communication protocols like SPI and I2C, it is a physical circuit or independent IC within the microcontroller. The main purpose of UART is to send and receive serial data, and its best advantage is that it only uses two wires to transmit data between devices. The principle of UART is easy to understand, but if you haven’t read about the SPI communication protocol, that might be a good starting point.

UART Communication

In UART communication, two UARTs communicate directly with each other. The sending UART converts the parallel data from the controlling device (like a CPU) into serial form and sends it to the receiving UART. Only two wires are needed to transmit data between the two UARTs, with data flowing from the Tx pin of the sending UART to the Rx pin of the receiving UART:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

UART is an asynchronous communication, which means there is no clock signal; instead, start and stop bits are added to the data packets. These bits define the beginning and end of the data packet, allowing the receiving UART to know when to read the data.

When the receiving UART detects the start bit, it reads the bits in the data frame at a specific baud rate. The baud rate is a measure of the speed of data transmission, expressed in bits per second (bps). Both UARTs must operate at approximately the same baud rate, with a difference of no more than about 10%.

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Working Principle

The sending UART, after obtaining the parallel data from the data bus, adds a start bit, a parity bit, and a stop bit to form a data packet, which is then serially output bit by bit from the Tx pin, while the receiving UART reads the data packet bit by bit on its Rx pin.

Understanding The Differences And Applications Of SPI, UART, I2C Communication

UART data contains 1 start bit, 5 to 9 data bits (depending on the UART), an optional parity bit, and 1 or 2 stop bits:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Start Bit:

The UART data transmission line usually remains at a high voltage level when not transmitting data. When transmission begins, the sending UART pulls the transmission line down from high to low within one clock cycle. When the receiving UART detects the transition from high voltage to low voltage, it begins reading the bits in the data frame at the baud rate.

Data Frame:

The data frame contains the actual data being transmitted. If a parity bit is used, it can be 5 bits, up to 8 bits. If no parity bit is used, the length of the data frame can be 9 bits.

Parity Bit:

The parity bit is a way for the receiving UART to determine whether any data changes occurred during transmission. After the receiving UART reads the data frame, it counts the number of bits that are 1 and checks whether the total is even or odd, comparing it with the data.

Stop Bit:

To signal the end of the data packet, the sending UART drives the data transmission line from low voltage to high voltage for at least two bit times.

Transmission Steps

  1. The sending UART receives data in parallel from the data bus:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

2. The sending UART adds the start bit, parity bit, and stop bit to the data frame:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

3. The entire data packet is serially sent from the sending UART to the receiving UART. The receiving UART samples the data line at the pre-configured baud rate:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

4. The receiving UART discards the start bit, parity bit, and stop bit from the data frame:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

5. The receiving UART converts the serial data back into parallel data and transmits it to the data bus of the receiving end:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Advantages and Disadvantages

No communication protocol is perfect, but UART excels at its job. Here are some pros and cons to help you determine whether they fit your project needs:

Advantages

  • Only two wires are used

  • No clock signal is required

  • Has a parity bit for error checking

  • As long as both sides set up the packet structure

  • A well-documented and widely used method

Disadvantages

  • The maximum size of the data frame is 9 bits

  • Does not support multiple slave or master systems

  • The baud rate of each UART must be within 10% of each other

I2C Communication

The I2C bus is a simple, bidirectional two-wire synchronous serial bus developed by Philips. It requires only two wires to transmit information. It combines the advantages of SPI and UART, allowing multiple slaves to connect to a single master (like SPI), and multiple masters to control one or more slaves. This is very useful when you want multiple microcontrollers to log data to a single storage card or display text on a single LCD.

Understanding The Differences And Applications Of SPI, UART, I2C Communication

SDA (Serial Data) – Data line.

SCL (Serial Clock) – Clock line.

I2C is a serial communication protocol, so data is transmitted bit by bit along the SDA line. Like SPI, I2C also requires a clock synchronization signal, which is always controlled by the master.

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Working Principle

I2C data transmission occurs in the form of multiple messages, each containing the binary address frame of the slave, one or more data frames, as well as start and stop conditions, read/write bits, and ACK/NACK bits between data frames:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Start Condition: When SCL is high, SDA switches from high to low.

Stop Condition: When SCL is high, SDA switches from low to high.

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Address Frame: A unique 7-bit or 10-bit sequence for each slave device used for addressing identification between master and slave devices.

Read/Write Bit: A bit that indicates whether the master is sending data to the slave (low) or requesting data (high).

ACK/NACK: Each frame in the message carries an ACK/NACK bit. If the address frame or data frame is successfully received, the receiving device will return an ACK bit to confirm.

Addressing

Since I2C does not have a chip select line like SPI, it needs another method to confirm a specific slave device, which is addressing.

The master sends the address of the slave to be communicated with to each slave, and each slave compares it with its own address. If the address matches, it sends a low-level ACK bit back to the master. If it does not match, it performs no action, and the SDA line remains high.

Read/Write Bit

The end of the address frame contains a read/write bit. If the master is sending data to the slave, it is low. If the master is requesting data from the slave, it is high.

Data Frame

Once the master detects the ACK bit from the slave, it can send the first data frame. The data frame is always 8 bits, followed by an ACK/NACK bit to verify the reception status. After sending all data frames, the master can send a stop condition to terminate communication.

Transmission Steps

1. When the SCL line is high, the master initiates bus communication by switching the SDA line from high to low.

2. The master sends the 7-bit or 10-bit address of the slave it wants to communicate with, along with the read/write bit:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

3. Each slave compares the address sent by the master with its own address. If the address matches, the slave returns an ACK bit by pulling the SDA line low. If the master’s address does not match the slave’s address, the slave keeps the SDA line high.

Understanding The Differences And Applications Of SPI, UART, I2C Communication

4. The master sends or receives data frames:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

5. After each data frame is transmitted, the receiving device returns another ACK bit to the sender to confirm successful reception of that frame:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

6. Subsequently, the master sets SCL to high and then switches SDA to high, sending a stop condition to the slave.

Single Master vs Multiple Slaves

Because I2C uses addressing, a single master can control multiple slaves. With a 7-bit address, up to 128 (2^7) unique addresses can be used. Using a 10-bit address is uncommon but can provide 1,024 (2^10) unique addresses. When connecting multiple slaves to a single master, use a 4.7K ohm pull-up resistor to connect them, for example, connecting the SDA and SCL lines to Vcc:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Multiple Masters vs Multiple Slaves

I2C supports multiple masters connected to multiple slaves. Issues arise when two masters try to send or receive data simultaneously over the SDA line. Therefore, each master must check the SDA line for low or high before sending a message. If the SDA line is low, it means another master is controlling the bus. If the SDA line is high, it is safe to send data. When connecting multiple masters to multiple slaves, use a 4.7K ohm pull-up resistor to connect the SDA and SCL lines to Vcc:

Understanding The Differences And Applications Of SPI, UART, I2C Communication

Advantages and Disadvantages

Compared to other protocols, I2C may sound complicated. Here are some pros and cons to help you determine whether they fit your project needs:

Advantages

  • Only two wires are used

  • Supports multiple masters and multiple slaves

  • Hardware is simpler than UART

  • Well-known and widely used protocol

Disadvantages

  • Data transmission rate is slower than SPI

  • Data frame size is limited to 8 bits

Disclaimer: This account maintains neutrality regarding all original and reprinted articles, and the articles pushed are for readers’ learning and communication only. Copyright of articles, images, etc., belongs to the original authors. If there is any infringement, please contact for deletion.

end

One口Linux

Follow, reply with 【1024】 to receive a wealth of Linux materials

Collection of Exciting Articles

Recommended Articles

【Album】ARM
【Album】Fan Q&A
【Album】All Originals
AlbumLinuxIntroduction
AlbumComputer Networks
AlbumLinux Drivers
【Resource】Learning Path for Embedded Driver Engineers
【Resource】All Linux Embedded Knowledge Points – Mind Map

Leave a Comment