RUE Logo

Module 1.5 - Connectivity

Verifying correct pin-to-pin connections and interface signal integrity at the schematic level

1. Pin-to-Pin Verification Against Datasheet Critical

What It Is

Pin-to-pin verification means comparing every connection on the schematic against the official component datasheet pin descriptions. This catches swapped pins, connections to wrong pin functions, and mismatches between the schematic symbol and the actual IC pinout. It is the most fundamental connectivity check and catches the most expensive errors.

Never trust schematic symbols blindly - always verify against the manufacturer's datasheet pinout diagram.

Why It Matters

A single swapped pin (TX/RX reversed, MISO/MOSI swapped, or address bit miswired) renders the board non-functional for that interface. These errors cannot be fixed in firmware and typically require a board respin. A wrong symbol in the library (pins numbered incorrectly) propagates the error to every design using that symbol. Pin-swap errors are the #1 cause of first-board-doesn't-work situations.

How to Check - Step by Step

  1. Open the IC datasheet to the pinout diagram (typically first few pages) and the pin description table.
  2. Open the schematic and locate the same IC. Compare pin-by-pin: number, name, and function.
  3. Verify the schematic symbol pin numbers match the physical package pinout (not just pin names).
  4. For each connected pin, verify the signal name makes sense for that pin's function (e.g., SPI_MOSI connected to the IC's MOSI/SDI pin, not MISO/SDO).
  5. Pay special attention to power pins: VDD, VSS, VDDIO - verify correct voltage and pin number.
  6. For multi-function pins, verify the alternate function being used matches the pin's capability (check alternate function mapping table).
  7. Cross-check both ends of every inter-IC connection: verify signal leaves correct pin on source IC and arrives at correct pin on destination IC.

SPI connection verification:

STM32F407 (Master)          W25Q128 Flash (Slave)
Pin 30 (PA5/SPI1_SCK)  --> Pin 6 (CLK)     [Clock: Master out, Slave in]
Pin 31 (PA6/SPI1_MISO) <-- Pin 2 (DO)      [Data: Slave out, Master in]
Pin 32 (PA7/SPI1_MOSI) --> Pin 5 (DI)      [Data: Master out, Slave in]
Pin 29 (PA4/GPIO)       --> Pin 1 (nCS)     [Chip select: Active low]

Verified against: STM32F407 datasheet Table 9 (Alternate Functions)
                  W25Q128JV datasheet Figure 1 (Pin Configuration)
Both pin numbers AND signal directions confirmed correct.

Symbol pin error: Schematic symbol for W25Q128 was created with pins 2 and 5 swapped (DO and DI reversed). Schematic LOOKS correct (MOSI->DI label, MISO->DO label) but physical pin 2 is actually DO and pin 5 is DI. The PCB traces connect correctly to the wrong physical pins. Board fabricated, flash chip does not respond. $8,000 board respin required.

KiCad: Compare symbol against datasheet in Symbol Editor (Edit > Symbol). Check pin mapping in Footprint Assignment. Use 3D viewer to verify physical pin positions.

Altium: Use Component Wizard to verify pin-to-pad mapping. Cross-probe between schematic and PCB. Verify with Manufacturer links in component properties.

OrCAD: Open Part Editor to verify pin numbers vs. package. Use cross-reference between schematic symbol and PCB footprint padstack.

  • Library trust: Trusting community-created symbols without verification. Many open-source libraries contain pin numbering errors, especially for QFN and BGA packages.
  • Revision changes: IC manufacturer changes pinout between revisions (Rev A vs Rev B). Using an old datasheet for a new silicon revision.
  • Mirror confusion: Viewing IC pinout from top vs. bottom view (especially with BGA). The datasheet may show top view, but layout sees bottom view.

2. Pull-Up/Pull-Down on Open-Drain Critical

What It Is

Open-drain (or open-collector) outputs can only pull a signal LOW - they cannot drive HIGH. These outputs require an external pull-up resistor to the appropriate voltage rail to define the HIGH state. Without the pull-up, the signal floats when the output is inactive. Common open-drain signals include I2C (SDA, SCL), interrupt outputs (nIRQ), power-good indicators (nPGOOD), and status flags.

The pull-up resistor value determines the rise time, power consumption, and noise immunity of the signal.

Why It Matters

An open-drain signal without a pull-up resistor will never go HIGH - it floats at an undefined voltage. For I2C, this means the bus never releases and communication fails completely. For interrupt lines, the MCU sees constant triggering from noise on the floating line, causing 100% CPU utilization processing false interrupts. For PGOOD signals, the MCU cannot detect when power is stable, preventing proper boot sequencing.

How to Check - Step by Step

  1. Identify all open-drain/open-collector outputs in the design (check datasheets for output type).
  2. For I2C buses: verify pull-up resistors on BOTH SDA and SCL lines (common values: 2.2k-10k depending on bus speed and capacitance).
  3. For interrupt lines (nIRQ, nINT): verify pull-up resistor to VCC (typical 10k-100k).
  4. For PGOOD/status outputs: verify pull-up to appropriate voltage rail.
  5. Calculate pull-up value: R = (V_pullup - V_OL) / I_sink_max. Verify rise time: t_rise = 0.8 * R * C_bus.
  6. Check that pull-up voltage matches the logic level of the receiving input (not always same as supply voltage).
  7. Verify only ONE pull-up per net (multiple pull-ups in parallel create too-strong drive and excessive power consumption).

I2C bus pull-ups:

Bus: I2C1 at 400kHz (Fast Mode)
Devices: STM32 (master), BME280 (slave), EEPROM AT24C256 (slave)
Bus capacitance: ~50pF (estimated from trace length and device pin capacitance)
Pull-up rail: VCC_3V3

Pull-up calculation:
  R_min = (VCC - VOL_max) / IOL = (3.3 - 0.4) / 3mA = 967 ohms (minimum)
  R_max = tr_max / (0.8473 * Cb) = 300ns / (0.8473 * 50pF) = 7.08k (maximum for 400kHz)
  Selected: 4.7k (within 967 ohms to 7.08k range)
  Rise time: 0.8473 * 4.7k * 50pF = 199ns (meets 300ns max for Fast Mode)

R_SDA = 4.7k to VCC_3V3
R_SCL = 4.7k to VCC_3V3

Missing I2C pull-ups: Engineer connects I2C SDA and SCL between STM32 and BME280 sensor with no pull-up resistors, relying on "internal pull-ups" in the STM32. STM32 internal pull-ups are typically 30k-50k ohms. At 400kHz with 50pF bus capacitance, rise time = 0.8473 * 40k * 50pF = 1.7us. Required maximum rise time for 400kHz: 300ns. Bus is 5x too slow. Communication works unreliably - occasional NACK errors, data corruption, sometimes OK (marginal timing).

KiCad: Search for open-drain symbols in schematic. Check net connections for pull-up resistors. ERC can flag nets with only open-drain drivers and no passive pull-up.

Altium: Use Net Classes to group I2C signals. Signal Integrity analysis shows if rise times meet specifications with current pull-up values.

OrCAD: Use DRC rules to check for pull-ups on nets connected to open-drain pins. Custom design rules can flag missing pull-ups.

  • Multiple pull-ups: Each I2C slave breakout board may include its own pull-ups. With 3 boards each having 4.7k, effective pull-up = 1.57k - too strong, exceeds I2C sink current spec.
  • Wrong voltage: Pull-up to 5V on an I2C bus where slave devices are 3.3V. Exceeds slave input voltage maximum rating - damages slave IC.
  • Internal pull-ups relied upon: MCU internal pull-ups are typically 30-50k - too weak for most I2C bus speeds and lengths.

3. Unused Input Pins Tied Critical

What It Is

Every digital input pin that is not used in the design must be tied to a defined logic level (VCC or GND) either directly or through a resistor. This includes unused gate inputs on logic ICs, unused select pins on multiplexers, unused address pins on I2C devices, and unused GPIO configured as inputs on MCUs. The correct tie level is specified in the component datasheet.

This is closely related to the "no floating pins" check but focuses specifically on active IC inputs that could cause functional issues.

Why It Matters

CMOS input pins have extremely high impedance (>1M ohm). A floating CMOS input acts as an antenna, picking up electromagnetic noise which causes the input to oscillate between HIGH and LOW states at radio frequencies. This causes: excessive power consumption (both P and N transistors conducting simultaneously = shoot-through current), EMI radiation from the oscillating internal circuitry, unpredictable logic behavior downstream, and potential latch-up in extreme cases.

