Bird
Raised Fist0
Embedded Cprogramming~10 mins

Why I2C is used in Embedded C - Visual Breakdown

Choose your learning style10 modes available
Concept Flow - Why I2C is used
Start
↓
Need to connect multiple devices
↓
Choose communication method
↓
SPI: many wires, fast
↓
UART: 2 wires, point-to-point
↓
I2C: 2 wires, multi-device
↓
I2C chosen for simplicity and multi-device support
↓
Use I2C to communicate with sensors, memory, etc.
↓
End
This flow shows why I2C is chosen: to connect many devices easily using only two wires.
Execution Sample
Embedded C
/* Pseudocode for I2C communication setup */
void i2c_init() {
  // Setup SDA and SCL pins
  // Configure clock speed
}

void i2c_write(unsigned char address, unsigned char data) {
  // Start condition
  // Send address + write bit
  // Send data
  // Stop condition
}
This code sets up I2C and writes data to a device at a given address.
Execution Table
StepActionDetailsResult
1Initialize I2CConfigure SDA and SCL pinsPins ready for communication
2Start ConditionMaster pulls SDA low while SCL is highDevices detect start
3Send AddressMaster sends 7-bit address + write bitTarget device recognizes address
4Send DataMaster sends data byteDevice receives data
5Stop ConditionMaster releases SDA while SCL is highCommunication ends
6EndNo more data to sendI2C bus free
💡 Communication ends after stop condition; bus is free for next use
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 4After Step 5Final
SDA lineHighLow (start)Address bitsData bitsHigh (stop)High
SCL lineHighHighClock pulsesClock pulsesHighHigh
Device stateIdleDetect startAddress matchData receivedIdleIdle
Key Moments - 3 Insights
Why does I2C use only two wires for multiple devices?
I2C uses two wires (SDA for data, SCL for clock) shared by all devices, allowing many devices to connect without extra wires. See execution_table steps 2 and 3 where start and address are sent on shared lines.
What happens if the device does not recognize the address?
If no device matches the address sent in step 3, no device responds and communication stops or retries. This is why address matching is important (execution_table step 3).
Why is the stop condition important?
The stop condition (step 5) signals the end of communication and frees the bus for other devices. Without it, devices would not know when communication ends.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the state of the SDA line after step 2?
ALow
BHigh
CFloating
DPulsing
💡 Hint
Check the 'SDA line' row in variable_tracker after Step 2
At which step does the device recognize its address?
AStep 2
BStep 3
CStep 4
DStep 5
💡 Hint
Look at the 'Device state' in variable_tracker and 'Send Address' in execution_table
If the stop condition is not sent, what happens to the bus?
ABus switches to SPI mode
BBus resets automatically
CBus remains busy, blocking other devices
DBus ignores data
💡 Hint
Refer to key_moments about the importance of the stop condition
Concept Snapshot
I2C uses 2 wires (SDA for data, SCL for clock) to connect multiple devices.
It allows simple multi-device communication with addressing.
Communication starts with a start condition and ends with a stop condition.
Devices listen for their address to respond.
I2C is slower but simpler and uses fewer wires than SPI.
Full Transcript
I2C is used because it allows many devices to communicate using only two wires. The master device controls the clock (SCL) and data (SDA) lines. Communication starts with a start condition where SDA goes low while SCL is high. Then the master sends the 7-bit address plus a read/write bit. Devices listen and respond if the address matches. Data bytes are sent next. Finally, the master sends a stop condition where SDA goes high while SCL is high, signaling the end of communication. This method is simple and efficient for connecting sensors, memory, and other devices on the same bus.

Practice

(1/5)
1. Why is I2C commonly used in embedded systems?
easy
A. It uses wireless signals for communication.
B. It requires a separate wire for each device.
C. It only supports one device at a time.
D. It allows multiple devices to communicate using only two wires.

