Bird
Raised Fist0
Embedded Cprogramming~5 mins

I2C addressing (7-bit and 10-bit) in Embedded C - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the difference between 7-bit and 10-bit I2C addressing?
7-bit addressing uses 7 bits to identify a device on the I2C bus, allowing up to 128 addresses. 10-bit addressing uses 10 bits, allowing more devices (up to 1024 addresses) on the bus.
Click to reveal answer
beginner
How is a 7-bit I2C address transmitted on the bus?
The 7-bit address is sent in the first 7 bits of the address byte, followed by a single bit indicating read (1) or write (0).
Click to reveal answer
intermediate
How does 10-bit addressing start on the I2C bus?
It starts with a special 7-bit code '11110XX' where XX are the two most significant bits of the 10-bit address, followed by a read/write bit, then the remaining 8 bits of the address.
Click to reveal answer
intermediate
Why would you use 10-bit addressing instead of 7-bit?
Use 10-bit addressing when you need to connect more than 127 devices on the same I2C bus, as 7-bit addressing limits the number of unique addresses.
Click to reveal answer
beginner
In embedded C, how do you typically specify a 7-bit I2C address?
You specify the 7-bit address shifted left by 1 bit, leaving the least significant bit for read/write control.
Click to reveal answer
How many unique device addresses can 7-bit I2C addressing support?
A64
B128
C1024
D256
What is the first part of the 10-bit I2C address frame?
AA special 7-bit code starting with 11110
BThe full 10-bit address sent at once
COnly the lower 8 bits of the address
DA 7-bit address with read/write bit
In 7-bit addressing, what does the least significant bit of the address byte represent?
ARead or write operation
BDevice type
CBus speed
DError checking
Why might you shift a 7-bit I2C address left by 1 in embedded C code?
ATo match 10-bit addressing
BTo encrypt the address
CTo increase the address range
DTo make room for the read/write bit
Which addressing mode allows more devices on the I2C bus?
ABoth allow the same number
B7-bit addressing
C10-bit addressing
DNeither supports multiple devices
Explain how 7-bit and 10-bit I2C addressing differ in structure and usage.
Think about how many devices each can support and how the address is sent on the bus.
You got /4 concepts.
    Describe how you would represent a 7-bit I2C address in embedded C code and why.
    Remember the read/write bit is part of the address byte sent on the bus.
    You got /3 concepts.

      Practice

      (1/5)
      1.

      What is the size of the standard I2C address used to identify devices?

      easy
      A. 7 bits
      B. 8 bits
      C. 10 bits
      D. 16 bits

      Solution

      1. Step 1: Understand I2C addressing basics

        I2C commonly uses 7-bit addresses to identify devices on the bus.
      2. Step 2: Recall standard address size

        The standard I2C address size is 7 bits, while 10-bit is an extended mode.
      3. Final Answer:

        7 bits -> Option A
      4. Quick Check:

        Standard I2C address = 7 bits [OK]
      Hint: Remember standard I2C uses 7-bit addresses [OK]
      Common Mistakes:
      • Confusing 7-bit with 8-bit addresses
      • Thinking 10-bit is the default
      • Assuming 16-bit addresses exist in I2C
      2.

      Which of the following is the correct way to prepare a 7-bit I2C address for a write operation in embedded C?

      uint8_t address = 0x3C; // 7-bit address
      uint8_t write_address = ?;
      easy
      A. write_address = address << 2;
      B. write_address = (address >> 1) | 1;
      C. write_address = address | 0x80;
      D. write_address = (address << 1) | 0;

      Solution

      1. Step 1: Shift 7-bit address left by 1

        The 7-bit address must be shifted left by 1 to make room for the read/write bit.
      2. Step 2: Set read/write bit for write operation

        For write, the least significant bit is 0, so OR with 0.
      3. Final Answer:

        write_address = (address << 1) | 0; -> Option D
      4. Quick Check:

        Shift left 1 + write bit 0 = correct address [OK]
      Hint: Shift left by 1, OR with 0 for write [OK]
      Common Mistakes:
      • Shifting right instead of left
      • Setting read/write bit incorrectly
      • Using wrong bitwise OR values
      3.

      Given the following code snippet, what is the value of header for a 10-bit I2C address 0x305?

      uint16_t addr = 0x305;
      uint8_t header = 0xF0 | ((addr >> 7) & 0x06) | 0x00; // write operation
      medium
      A. 0xF6
      B. 0xF0
      C. 0xF2
      D. 0xF4

      Solution

      1. Step 1: Analyze addr = 0x305

        Binary 0b1100000101 (bits 9-0: bit9=1, bit8=1, bit7=0). Shift right 7: 0b110 (6).
      2. Step 2: Mask and compute header

        (6 & 0x06) = 0x06. Then 0xF0 | 0x06 | 0x00 = 0xF6.
      3. Final Answer:

        0xF6 -> Option A
      4. Quick Check:

        0xF0 | ((0x305 >> 7) & 0x06) = 0xF6 [OK]
      Hint: Shift address right 7, mask with 0x06, OR with 0xF0 [OK]
      Common Mistakes:
      • Not shifting address before masking
      • Incorrect mask value
      • Confusing read/write bit in header
      4.

      Identify the error in this code snippet for sending a 10-bit I2C address:

      uint16_t addr = 0x3FF;
      uint8_t header = 0xF0 | ((addr >> 7) & 0x06) | 0x01; // read operation
      uint8_t low_addr = addr & 0xFF;
      // send header and low_addr over I2C
      medium
      A. The read/write bit in header should be 0 for read
      B. The low_addr should be shifted left by 1 before sending
      C. The header calculation is correct; no error
      D. The mask 0x06 should be 0x07 to include all bits

      Solution

      1. Step 1: Check read/write bit in header

        For read operation, the last bit is set to 1, which matches the code.
      2. Step 2: Verify mask and low address

        Mask 0x06 correctly extracts bits 7 and 8; low_addr is the lower 8 bits, no shift needed.
      3. Final Answer:

        The header calculation is correct; no error -> Option C
      4. Quick Check:

        Header and low_addr correct for 10-bit read [OK]
      Hint: Check read/write bit and mask carefully [OK]
      Common Mistakes:
      • Confusing read/write bit value
      • Incorrect mask for bits 7 and 8
      • Shifting low address unnecessarily
      5.

      You need to write a function in embedded C that takes a 10-bit I2C address and returns the two bytes to send: the header byte and the low address byte for a write operation. Which of the following implementations is correct?

      void get_i2c_10bit_bytes(uint16_t addr, uint8_t *header, uint8_t *low_addr) {
          // ?
      }
      hard
      A. header = 0xF0 | ((addr >> 7) & 0x06) | 0x00; low_addr = addr & 0xFF;
      B. *header = 0xF0 | ((addr >> 7) & 0x06) | 0x00; *low_addr = addr & 0xFF;
      C. *header = 0xF0 | ((addr << 7) & 0x06) | 0x00; *low_addr = addr >> 8;
      D. header = 0xF0 | ((addr >> 7) & 0x07) | 0x01; low_addr = addr & 0xFF;

      Solution

      1. Step 1: Use pointers to assign output values

        The function parameters header and low_addr are pointers, so use * to assign values.
      2. Step 2: Calculate header and low_addr correctly

        Header is 0xF0 ORed with bits 7 and 8 of addr shifted right 7, and OR 0 for write; low_addr is lower 8 bits.
      3. Final Answer:

        *header = 0xF0 | ((addr >> 7) & 0x06) | 0x00; *low_addr = addr & 0xFF; -> Option B
      4. Quick Check:

        Pointer dereference + correct bit ops = correct function [OK]
      Hint: Use * to assign pointer outputs, shift right 7 bits [OK]
      Common Mistakes:
      • Not using * to assign pointer values
      • Shifting bits incorrectly
      • Setting read/write bit wrong
      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