How to Check - Step by Step

  1. For each logic IC (74HC, 74LVC series, etc.), count used inputs vs. total inputs. Verify ALL unused inputs are tied.
  2. Check the datasheet for recommended tie state (some pins must be HIGH, others LOW, some don't care).
  3. For unused op-amp inputs in multi-amp packages: configure as voltage follower (output tied to inverting input, non-inverting to mid-rail or ground).
  4. For MCU unused GPIO: verify firmware configures them as outputs driven low, OR as inputs with internal pull enabled, AND consider adding external pull resistors for boot-up safety.
  5. For unused differential inputs (USB, LVDS): verify proper termination per interface spec.
  6. Check that tie resistors have appropriate values (typically 10k for logic inputs, 100k for ultra-low power).

74LVC14 hex inverter (only 4 of 6 used):

Used: Inputs 1A, 2A, 3A, 4A connected to signal sources
Unused:
  Pin 9 (5A input) --> tied to GND through 10k resistor
  Pin 11 (6A input) --> tied to GND through 10k resistor
  Pin 8 (5Y output) --> left unconnected (outputs can float safely)
  Pin 10 (6Y output) --> left unconnected

Rationale: Inputs tied LOW to prevent oscillation.
10k resistor allows future rework if input is needed later.
Outputs left open (driving nothing consumes no extra power).

74HC14 with floating inputs: Only 2 of 6 inverters used. Four input pins (3A, 4A, 5A, 6A) left floating. Each unused inverter oscillates at ~40MHz (input noise bandwidth), drawing 5mA per gate = 20mA additional current (vs. 1uA spec quiescent). Total IC power: 70mW instead of 0.01mW. Adds significant switching noise to power rail. EMI scan shows 40MHz harmonic spikes radiating from the IC. Board fails FCC testing.

KiCad: ERC flags unconnected input pins. Place No-Connect flag (X) only on OUTPUTS. For inputs, always provide a connection. Review ERC input pin warnings carefully.

Altium: ERC marks unconnected input type pins. Use "No ERC" directive only after confirming the pin is properly handled. Compile to see all unconnected pins.

OrCAD: DRC checks for undriven inputs. Mark unused inputs with explicit connections to power/ground in schematic. Don't use No-DRC markers on inputs.

  • No-connect on inputs: Placing a "no connect" symbol on an IC input pin silences the ERC warning but does NOT fix the electrical problem. The pin is still floating.
  • Direct-to-rail without resistor: Tying directly to VCC works but makes future modifications impossible without cutting traces. A 10k series resistor allows easy rework.
  • Wrong level selection: Some ICs have internal gates that activate on specific input levels. Tying an enable pin HIGH when the datasheet says "tie LOW when unused" could activate unintended functions.

4. Multi-Function Pin Configuration Major

What It Is

Modern MCUs and SoCs have pins that serve multiple functions (GPIO, SPI, I2C, UART, PWM, ADC) selectable through configuration registers. The schematic must correctly map signals to pins that actually support the required alternate function. Not every pin supports every function - the alternate function mapping table in the datasheet defines which functions are available on which pins.

Additionally, some pins have configuration strapping (boot mode, bus width) that must be set correctly at power-up via pull-up/pull-down resistors.

Why It Matters

If UART1_TX is connected to a pin that only supports SPI and GPIO (not UART), the interface will never work regardless of firmware configuration. This error cannot be fixed with software - it requires a board respin to move the trace to a pin that supports the UART alternate function. Similarly, incorrect boot strapping pins can prevent the MCU from starting (wrong boot mode, incorrect bus width for external memory).

How to Check - Step by Step

  1. Open the MCU/SoC datasheet to the "Alternate Function Mapping" table (STM32: Table titled "Alternate function mapping").
  2. For each peripheral used (SPI, I2C, UART, etc.), verify the connected pins support that specific alternate function.
  3. Check for conflicts: two peripherals mapped to the same pin cannot both be active (e.g., SPI1_MOSI and UART2_TX on same pin).
  4. Verify boot/configuration strapping pins have correct pull-up/pull-down for desired boot mode.
  5. Check that analog functions (ADC channels) are connected to pins with ADC capability (not all GPIO have ADC).
  6. For timer outputs (PWM): verify the pin supports the specific timer channel needed.
  7. Verify DMA channel availability for the selected peripheral-pin combination (some combinations don't support DMA).

STM32F407 peripheral mapping verification:

Required: SPI1, I2C1, USART2, 3x ADC channels, 2x PWM outputs

PA5 = SPI1_SCK  (AF5 - verified in Table 9)
PA6 = SPI1_MISO (AF5 - verified)
PA7 = SPI1_MOSI (AF5 - verified)
PB6 = I2C1_SCL  (AF4 - verified, pin supports I2C with internal OD)
PB7 = I2C1_SDA  (AF4 - verified)
PA2 = USART2_TX (AF7 - verified)
PA3 = USART2_RX (AF7 - verified)
PA0 = ADC1_IN0  (analog mode - verified, pin has ADC channel)
PA1 = ADC1_IN1  (analog mode - verified)
PC0 = ADC1_IN10 (analog mode - verified)
PB0 = TIM3_CH3  (AF2 - verified for PWM output)
PB1 = TIM3_CH4  (AF2 - verified for PWM output)

No conflicts detected. All AF assignments verified against datasheet.

Pin function conflict: Designer connects UART1_TX to pin PC6 and Timer8_CH1 PWM output to the same PC6. Both cannot be active simultaneously (same AF number conflict). Also: ADC input connected to PB2 which has NO ADC channel (PB2 is BOOT1 pin with no ADC alternate function). Design requires board respin to move ADC to a pin with actual ADC capability (PA0-PA7, PC0-PC5).

KiCad: Use STM32CubeMX or chip-specific pin planning tools to verify pin assignments BEFORE creating the schematic. Export pin configuration to match schematic.

Altium: Many MCU manufacturers provide Altium-compatible pin planning tools. Import pin mapping directly into component properties.

OrCAD: Use manufacturer's pin planning tool (STM32CubeMX, NXP MCUXpresso Config Tools) and cross-reference with schematic connections.

  • AF number confusion: STM32 has up to 16 alternate functions per pin (AF0-AF15). Connecting to wrong AF number means the pin CAN do the function but you must select the correct AF in firmware.
  • 5V-tolerant pins: Not all STM32 pins are 5V tolerant. Connecting 5V logic to a non-FT pin damages the MCU. Check the "I/O structure" column in the pinout table.
  • Boot pins during operation: BOOT0/BOOT1 must be stable during reset but can sometimes be reused as GPIO after boot. Verify the strapping resistors don't conflict with runtime function.

5. I2C/SPI Address Conflicts Major

What It Is

I2C devices share a bus using 7-bit addresses. If two devices have the same address, they both respond simultaneously, corrupting data. Address conflicts occur when using multiple copies of the same sensor or when different ICs happen to share the same default address. SPI avoids this with chip-select lines, but those must be unique per device. Address checking verifies no two devices on the same bus will collide.

Some I2C devices have configurable address pins (A0, A1, A2) that must be set to unique values.

Why It Matters

Two I2C devices with the same address both acknowledge simultaneously - the master cannot communicate with either one individually. Data reads return corrupted values (logical AND of both devices' responses). In the best case, neither device works. In the worst case, one device works intermittently and the other is completely inaccessible, causing hard-to-diagnose bugs that appear to be firmware issues but are actually hardware address conflicts.

How to Check - Step by Step

  1. List all I2C devices on each I2C bus with their 7-bit addresses (check datasheets for fixed and configurable address bits).
  2. Verify no two devices on the same bus share the same address.
  3. For devices with configurable address pins (A0, A1, A2): verify the pin strapping matches the desired unique address.
  4. Check for reserved I2C addresses: 0x00 (general call), 0x01-0x07 (reserved), 0x78-0x7F (reserved for 10-bit addressing).
  5. For SPI buses: verify each device has a dedicated chip select (nCS) line - no two devices share a nCS.
  6. Verify address documentation matches firmware I2C address constants (include R/W bit convention: 7-bit vs 8-bit address notation).

I2C bus address map:

I2C1 Bus (400kHz, pull-ups: 4.7k to 3.3V):
  BME280 (temp/humidity):  0x76 (SDO pin tied to GND)
  BMP390 (pressure):       0x77 (SDO pin tied to VCC)
  AT24C256 EEPROM:         0x50 (A0=A1=A2=GND)
  INA219 current sensor:   0x40 (A0=GND, A1=GND)

All addresses unique - no conflicts.
Address pins documented with physical connections on schematic.

SPI1 Bus:
  W25Q128 Flash:    nCS = PA4 (dedicated GPIO)
  Display ILI9341:  nCS = PB12 (dedicated GPIO)
  No shared chip selects.

Address conflict: Two BME280 sensors on same I2C bus. Both have SDO pin tied to GND, giving both address 0x76. Designer intended to read two independent temperature locations but both sensors respond simultaneously. Data reads return 0xFF (both pull bus high = AND of both responses is corrupted). Fix requires: rewiring one SDO to VCC (changes address to 0x77), or using I2C multiplexer (TCA9548A), or moving to separate I2C bus.

KiCad: No built-in I2C address conflict checking. Create a net list and manually tabulate all devices per I2C bus. Add address annotations to schematic.

Altium: Use schematic annotations to document I2C addresses. No automated conflict checking - maintain address map in design documentation.

OrCAD: Add I2C address as component property. Generate report sorted by bus and address to visually identify duplicates.

  • 7-bit vs 8-bit notation: Datasheet says address is "0xD0" (8-bit with R/W). Firmware uses 7-bit: 0x68. These are the same device! Confusion between notations causes wrong address in code.
  • Hardware vs software address: Some devices allow software-programmable addresses, but these RESET to default on power cycle. If two devices have same default, you cannot configure them individually.
  • I2C multiplexer overhead: TCA9548A multiplexer solves address conflicts but adds complexity, latency, and another potential failure point. Better to choose devices with different addresses.

6. Bus Contention Checks Critical

What It Is

Bus contention occurs when two or more output drivers attempt to drive the same net to different logic levels simultaneously. This creates a short circuit between VCC and GND through the output transistors of both drivers, causing excessive current (50-200mA per driver), overheating, logic-level violations, and potential permanent damage. Contention must be prevented by design through proper use of tri-state enables, chip selects, and bus arbitration.

Even brief contention during switching transitions (few nanoseconds) causes current spikes that degrade reliability over time.

Why It Matters

Sustained bus contention (two drivers actively fighting) can destroy output drivers within seconds from overcurrent heating. Even if not immediately destructive, it creates an undefined voltage level (neither HIGH nor LOW) that causes downstream logic to behave unpredictably - potentially corrupting data, generating false clock edges, or causing state machine lockups. This is particularly dangerous on data buses (SPI MISO, parallel data) where multiple slaves could drive simultaneously.

How to Check - Step by Step

  1. Identify all shared buses where multiple devices can drive: SPI MISO line, parallel data buses, bidirectional signals.
  2. For SPI MISO: verify each slave's MISO output goes high-impedance when its chip select is deasserted. Check slave datasheets for "SDO output when CS high = Hi-Z".
  3. For parallel buses: verify tri-state enables (OE) are mutually exclusive - only one device drives at a time.
  4. Check for timing gaps: during chip-select transitions, is there a brief period where two devices could both be active?
  5. For bidirectional buses (like memory data bus): verify direction control signals prevent both sides from driving simultaneously.
  6. Check reset/power-up state: during initialization before firmware configures enables, are any outputs in a potentially contending state?
  7. Verify pull-up/pull-down resistors on shared bus to define state when all drivers are tri-stated.

SPI bus with 3 slaves - no contention:

SPI1_MISO line shared between:
  - W25Q128 Flash (DO output): Hi-Z when nCS1 = HIGH (verified in datasheet)
  - ADS1256 ADC (DOUT output): Hi-Z when nCS2 = HIGH (verified in datasheet)
  - SD Card (DAT0 output): Hi-Z when nCS3 = HIGH (verified)

Chip selects are mutually exclusive (only one LOW at a time, controlled by firmware).
During idle (all CS HIGH): 10k pull-up on MISO defines bus state as HIGH.
During CS transitions: 10ns propagation delay - worst case both Hi-Z briefly (safe).

No contention possible.

SPI MISO contention: Three SPI slaves share MISO. But the DAC (MCP4922) does NOT tri-state its SDO pin when CS is high - it continues driving the last output bit. When the MCU selects the Flash (CS_FLASH LOW), both Flash and DAC drive MISO simultaneously. Flash drives HIGH, DAC drives LOW = short circuit. Result: 100mA shoot-through current, MISO voltage = 1.5V (undefined level), data corruption on every Flash read. Both devices slowly degrade from thermal stress.

KiCad: ERC may flag "two outputs on same net" if pin types are correctly defined. Manually verify tri-state behavior for each shared bus device.

Altium: Signal Integrity analysis can detect potential contention. Set pin types correctly for ERC to flag output-output conflicts.

OrCAD: DRC flags output-to-output connections. For tri-state buses, mark pin type as "Tri-state" to allow shared connections without false errors.

  • Not all SPI slaves tri-state: Some older or specialty ICs keep driving their output even when deselected. Must add a tri-state buffer (SN74LVC1G125) on their output.
  • Power-up race: During startup, before firmware initializes chip selects as outputs driven HIGH, they may float LOW momentarily - selecting multiple slaves simultaneously.
  • Level shifter contention: Bidirectional level shifters (BSS138-based) on shared buses can create contention if both sides try to drive simultaneously during direction transitions.