<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: LPC55S69: I2C registers all correct, but SDA/SCL never physically move in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55S69-I2C-registers-all-correct-but-SDA-SCL-never-physically/m-p/2407082#M59749</link>
    <description>&lt;H2&gt;Resolved - root cause was an incorrect IOCON alternate function number&lt;/H2&gt;&lt;P&gt;Posting the resolution in case anyone finds this thread later with a similar symptom.&lt;/P&gt;&lt;H3&gt;The actual root cause&lt;/H3&gt;&lt;P&gt;&lt;STRONG&gt;IOCON_PIO_FUNC3 does not route P1_20/P1_21 to FC4 I2C on this board.&lt;/STRONG&gt; The correct alternate function is &lt;STRONG&gt;FUNC5&lt;/STRONG&gt;, with open-drain &lt;STRONG&gt;disabled&lt;/STRONG&gt; 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).&lt;/P&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H3&gt;Why this produced such a confusing symptom&lt;/H3&gt;&lt;P&gt;With the wrong alternate function selected, every I2C-internal register still read back as perfectly configured:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;I2C4-&amp;gt;CFG.MSTEN = 1 (master enabled)&lt;/LI&gt;&lt;LI&gt;FLEXCOMM4-&amp;gt;PSELID showed I2C personality genuinely selected&lt;/LI&gt;&lt;LI&gt;CLKDIV/MSTTIME were valid, non-zero&lt;/LI&gt;&lt;LI&gt;Even IOCON-&amp;gt;PIO[1][20/21] showed &lt;EM&gt;a&lt;/EM&gt; function selected (just the wrong one) - nothing about this register's value alone signals "wrong function," only "some function is selected"&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H3&gt;How it was found&lt;/H3&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H3&gt;Lesson for anyone else hitting an identical symptom&lt;/H3&gt;&lt;P&gt;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.&lt;/P&gt;&lt;P&gt;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.&lt;/P&gt;</description>
    <pubDate>Thu, 20 Aug 2026 17:20:37 GMT</pubDate>
    <dc:creator>ryan714</dc:creator>
    <dc:date>2026-08-20T17:20:37Z</dc:date>
    <item>
      <title>LPC55S69: I2C registers all correct, but SDA/SCL never physically move</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55S69-I2C-registers-all-correct-but-SDA-SCL-never-physically/m-p/2406827#M59747</link>
      <description>&lt;H1&gt;LPC55S69: I2C4 (Flexcomm 4) master never physically drives SDA/SCL despite fully correct register configuration - I2C_MasterStart() hangs permanently in I2C_MasterCheckStartResponse()&lt;/H1&gt;&lt;H2&gt;Summary&lt;/H2&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H2&gt;Environment&lt;/H2&gt;&lt;UL&gt;&lt;LI&gt;Board: LPCXpresso55S69-EVK, LPC55S69JBD100&lt;/LI&gt;&lt;LI&gt;IDE: MCUXpresso IDE v25.6 [Build 136]&lt;/LI&gt;&lt;LI&gt;I2C peripheral: I2C4 (Flexcomm 4), pins P1_20 (SCL) / P1_21 (SDA)&lt;/LI&gt;&lt;LI&gt;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.&lt;/LI&gt;&lt;LI&gt;Sensor: Adafruit BME688 (STEMMA QT, onboard pull-ups), address 0x77, connected via genuine Adafruit STEMMA QT-to-header cable&lt;/LI&gt;&lt;/UL&gt;&lt;H2&gt;The core evidence&lt;/H2&gt;&lt;H3&gt;1. The hang location, confirmed via SDK source inspection&lt;/H3&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H3&gt;2. Register state at the moment of the hang (read live via debugger, not assumed)&lt;/H3&gt;&lt;P&gt;Register Address Value Meaning&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;I2C4-&amp;gt;STAT&lt;/TD&gt;&lt;TD&gt;0x5008A000&lt;/TD&gt;&lt;TD&gt;0x00000000&lt;/TD&gt;&lt;TD&gt;Idle. MSTPENDING=0, MSTSTATE=0, no error flags&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;I2C4-&amp;gt;CFG&lt;/TD&gt;&lt;TD&gt;0x5008A800&lt;/TD&gt;&lt;TD&gt;0x00000001&lt;/TD&gt;&lt;TD&gt;MSTEN=1 - master mode enabled&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;FLEXCOMM4-&amp;gt;PSELID&lt;/TD&gt;&lt;TD&gt;0x5008AFF8&lt;/TD&gt;&lt;TD&gt;0x1020F3&lt;/TD&gt;&lt;TD&gt;PERSEL=3 (I2C personality genuinely selected), I2CPRESENT=1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;I2C4-&amp;gt;CLKDIV&lt;/TD&gt;&lt;TD&gt;0x5008A814&lt;/TD&gt;&lt;TD&gt;74&lt;/TD&gt;&lt;TD&gt;Non-zero, plausible divider&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;I2C4-&amp;gt;MSTTIME&lt;/TD&gt;&lt;TD&gt;0x5008A824&lt;/TD&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;Non-zero, plausible SCL timing&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;IOCON-&amp;gt;PIO[1][20] (P1_20/SCL)&lt;/TD&gt;&lt;TD&gt;0x500010D0&lt;/TD&gt;&lt;TD&gt;0x323&lt;/TD&gt;&lt;TD&gt;FUNC=3 (Flexcomm alt-function), pull-up + open-drain enabled&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;IOCON-&amp;gt;PIO[1][21] (P1_21/SDA)&lt;/TD&gt;&lt;TD&gt;0x500010D4&lt;/TD&gt;&lt;TD&gt;0x323&lt;/TD&gt;&lt;TD&gt;Same - correctly configured&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;AHB_SECURE_CTRL FLEXCOMM4_RULE&lt;/TD&gt;&lt;TD&gt;0x500AC124&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;0b00 = "Non-secure and Non-privilege user access allowed" (most permissive)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;AHB_SECURE_CTRL IOCON_RULE&lt;/TD&gt;&lt;TD&gt;0x500AC130&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;Same - fully open, non-secure access unrestricted&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;Every one of these is exactly what a correctly-configured, unrestricted, ready-to-transact I2C master should show.&lt;/P&gt;&lt;H3&gt;3. Physical measurement (the decisive evidence)&lt;/H3&gt;&lt;P&gt;With execution frozen mid-hang (confirmed via the checkpoint diagnostic, STAT still reading 0x00000000 at this exact moment):&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;SDA to GND: 3.299 V&lt;/LI&gt;&lt;LI&gt;SCL to GND: 3.299 V&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H2&gt;What has been ruled out&lt;/H2&gt;&lt;UL&gt;&lt;LI&gt;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&lt;/LI&gt;&lt;LI&gt;Clock source/frequency - explicitly re-asserted CLOCK_SetupFROClocking(12000000U) immediately before attaching Flexcomm4's clock; no change&lt;/LI&gt;&lt;LI&gt;Baud rate/timing miscalculation - reduced from 100 kHz to 10 kHz (10x); identical hang; CLKDIV/MSTTIME both confirmed non-zero and plausible&lt;/LI&gt;&lt;LI&gt;Pin mux - confirmed via IOCON_FUNC3 write and independently re-verified via direct register read at the exact moment of the hang&lt;/LI&gt;&lt;LI&gt;I2C personality selection - confirmed via PSELID&lt;/LI&gt;&lt;LI&gt;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&lt;/LI&gt;&lt;LI&gt;MasterEnable off/on toggle workaround (from a similar-sounding NXP community report for a different part) - no effect&lt;/LI&gt;&lt;LI&gt;TrustZone/Secure AHB Controller peripheral access restriction - confirmed both IOCON and FLEXCOMM4 are set to the most permissive non-secure access rule&lt;/LI&gt;&lt;/UL&gt;&lt;H2&gt;Question&lt;/H2&gt;&lt;P&gt;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?&lt;/P&gt;&lt;P&gt;Specifically:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Is there a known LPC55S69 errata affecting Flexcomm I2C pad drive that isn't captured by the CFG/PSELID/IOCON registers I've checked?&lt;/LI&gt;&lt;LI&gt;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?&lt;/LI&gt;&lt;LI&gt;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)?&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Happy to provide the full project, a logic analyzer capture, or any additional register dump on request.&lt;/P&gt;</description>
      <pubDate>Thu, 20 Aug 2026 07:21:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55S69-I2C-registers-all-correct-but-SDA-SCL-never-physically/m-p/2406827#M59747</guid>
      <dc:creator>ryan714</dc:creator>
      <dc:date>2026-08-20T07:21:14Z</dc:date>
    </item>
    <item>
      <title>Re: LPC55S69: I2C registers all correct, but SDA/SCL never physically move</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55S69-I2C-registers-all-correct-but-SDA-SCL-never-physically/m-p/2407082#M59749</link>
      <description>&lt;H2&gt;Resolved - root cause was an incorrect IOCON alternate function number&lt;/H2&gt;&lt;P&gt;Posting the resolution in case anyone finds this thread later with a similar symptom.&lt;/P&gt;&lt;H3&gt;The actual root cause&lt;/H3&gt;&lt;P&gt;&lt;STRONG&gt;IOCON_PIO_FUNC3 does not route P1_20/P1_21 to FC4 I2C on this board.&lt;/STRONG&gt; The correct alternate function is &lt;STRONG&gt;FUNC5&lt;/STRONG&gt;, with open-drain &lt;STRONG&gt;disabled&lt;/STRONG&gt; 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).&lt;/P&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H3&gt;Why this produced such a confusing symptom&lt;/H3&gt;&lt;P&gt;With the wrong alternate function selected, every I2C-internal register still read back as perfectly configured:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;I2C4-&amp;gt;CFG.MSTEN = 1 (master enabled)&lt;/LI&gt;&lt;LI&gt;FLEXCOMM4-&amp;gt;PSELID showed I2C personality genuinely selected&lt;/LI&gt;&lt;LI&gt;CLKDIV/MSTTIME were valid, non-zero&lt;/LI&gt;&lt;LI&gt;Even IOCON-&amp;gt;PIO[1][20/21] showed &lt;EM&gt;a&lt;/EM&gt; function selected (just the wrong one) - nothing about this register's value alone signals "wrong function," only "some function is selected"&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H3&gt;How it was found&lt;/H3&gt;&lt;P&gt;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.&lt;/P&gt;&lt;H3&gt;Lesson for anyone else hitting an identical symptom&lt;/H3&gt;&lt;P&gt;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.&lt;/P&gt;&lt;P&gt;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.&lt;/P&gt;</description>
      <pubDate>Thu, 20 Aug 2026 17:20:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55S69-I2C-registers-all-correct-but-SDA-SCL-never-physically/m-p/2407082#M59749</guid>
      <dc:creator>ryan714</dc:creator>
      <dc:date>2026-08-20T17:20:37Z</dc:date>
    </item>
  </channel>
</rss>

