Board: FRDM-MCXN236 (MCX N236, dual Cortex-M33)
Toolchain: MCUXpresso IDE 25.6.136, bare-metal register-level C (no SDK peripheral drivers)
RM reference: MCX N23x Reference Manual Rev. 4, 2025-03-05, Chapter 53 (FlexIO), Table 453 (SPI controller, CPHA=0 configuration)
What I am building:
FlexIO0 configured as an SPI controller per RM Table 453: 2 shifters (shifter0 = TX, shifter1 = RX) + 1 timer (timer0 = SCK, dual 8-bit counter baud mode), reading a BME280 sensor over SPI. Pins: P1_0/P1_1/P1_2 muxed to ALT6 (FLEXIO0_D8/D9/D10), confirmed correct via PORT1->PCR readback.
Observation:
The RX shifter and the SCK timer output both work perfectly — SCK toggles cleanly and on-schedule (confirmed via two independent registers, see below), and SHIFTSTAT/TIMSTAT report normal, on-time, error-free completion of every transfer. But the TX shifter's own output pin (SDO, D8) never shows any electrical movement whatsoever, regardless of what's written to it, under every variation I've been able to think of. The chip-ID register read back from the sensor is always 0x00, never the expected 0x60 (which a separate, working FlexComm/LPSPI3 driver on the same board, same sensor, same boot, reads correctly).
Register configuration (matches RM Table 453 exactly, PINSEL substituted for real pins)
SHIFTCFG0 = 0x0000_0000 (RM: 0000_0000h -- start/stop bit disabled)
SHIFTCTL0 = 0x0083_0002 (RM: 0083_0002h, PINSEL=8 for our real D8/SDO)
decodes to: TIMSEL=0, TIMPOL=1(neg edge), PINCFG=3(11b, driven output),
PINSEL=8, PINPOL=0, SMOD=2(Transmit) -- every field verified against RM's
literal example, only PINSEL substituted
SHIFTCFG1 = 0x0000_0000
SHIFTCTL1 = 0x0000_0101 (RM: 0000_0101h, PINSEL=10 for our real D10/SDI)
TIMCMP0 = derived per RM's own formula (8-bit frames, baud divider for 1MHz SCK)
TIMCFG0 = 0x0100_2222 (RM literal value, no pin substitution needed)
TIMCTL0 = 0x01C3_0201 (RM: 01C3_0201h, PINSEL=9 for our real D9/SCK)
What I've ruled out, each via direct hardware evidence (debugger register/memory inspection, no oscilloscope available):
I also checked the one published mask-set errata document for this part (MCXN23x_0P21K Rev. 2.0) -- no FlexIO-related entries at all -- and NXP's own FlexIO-SPI application note (AN12780), which adds no guidance beyond what RM Table 453 already documents.
Question:
Given the shifter's internal bookkeeping (SHIFTSTAT, SHIFTERR, TIMSTAT) reports completely normal, on-schedule, error-free Transmit-mode operation on every test — including the TX-ready flag correctly clearing and re-setting across multiple transfers within the same CS-bracketed transaction, which per RM 53.3.1 should only happen on a genuine timer-triggered reload — and the shift clock itself (same PINCFG=11b "driven output" mechanism, just via TIMCTL instead of SHIFTCTL) is independently proven to reach its physical pin correctly:
Is there a known silicon behavior, an undocumented prerequisite, or an RM gap that would prevent a shifter's SHIFTCTL.PINCFG=11b Transmit-mode output specifically (as opposed to a timer's identical PINCFG=11b output) from reaching its assigned pin, on the MCXN23x mask set, even though every register-level configuration matches RM Table 453's own worked example exactly?
Happy to share the full register-level project source and a complete, append-only investigation log (every hypothesis tried, every retraction, with exact hardware evidence for each) if useful.