Solution

  1. Step 1: Understand I2C wiring

    I2C uses two wires: SDA (data) and SCL (clock) to connect devices.
  2. Step 2: Recognize multi-device communication

    Multiple devices share these two wires, communicating by unique addresses.
  3. Final Answer:

    It allows multiple devices to communicate using only two wires. -> Option D
  4. Quick Check:

    I2C uses 2 wires for many devices [OK]
Hint: I2C uses 2 wires for many devices, not one per device [OK]
Common Mistakes:
  • Thinking each device needs its own wire
  • Confusing I2C with wireless communication
  • Believing only one device can connect
2. Which of the following is the correct way to describe I2C communication lines?
easy
A. Separate data and clock lines for each device
B. Only one wire for both data and clock
C. Single data line and single clock line shared by all devices
D. Wireless data and wired clock lines

Solution

  1. Step 1: Identify I2C lines

    I2C uses two lines: SDA for data and SCL for clock.
  2. Step 2: Understand line sharing

    Both lines are shared by all devices on the bus, not separate per device.
  3. Final Answer:

    Single data line and single clock line shared by all devices -> Option C
  4. Quick Check:

    I2C shares SDA and SCL lines [OK]
Hint: I2C shares one data and one clock line for all devices [OK]
Common Mistakes:
  • Assuming separate lines per device
  • Thinking data and clock share one wire
  • Confusing wireless with wired lines
3. You want to connect 5 sensors to a microcontroller using I2C. What is the main advantage of using I2C here?
easy
A. Each sensor needs its own data and clock wires
B. You can use only two wires total for all sensors
C. Sensors communicate wirelessly with microcontroller
D. I2C requires no addressing for devices

Solution

  1. Step 1: Understand wiring for multiple devices

    I2C allows multiple devices to share the same two wires: SDA and SCL.
  2. Step 2: Recognize wiring advantage

    This saves pins and wiring complexity compared to separate wires per sensor.
  3. Final Answer:

    You can use only two wires total for all sensors -> Option B
  4. Quick Check:

    Two wires for many devices saves pins [OK]
Hint: I2C uses 2 wires total regardless of device count [OK]
Common Mistakes:
  • Thinking each sensor needs separate wires
  • Assuming I2C is wireless
  • Believing devices don't need addresses
4. Consider this I2C communication snippet in embedded C:
i2c_start();
i2c_write(0x50); // device address
uint8_t data = i2c_read();
i2c_stop();
printf("%d", data);
What does this code do?
medium
A. Starts I2C, writes device address, reads one byte, stops, prints data
B. Starts I2C, reads device address, writes one byte, stops, prints data
C. Starts I2C, writes data, reads address, stops, prints data
D. Starts I2C, stops immediately, prints zero

Solution

  1. Step 1: Analyze I2C function calls

    i2c_start() begins communication, i2c_write(0x50) sends device address.
  2. Step 2: Understand data flow

    i2c_read() reads one byte from the device, i2c_stop() ends communication, printf prints the data.
  3. Final Answer:

    Starts I2C, writes device address, reads one byte, stops, prints data -> Option A
  4. Quick Check:

    Write address, read data, stop, print [OK]
Hint: Write address before reading data in I2C [OK]
Common Mistakes:
  • Mixing read and write order
  • Assuming stop happens before read
  • Confusing address with data
5. This embedded C code tries to communicate over I2C but fails:
i2c_write(0x50);
i2c_start();
i2c_read();
i2c_stop();
What is the main error?
medium
A. Calling i2c_write before i2c_start
B. Missing device address in i2c_write
C. Not calling i2c_stop before i2c_start
D. Reading data before writing device address

Solution

  1. Step 1: Check function call order

    i2c_start() must be called before i2c_write() to begin communication.
  2. Step 2: Identify error

    Here, i2c_write() is called before i2c_start(), which is incorrect and causes failure.
  3. Final Answer:

    Calling i2c_write before i2c_start -> Option A
  4. Quick Check:

    Start communication before writing [OK]
Hint: Always call i2c_start() before i2c_write() [OK]
Common Mistakes:
  • Writing before starting communication
  • Ignoring function call order
  • Assuming stop must come before start
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard