LPC55S69: I2C registers all correct, but SDA/SCL never physically move

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

LPC55S69: I2C registers all correct, but SDA/SCL never physically move

Jump to solution
340 Views
ryan714
Contributor II

LPC55S69: I2C4 (Flexcomm 4) master never physically drives SDA/SCL despite fully correct register configuration - I2C_MasterStart() hangs permanently in I2C_MasterCheckStartResponse()

Summary

On an LPC55S69-EVK, I2C_MasterTransferBlocking() hangs permanently (no timeout, confirmed via SDK source inspection) on the very first transaction attempted after I2C_MasterInit(). Every peripheral configuration register I can inspect - CFG, PSELID, CLKDIV, MSTTIME, IOCON pin function, and the Secure AHB Controller's peripheral access rules - reads back as correctly configured. However, a direct multimeter measurement of the physical SDA/SCL lines, taken while execution is frozen mid-hang inside the driver, shows both lines sitting at a clean, unchanged idle ~3.3V - meaning the I2C master's internal state machine never actually asserts a START condition onto the physical bus at all, despite software believing it did.

Environment

  • Board: LPCXpresso55S69-EVK, LPC55S69JBD100
  • IDE: MCUXpresso IDE v25.6 [Build 136]
  • I2C peripheral: I2C4 (Flexcomm 4), pins P1_20 (SCL) / P1_21 (SDA)
  • This is Core 1 (non-secure, no TrustZone - confirmed this chip's Core 1 has no TrustZone capability at all per AN12278) of a dual-core project. Core 1 is confirmed booting and executing correctly (proven via a working LED heartbeat and independent shared-memory diagnostics) - this report is specifically about the I2C peripheral, not the multicore boot sequence.
  • Sensor: Adafruit BME688 (STEMMA QT, onboard pull-ups), address 0x77, connected via genuine Adafruit STEMMA QT-to-header cable

The core evidence

1. The hang location, confirmed via SDK source inspection

Reading fsl_i2c.c directly: I2C_MasterTransferBlocking() calls I2C_MasterStart() then I2C_MasterCheckStartResponse(). The latter calls I2C_PendingStatusWait(), which polls kI2C_MasterPendingFlag in a loop with no timeout at all when I2C_RETRY_TIMES is 0/undefined (confirmed this is the active code path in this project - the #else branch with an unconditional while(...) and no exit condition). Execution never returns from this call, confirmed by a shared-memory diagnostic checkpoint written immediately before the call, which is reached, and one written immediately after, which is never reached, even after 5+ seconds of continuous execution.

2. Register state at the moment of the hang (read live via debugger, not assumed)

Register Address Value Meaning

I2C4->STAT0x5008A0000x00000000Idle. MSTPENDING=0, MSTSTATE=0, no error flags
I2C4->CFG0x5008A8000x00000001MSTEN=1 - master mode enabled
FLEXCOMM4->PSELID0x5008AFF80x1020F3PERSEL=3 (I2C personality genuinely selected), I2CPRESENT=1
I2C4->CLKDIV0x5008A81474Non-zero, plausible divider
I2C4->MSTTIME0x5008A824102Non-zero, plausible SCL timing
IOCON->PIO[1][20] (P1_20/SCL)0x500010D00x323FUNC=3 (Flexcomm alt-function), pull-up + open-drain enabled
IOCON->PIO[1][21] (P1_21/SDA)0x500010D40x323Same - correctly configured
AHB_SECURE_CTRL FLEXCOMM4_RULE0x500AC12400b00 = "Non-secure and Non-privilege user access allowed" (most permissive)
AHB_SECURE_CTRL IOCON_RULE0x500AC1300Same - fully open, non-secure access unrestricted

Every one of these is exactly what a correctly-configured, unrestricted, ready-to-transact I2C master should show.

3. Physical measurement (the decisive evidence)

With execution frozen mid-hang (confirmed via the checkpoint diagnostic, STAT still reading 0x00000000 at this exact moment):

  • SDA to GND: 3.299 V
  • SCL to GND: 3.299 V

Both lines are indistinguishable from a fully idle, untouched bus. The physical pins never moved at all, despite I2C_MasterStart() having already executed (it's called before I2C_MasterCheckStartResponse(), where we're actually hung) and despite every register above showing a fully configured, unrestricted master.

What has been ruled out

  • Sensor/cable/breadboard fault - wiring continuity confirmed with a multimeter across multiple different physical wire positions (5+ attempts); genuine Adafruit STEMMA QT cable; sensor address pad confirmed consistent with the documented 0x77 default; identical result reproduces regardless of which physical header pins are used
  • Clock source/frequency - explicitly re-asserted CLOCK_SetupFROClocking(12000000U) immediately before attaching Flexcomm4's clock; no change
  • Baud rate/timing miscalculation - reduced from 100 kHz to 10 kHz (10x); identical hang; CLKDIV/MSTTIME both confirmed non-zero and plausible
  • Pin mux - confirmed via IOCON_FUNC3 write and independently re-verified via direct register read at the exact moment of the hang
  • I2C personality selection - confirmed via PSELID
  • Sensor driver library - bypassed bme68x.c entirely; a raw, minimal zero-length address probe built directly with the SDK's i2c_master_transfer_t struct produces the identical hang
  • MasterEnable off/on toggle workaround (from a similar-sounding NXP community report for a different part) - no effect
  • TrustZone/Secure AHB Controller peripheral access restriction - confirmed both IOCON and FLEXCOMM4 are set to the most permissive non-secure access rule

Question

Given every software-visible register indicates a correctly configured, unrestricted I2C master, but the physical SDA/SCL pins provably never move (confirmed by direct voltage measurement while frozen inside the driver call), what remaining hardware-level step is required to get the I2C4 peripheral to actually drive its pads on this part?

Specifically:

  • Is there a known LPC55S69 errata affecting Flexcomm I2C pad drive that isn't captured by the CFG/PSELID/IOCON registers I've checked?
  • Is there an additional power-domain, pad-supply, or analog block that needs to be explicitly enabled for Flexcomm I2C physical output (something outside the digital peripheral configuration registers) that I may have missed?
  • Given this is Core 1 (bare-metal, no RTOS, no TrustZone) in a dual-core multicore project where Core 0 runs FreeRTOS - is there any known interaction between Core 0's own boot-time configuration and Core 1's ability to drive Flexcomm4's physical pads, beyond what a register-level snapshot would reveal (e.g., something in SYSCON clock-gating for the pad IO cell itself, distinct from CLOCK_AttachClk's peripheral function clock)?

Happy to provide the full project, a logic analyzer capture, or any additional register dump on request.

Labels (1)
0 Kudos
Reply
1 Solution
295 Views
ryan714
Contributor II

Resolved - root cause was an incorrect IOCON alternate function number

Posting the resolution in case anyone finds this thread later with a similar symptom.

The actual root cause

IOCON_PIO_FUNC3 does not route P1_20/P1_21 to FC4 I2C on this board. The correct alternate function is FUNC5, with open-drain disabled at the IOCON level (the I2C peripheral's own CFG register handles open-drain behavior internally - enabling it again at the IOCON pad level was also wrong).

I had derived FUNC3 by reading the pin_signal ordering in a comment (PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2) and assuming 0-indexed position = function number. That assumption was incorrect for this pin.

Why this produced such a confusing symptom

With the wrong alternate function selected, every I2C-internal register still read back as perfectly configured:

  • I2C4->CFG.MSTEN = 1 (master enabled)
  • FLEXCOMM4->PSELID showed I2C personality genuinely selected
  • CLKDIV/MSTTIME were valid, non-zero
  • Even IOCON->PIO[1][20/21] showed a function selected (just the wrong one) - nothing about this register's value alone signals "wrong function," only "some function is selected"

None of that depends on the physical pin actually being connected to the I2C block - PSELID and CFG are entirely internal to the Flexcomm/I2C logic, independent of which alternate function the IOCON mux happens to route to. So the peripheral was internally fully configured and "ready," while the physical SDA/SCL pins were never actually wired to it at all. This produced a permanent hang in I2C_MasterTransferBlocking() (confirmed via SDK source: no timeout when I2C_RETRY_TIMES is 0) with zero error flags ever raised, and - the piece that finally proved it - a multimeter measurement showing the physical bus completely unchanged at idle voltage even while frozen mid-transaction, since the pins genuinely were never driven.

How it was found

Created a fresh, separate single-core test project for the same board and used the MCUXpresso wizard's own auto-generated BOARD_InitACCELPins() function (this board has an onboard accelerometer wired to the same I2C4 bus, so the wizard ships a working, verified pin mux for these exact pins). Reading that function's actual generated source showed IOCON_PIO_FUNC5 with open-drain disabled - directly contradicting my own hand-derived FUNC3/open-drain-enabled configuration. Switching to match NXP's own verified values immediately resolved the permanent hang; a subsequent, unrelated address-NAK (0x77 not acknowledging) turned out to just be a loose header-pin contact, resolved by moving the connection to different header pins.

Lesson for anyone else hitting an identical symptom

If a Flexcomm peripheral's own registers (PSELID, CFG, CLKDIV, etc.) all read back as correctly configured but the physical bus never shows any activity (confirmed via multimeter/scope) - don't trust a hand-derived alternate function number from reading the pin_signal comment ordering. Cross-check against any wizard-auto-generated pin mux function this SDK ships for the same physical pins on the same board (peripherals the eval board itself uses - accelerometers, codecs, etc. - are a good source of a genuinely verified reference), or regenerate the pin mux via the MCUXpresso Pins tool directly rather than hand-writing IOCON_PinMuxSet() calls from an assumed function index.

Thanks again to everyone who engaged with the earlier posts in this thread and the original multicore boot thread - the register-level verification work across both investigations is what eventually made this contradiction (everything configured correctly, yet nothing on the bus) visible enough to chase down.

View solution in original post

0 Kudos
Reply
1 Reply
296 Views
ryan714
Contributor II

Resolved - root cause was an incorrect IOCON alternate function number

Posting the resolution in case anyone finds this thread later with a similar symptom.

The actual root cause

IOCON_PIO_FUNC3 does not route P1_20/P1_21 to FC4 I2C on this board. The correct alternate function is FUNC5, with open-drain disabled at the IOCON level (the I2C peripheral's own CFG register handles open-drain behavior internally - enabling it again at the IOCON pad level was also wrong).

I had derived FUNC3 by reading the pin_signal ordering in a comment (PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2) and assuming 0-indexed position = function number. That assumption was incorrect for this pin.

Why this produced such a confusing symptom

With the wrong alternate function selected, every I2C-internal register still read back as perfectly configured:

  • I2C4->CFG.MSTEN = 1 (master enabled)
  • FLEXCOMM4->PSELID showed I2C personality genuinely selected
  • CLKDIV/MSTTIME were valid, non-zero
  • Even IOCON->PIO[1][20/21] showed a function selected (just the wrong one) - nothing about this register's value alone signals "wrong function," only "some function is selected"

None of that depends on the physical pin actually being connected to the I2C block - PSELID and CFG are entirely internal to the Flexcomm/I2C logic, independent of which alternate function the IOCON mux happens to route to. So the peripheral was internally fully configured and "ready," while the physical SDA/SCL pins were never actually wired to it at all. This produced a permanent hang in I2C_MasterTransferBlocking() (confirmed via SDK source: no timeout when I2C_RETRY_TIMES is 0) with zero error flags ever raised, and - the piece that finally proved it - a multimeter measurement showing the physical bus completely unchanged at idle voltage even while frozen mid-transaction, since the pins genuinely were never driven.

How it was found

Created a fresh, separate single-core test project for the same board and used the MCUXpresso wizard's own auto-generated BOARD_InitACCELPins() function (this board has an onboard accelerometer wired to the same I2C4 bus, so the wizard ships a working, verified pin mux for these exact pins). Reading that function's actual generated source showed IOCON_PIO_FUNC5 with open-drain disabled - directly contradicting my own hand-derived FUNC3/open-drain-enabled configuration. Switching to match NXP's own verified values immediately resolved the permanent hang; a subsequent, unrelated address-NAK (0x77 not acknowledging) turned out to just be a loose header-pin contact, resolved by moving the connection to different header pins.

Lesson for anyone else hitting an identical symptom

If a Flexcomm peripheral's own registers (PSELID, CFG, CLKDIV, etc.) all read back as correctly configured but the physical bus never shows any activity (confirmed via multimeter/scope) - don't trust a hand-derived alternate function number from reading the pin_signal comment ordering. Cross-check against any wizard-auto-generated pin mux function this SDK ships for the same physical pins on the same board (peripherals the eval board itself uses - accelerometers, codecs, etc. - are a good source of a genuinely verified reference), or regenerate the pin mux via the MCUXpresso Pins tool directly rather than hand-writing IOCON_PinMuxSet() calls from an assumed function index.

Thanks again to everyone who engaged with the earlier posts in this thread and the original multicore boot thread - the register-level verification work across both investigations is what eventually made this contradiction (everything configured correctly, yet nothing on the bus) visible enough to chase down.

0 Kudos
Reply
%3CLINGO-SUB%20id%3D%22lingo-sub-2406827%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ELPC55S69%3A%20I2C%20registers%20all%20correct%2C%20but%20SDA%2FSCL%20never%20physically%20move%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2406827%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CH1%20id%3D%22toc-hId-1354062612%22%20id%3D%22toc-hId-1354088496%22%3ELPC55S69%3A%20I2C4%20(Flexcomm%204)%20master%20never%20physically%20drives%20SDA%2FSCL%20despite%20fully%20correct%20register%20configuration%20-%20I2C_MasterStart()%20hangs%20permanently%20in%20I2C_MasterCheckStartResponse()%3C%2FH1%3E%3CH2%20id%3D%22toc-hId-2044624086%22%20id%3D%22toc-hId-2044649970%22%3ESummary%3C%2FH2%3E%3CP%3EOn%20an%20LPC55S69-EVK%2C%20I2C_MasterTransferBlocking()%20hangs%20permanently%20(no%20timeout%2C%20confirmed%20via%20SDK%20source%20inspection)%20on%20the%20very%20first%20transaction%20attempted%20after%20I2C_MasterInit().%20Every%20peripheral%20configuration%20register%20I%20can%20inspect%20-%20CFG%2C%20PSELID%2C%20CLKDIV%2C%20MSTTIME%2C%20IOCON%20pin%20function%2C%20and%20the%20Secure%20AHB%20Controller's%20peripheral%20access%20rules%20-%20reads%20back%20as%20correctly%20configured.%20However%2C%20a%20direct%20multimeter%20measurement%20of%20the%20physical%20SDA%2FSCL%20lines%2C%20taken%20while%20execution%20is%20frozen%20mid-hang%20inside%20the%20driver%2C%20shows%20both%20lines%20sitting%20at%20a%20clean%2C%20unchanged%20idle%20~3.3V%20-%20meaning%20the%20I2C%20master's%20internal%20state%20machine%20never%20actually%20asserts%20a%20START%20condition%20onto%20the%20physical%20bus%20at%20all%2C%20despite%20software%20believing%20it%20did.%3C%2FP%3E%3CH2%20id%3D%22toc-hId-237169623%22%20id%3D%22toc-hId-237195507%22%3EEnvironment%3C%2FH2%3E%3CUL%3E%3CLI%3EBoard%3A%20LPCXpresso55S69-EVK%2C%20LPC55S69JBD100%3C%2FLI%3E%3CLI%3EIDE%3A%20MCUXpresso%20IDE%20v25.6%20%5BBuild%20136%5D%3C%2FLI%3E%3CLI%3EI2C%20peripheral%3A%20I2C4%20(Flexcomm%204)%2C%20pins%20P1_20%20(SCL)%20%2F%20P1_21%20(SDA)%3C%2FLI%3E%3CLI%3EThis%20is%20Core%201%20(non-secure%2C%20no%20TrustZone%20-%20confirmed%20this%20chip's%20Core%201%20has%20no%20TrustZone%20capability%20at%20all%20per%20AN12278)%20of%20a%20dual-core%20project.%20Core%201%20is%20confirmed%20booting%20and%20executing%20correctly%20(proven%20via%20a%20working%20LED%20heartbeat%20and%20independent%20shared-memory%20diagnostics)%20-%20this%20report%20is%20specifically%20about%20the%20I2C%20peripheral%2C%20not%20the%20multicore%20boot%20sequence.%3C%2FLI%3E%3CLI%3ESensor%3A%20Adafruit%20BME688%20(STEMMA%20QT%2C%20onboard%20pull-ups)%2C%20address%200x77%2C%20connected%20via%20genuine%20Adafruit%20STEMMA%20QT-to-header%20cable%3C%2FLI%3E%3C%2FUL%3E%3CH2%20id%3D%22toc-hId--1570284840%22%20id%3D%22toc-hId--1570258956%22%3EThe%20core%20evidence%3C%2FH2%3E%3CH3%20id%3D%22toc-hId--879723366%22%20id%3D%22toc-hId--879697482%22%3E1.%20The%20hang%20location%2C%20confirmed%20via%20SDK%20source%20inspection%3C%2FH3%3E%3CP%3EReading%20fsl_i2c.c%20directly%3A%20I2C_MasterTransferBlocking()%20calls%20I2C_MasterStart()%20then%20I2C_MasterCheckStartResponse().%20The%20latter%20calls%20I2C_PendingStatusWait()%2C%20which%20polls%20kI2C_MasterPendingFlag%20in%20a%20loop%20with%20no%20timeout%20at%20all%20when%20I2C_RETRY_TIMES%20is%200%2Fundefined%20(confirmed%20this%20is%20the%20active%20code%20path%20in%20this%20project%20-%20the%20%23else%20branch%20with%20an%20unconditional%20while(...)%20and%20no%20exit%20condition).%20Execution%20never%20returns%20from%20this%20call%2C%20confirmed%20by%20a%20shared-memory%20diagnostic%20checkpoint%20written%20immediately%20before%20the%20call%2C%20which%20is%20reached%2C%20and%20one%20written%20immediately%20after%2C%20which%20is%20never%20reached%2C%20even%20after%205%2B%20seconds%20of%20continuous%20execution.%3C%2FP%3E%3CH3%20id%3D%22toc-hId-1607789467%22%20id%3D%22toc-hId-1607815351%22%3E2.%20Register%20state%20at%20the%20moment%20of%20the%20hang%20(read%20live%20via%20debugger%2C%20not%20assumed)%3C%2FH3%3E%3CP%3ERegister%20Address%20Value%20Meaning%3C%2FP%3E%3CTABLE%3E%3CTBODY%3E%3CTR%3E%3CTD%3EI2C4-%26gt%3BSTAT%3C%2FTD%3E%3CTD%3E0x5008A000%3C%2FTD%3E%3CTD%3E0x00000000%3C%2FTD%3E%3CTD%3EIdle.%20MSTPENDING%3D0%2C%20MSTSTATE%3D0%2C%20no%20error%20flags%3C%2FTD%3E%3C%2FTR%3E%3CTR%3E%3CTD%3EI2C4-%26gt%3BCFG%3C%2FTD%3E%3CTD%3E0x5008A800%3C%2FTD%3E%3CTD%3E0x00000001%3C%2FTD%3E%3CTD%3EMSTEN%3D1%20-%20master%20mode%20enabled%3C%2FTD%3E%3C%2FTR%3E%3CTR%3E%3CTD%3EFLEXCOMM4-%26gt%3BPSELID%3C%2FTD%3E%3CTD%3E0x5008AFF8%3C%2FTD%3E%3CTD%3E0x1020F3%3C%2FTD%3E%3CTD%3EPERSEL%3D3%20(I2C%20personality%20genuinely%20selected)%2C%20I2CPRESENT%3D1%3C%2FTD%3E%3C%2FTR%3E%3CTR%3E%3CTD%3EI2C4-%26gt%3BCLKDIV%3C%2FTD%3E%3CTD%3E0x5008A814%3C%2FTD%3E%3CTD%3E74%3C%2FTD%3E%3CTD%3ENon-zero%2C%20plausible%20divider%3C%2FTD%3E%3C%2FTR%3E%3CTR%3E%3CTD%3EI2C4-%26gt%3BMSTTIME%3C%2FTD%3E%3CTD%3E0x5008A824%3C%2FTD%3E%3CTD%3E102%3C%2FTD%3E%3CTD%3ENon-zero%2C%20plausible%20SCL%20timing%3C%2FTD%3E%3C%2FTR%3E%3CTR%3E%3CTD%3EIOCON-%26gt%3BPIO%5B1%5D%5B20%5D%20(P1_20%2FSCL)%3C%2FTD%3E%3CTD%3E0x500010D0%3C%2FTD%3E%3CTD%3E0x323%3C%2FTD%3E%3CTD%3EFUNC%3D3%20(Flexcomm%20alt-function)%2C%20pull-up%20%2B%20open-drain%20enabled%3C%2FTD%3E%3C%2FTR%3E%3CTR%3E%3CTD%3EIOCON-%26gt%3BPIO%5B1%5D%5B21%5D%20(P1_21%2FSDA)%3C%2FTD%3E%3CTD%3E0x500010D4%3C%2FTD%3E%3CTD%3E0x323%3C%2FTD%3E%3CTD%3ESame%20-%20correctly%20configured%3C%2FTD%3E%3C%2FTR%3E%3CTR%3E%3CTD%3EAHB_SECURE_CTRL%20FLEXCOMM4_RULE%3C%2FTD%3E%3CTD%3E0x500AC124%3C%2FTD%3E%3CTD%3E0%3C%2FTD%3E%3CTD%3E0b00%20%3D%20%22Non-secure%20and%20Non-privilege%20user%20access%20allowed%22%20(most%20permissive)%3C%2FTD%3E%3C%2FTR%3E%3CTR%3E%3CTD%3EAHB_SECURE_CTRL%20IOCON_RULE%3C%2FTD%3E%3CTD%3E0x500AC130%3C%2FTD%3E%3CTD%3E0%3C%2FTD%3E%3CTD%3ESame%20-%20fully%20open%2C%20non-secure%20access%20unrestricted%3C%2FTD%3E%3C%2FTR%3E%3C%2FTBODY%3E%3C%2FTABLE%3E%3CP%3EEvery%20one%20of%20these%20is%20exactly%20what%20a%20correctly-configured%2C%20unrestricted%2C%20ready-to-transact%20I2C%20master%20should%20show.%3C%2FP%3E%3CH3%20id%3D%22toc-hId--199664996%22%20id%3D%22toc-hId--199639112%22%3E3.%20Physical%20measurement%20(the%20decisive%20evidence)%3C%2FH3%3E%3CP%3EWith%20execution%20frozen%20mid-hang%20(confirmed%20via%20the%20checkpoint%20diagnostic%2C%20STAT%20still%20reading%200x00000000%20at%20this%20exact%20moment)%3A%3C%2FP%3E%3CUL%3E%3CLI%3ESDA%20to%20GND%3A%203.299%20V%3C%2FLI%3E%3CLI%3ESCL%20to%20GND%3A%203.299%20V%3C%2FLI%3E%3C%2FUL%3E%3CP%3EBoth%20lines%20are%20indistinguishable%20from%20a%20fully%20idle%2C%20untouched%20bus.%20The%20physical%20pins%20never%20moved%20at%20all%2C%20despite%20I2C_MasterStart()%20having%20already%20executed%20(it's%20called%20before%20I2C_MasterCheckStartResponse()%2C%20where%20we're%20actually%20hung)%20and%20despite%20every%20register%20above%20showing%20a%20fully%20configured%2C%20unrestricted%20master.%3C%2FP%3E%3CH2%20id%3D%22toc-hId--210168100%22%20id%3D%22toc-hId--210142216%22%3EWhat%20has%20been%20ruled%20out%3C%2FH2%3E%3CUL%3E%3CLI%3ESensor%2Fcable%2Fbreadboard%20fault%20-%20wiring%20continuity%20confirmed%20with%20a%20multimeter%20across%20multiple%20different%20physical%20wire%20positions%20(5%2B%20attempts)%3B%20genuine%20Adafruit%20STEMMA%20QT%20cable%3B%20sensor%20address%20pad%20confirmed%20consistent%20with%20the%20documented%200x77%20default%3B%20identical%20result%20reproduces%20regardless%20of%20which%20physical%20header%20pins%20are%20used%3C%2FLI%3E%3CLI%3EClock%20source%2Ffrequency%20-%20explicitly%20re-asserted%20CLOCK_SetupFROClocking(12000000U)%20immediately%20before%20attaching%20Flexcomm4's%20clock%3B%20no%20change%3C%2FLI%3E%3CLI%3EBaud%20rate%2Ftiming%20miscalculation%20-%20reduced%20from%20100%20kHz%20to%2010%20kHz%20(10x)%3B%20identical%20hang%3B%20CLKDIV%2FMSTTIME%20both%20confirmed%20non-zero%20and%20plausible%3C%2FLI%3E%3CLI%3EPin%20mux%20-%20confirmed%20via%20IOCON_FUNC3%20write%20and%20independently%20re-verified%20via%20direct%20register%20read%20at%20the%20exact%20moment%20of%20the%20hang%3C%2FLI%3E%3CLI%3EI2C%20personality%20selection%20-%20confirmed%20via%20PSELID%3C%2FLI%3E%3CLI%3ESensor%20driver%20library%20-%20bypassed%20bme68x.c%20entirely%3B%20a%20raw%2C%20minimal%20zero-length%20address%20probe%20built%20directly%20with%20the%20SDK's%20i2c_master_transfer_t%20struct%20produces%20the%20identical%20hang%3C%2FLI%3E%3CLI%3EMasterEnable%20off%2Fon%20toggle%20workaround%20(from%20a%20similar-sounding%20NXP%20community%20report%20for%20a%20different%20part)%20-%20no%20effect%3C%2FLI%3E%3CLI%3ETrustZone%2FSecure%20AHB%20Controller%20peripheral%20access%20restriction%20-%20confirmed%20both%20IOCON%20and%20FLEXCOMM4%20are%20set%20to%20the%20most%20permissive%20non-secure%20access%20rule%3C%2FLI%3E%3C%2FUL%3E%3CH2%20id%3D%22toc-hId--2017622563%22%20id%3D%22toc-hId--2017596679%22%3EQuestion%3C%2FH2%3E%3CP%3EGiven%20every%20software-visible%20register%20indicates%20a%20correctly%20configured%2C%20unrestricted%20I2C%20master%2C%20but%20the%20physical%20SDA%2FSCL%20pins%20provably%20never%20move%20(confirmed%20by%20direct%20voltage%20measurement%20while%20frozen%20inside%20the%20driver%20call)%2C%20what%20remaining%20hardware-level%20step%20is%20required%20to%20get%20the%20I2C4%20peripheral%20to%20actually%20drive%20its%20pads%20on%20this%20part%3F%3C%2FP%3E%3CP%3ESpecifically%3A%3C%2FP%3E%3CUL%3E%3CLI%3EIs%20there%20a%20known%20LPC55S69%20errata%20affecting%20Flexcomm%20I2C%20pad%20drive%20that%20isn't%20captured%20by%20the%20CFG%2FPSELID%2FIOCON%20registers%20I've%20checked%3F%3C%2FLI%3E%3CLI%3EIs%20there%20an%20additional%20power-domain%2C%20pad-supply%2C%20or%20analog%20block%20that%20needs%20to%20be%20explicitly%20enabled%20for%20Flexcomm%20I2C%20physical%20output%20(something%20outside%20the%20digital%20peripheral%20configuration%20registers)%20that%20I%20may%20have%20missed%3F%3C%2FLI%3E%3CLI%3EGiven%20this%20is%20Core%201%20(bare-metal%2C%20no%20RTOS%2C%20no%20TrustZone)%20in%20a%20dual-core%20multicore%20project%20where%20Core%200%20runs%20FreeRTOS%20-%20is%20there%20any%20known%20interaction%20between%20Core%200's%20own%20boot-time%20configuration%20and%20Core%201's%20ability%20to%20drive%20Flexcomm4's%20physical%20pads%2C%20beyond%20what%20a%20register-level%20snapshot%20would%20reveal%20(e.g.%2C%20something%20in%20SYSCON%20clock-gating%20for%20the%20pad%20IO%20cell%20itself%2C%20distinct%20from%20CLOCK_AttachClk's%20peripheral%20function%20clock)%3F%3C%2FLI%3E%3C%2FUL%3E%3CP%3EHappy%20to%20provide%20the%20full%20project%2C%20a%20logic%20analyzer%20capture%2C%20or%20any%20additional%20register%20dump%20on%20request.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-2406827%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CLINGO-LABEL%3ELPC55xx%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2407082%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20LPC55S69%3A%20I2C%20registers%20all%20correct%2C%20but%20SDA%2FSCL%20never%20physically%20move%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2407082%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CH2%20id%3D%22toc-hId--442866463%22%20id%3D%22toc-hId-469916154%22%3EResolved%20-%20root%20cause%20was%20an%20incorrect%20IOCON%20alternate%20function%20number%3C%2FH2%3E%3CP%3EPosting%20the%20resolution%20in%20case%20anyone%20finds%20this%20thread%20later%20with%20a%20similar%20symptom.%3C%2FP%3E%3CH3%20id%3D%22toc-hId-247695011%22%20id%3D%22toc-hId-465314149%22%3EThe%20actual%20root%20cause%3C%2FH3%3E%3CP%3E%3CSTRONG%3EIOCON_PIO_FUNC3%20does%20not%20route%20P1_20%2FP1_21%20to%20FC4%20I2C%20on%20this%20board.%3C%2FSTRONG%3E%20The%20correct%20alternate%20function%20is%20%3CSTRONG%3EFUNC5%3C%2FSTRONG%3E%2C%20with%20open-drain%20%3CSTRONG%3Edisabled%3C%2FSTRONG%3E%20at%20the%20IOCON%20level%20(the%20I2C%20peripheral's%20own%20CFG%20register%20handles%20open-drain%20behavior%20internally%20-%20enabling%20it%20again%20at%20the%20IOCON%20pad%20level%20was%20also%20wrong).%3C%2FP%3E%3CP%3EI%20had%20derived%20FUNC3%20by%20reading%20the%20pin_signal%20ordering%20in%20a%20comment%20(PIO1_20%2FFC7_RTS_SCL_SSEL1%2FCT_INP14%2FFC4_TXD_SCL_MISO_WS%2FPLU_OUT2)%20and%20assuming%200-indexed%20position%20%3D%20function%20number.%20That%20assumption%20was%20incorrect%20for%20this%20pin.%3C%2FP%3E%3CH3%20id%3D%22toc-hId--1559759452%22%20id%3D%22toc-hId--1342140314%22%3EWhy%20this%20produced%20such%20a%20confusing%20symptom%3C%2FH3%3E%3CP%3EWith%20the%20wrong%20alternate%20function%20selected%2C%20every%20I2C-internal%20register%20still%20read%20back%20as%20perfectly%20configured%3A%3C%2FP%3E%3CUL%3E%3CLI%3EI2C4-%26gt%3BCFG.MSTEN%20%3D%201%20(master%20enabled)%3C%2FLI%3E%3CLI%3EFLEXCOMM4-%26gt%3BPSELID%20showed%20I2C%20personality%20genuinely%20selected%3C%2FLI%3E%3CLI%3ECLKDIV%2FMSTTIME%20were%20valid%2C%20non-zero%3C%2FLI%3E%3CLI%3EEven%20IOCON-%26gt%3BPIO%5B1%5D%5B20%2F21%5D%20showed%20%3CEM%3Ea%3C%2FEM%3E%20function%20selected%20(just%20the%20wrong%20one)%20-%20nothing%20about%20this%20register's%20value%20alone%20signals%20%22wrong%20function%2C%22%20only%20%22some%20function%20is%20selected%22%3C%2FLI%3E%3C%2FUL%3E%3CP%3ENone%20of%20that%20depends%20on%20the%20physical%20pin%20actually%20being%20connected%20to%20the%20I2C%20block%20-%20PSELID%20and%20CFG%20are%20entirely%20internal%20to%20the%20Flexcomm%2FI2C%20logic%2C%20independent%20of%20which%20alternate%20function%20the%20IOCON%20mux%20happens%20to%20route%20to.%20So%20the%20peripheral%20was%20internally%20fully%20configured%20and%20%22ready%2C%22%20while%20the%20physical%20SDA%2FSCL%20pins%20were%20never%20actually%20wired%20to%20it%20at%20all.%20This%20produced%20a%20permanent%20hang%20in%20I2C_MasterTransferBlocking()%20(confirmed%20via%20SDK%20source%3A%20no%20timeout%20when%20I2C_RETRY_TIMES%20is%200)%20with%20zero%20error%20flags%20ever%20raised%2C%20and%20-%20the%20piece%20that%20finally%20proved%20it%20-%20a%20multimeter%20measurement%20showing%20the%20physical%20bus%20completely%20unchanged%20at%20idle%20voltage%20even%20while%20frozen%20mid-transaction%2C%20since%20the%20pins%20genuinely%20were%20never%20driven.%3C%2FP%3E%3CH3%20id%3D%22toc-hId-927753381%22%20id%3D%22toc-hId-1145372519%22%3EHow%20it%20was%20found%3C%2FH3%3E%3CP%3ECreated%20a%20fresh%2C%20separate%20single-core%20test%20project%20for%20the%20same%20board%20and%20used%20the%20MCUXpresso%20wizard's%20own%20auto-generated%20BOARD_InitACCELPins()%20function%20(this%20board%20has%20an%20onboard%20accelerometer%20wired%20to%20the%20same%20I2C4%20bus%2C%20so%20the%20wizard%20ships%20a%20working%2C%20verified%20pin%20mux%20for%20these%20exact%20pins).%20Reading%20that%20function's%20actual%20generated%20source%20showed%20IOCON_PIO_FUNC5%20with%20open-drain%20disabled%20-%20directly%20contradicting%20my%20own%20hand-derived%20FUNC3%2Fopen-drain-enabled%20configuration.%20Switching%20to%20match%20NXP's%20own%20verified%20values%20immediately%20resolved%20the%20permanent%20hang%3B%20a%20subsequent%2C%20unrelated%20address-NAK%20(0x77%20not%20acknowledging)%20turned%20out%20to%20just%20be%20a%20loose%20header-pin%20contact%2C%20resolved%20by%20moving%20the%20connection%20to%20different%20header%20pins.%3C%2FP%3E%3CH3%20id%3D%22toc-hId--879701082%22%20id%3D%22toc-hId--662081944%22%3ELesson%20for%20anyone%20else%20hitting%20an%20identical%20symptom%3C%2FH3%3E%3CP%3EIf%20a%20Flexcomm%20peripheral's%20own%20registers%20(PSELID%2C%20CFG%2C%20CLKDIV%2C%20etc.)%20all%20read%20back%20as%20correctly%20configured%20but%20the%20physical%20bus%20never%20shows%20any%20activity%20(confirmed%20via%20multimeter%2Fscope)%20-%20don't%20trust%20a%20hand-derived%20alternate%20function%20number%20from%20reading%20the%20pin_signal%20comment%20ordering.%20Cross-check%20against%20any%20wizard-auto-generated%20pin%20mux%20function%20this%20SDK%20ships%20for%20the%20same%20physical%20pins%20on%20the%20same%20board%20(peripherals%20the%20eval%20board%20itself%20uses%20-%20accelerometers%2C%20codecs%2C%20etc.%20-%20are%20a%20good%20source%20of%20a%20genuinely%20verified%20reference)%2C%20or%20regenerate%20the%20pin%20mux%20via%20the%20MCUXpresso%20Pins%20tool%20directly%20rather%20than%20hand-writing%20IOCON_PinMuxSet()%20calls%20from%20an%20assumed%20function%20index.%3C%2FP%3E%3CP%3EThanks%20again%20to%20everyone%20who%20engaged%20with%20the%20earlier%20posts%20in%20this%20thread%20and%20the%20original%20multicore%20boot%20thread%20-%20the%20register-level%20verification%20work%20across%20both%20investigations%20is%20what%20eventually%20made%20this%20contradiction%20(everything%20configured%20correctly%2C%20yet%20nothing%20on%20the%20bus)%20visible%20enough%20to%20chase%20down.%3C%2FP%3E%3C%2FLINGO-BODY%3E