← AXS-035

Circuit review & bench-test guide

AXS-035 — MAX31855K thermocouple front end PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axs-035-max31855 prototype at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the generated schematic (generate_design.py, rev 0.1-schematic), the project README, and the MAX31855 datasheet.

The board is a design-stage prototype: the schematic is generated and ERC is clean (0/0), but no PCB layout exists and no first article has been fabricated or assembled. Every value below is a design target to verify on real hardware, not proof that an assembled board works or meets the datasheet accuracy numbers.

1. What the board does#

A 12-pin PMOD module that reads a type-K thermocouple through the Analog Devices (Maxim) MAX31855KASA+ cold-junction-compensated thermocouple-to-digital converter. The host sees the simplest possible SPI device: read-only, no MOSI. Dropping ~CS and clocking 32 bits returns a fixed frame containing the 14-bit compensated thermocouple temperature, a 12-bit cold-junction (die) temperature, and three fault bits (short-to-VCC, short-to-GND, open circuit).

It does not provide isolation, input over-voltage protection beyond the IC's own ratings, or any linearization beyond the MAX31855's straight-line approximation of the K-type curve.

Functional block diagram#

Type-K thermocouple ──> J2 screw terminal
                          │ TC_P / TC_M
                          ├── C2 10 nF differential filter
                          v
                    U1 MAX31855KASA+        C1 100 nF on 3V3
                    cold-junction comp,
                    14-bit ADC, faults
                          │ SO ── R1 100 Ω ──> PMOD 3 (MISO)
                          │ SCK <───────────── PMOD 4
                          │ ~CS <── R2 10 kΩ pull-up ── PMOD 1
                          v
                    J1 PMOD plug (3V3 / GND from host)

2. Safety and scope boundaries#

3. Power and signal sequence#

  1. The host PMOD connector supplies 3V3 and GND (pins 6/12 and 5/11). C1 provides local decoupling at U1 VCC.
  2. At power-on, U1's internal power-on reset runs (V_POR 2.0 V typ, 2.5 V max). Conversions begin automatically; no configuration exists or is needed. The datasheet requires waiting t_CONV_PU >= 200 ms after VCC is valid before trusting the first conversion.
  3. Conversions run continuously in the background every t_CONV (70 ms typ, 100 ms max), converting the cold junction, the thermocouple, and running fault detection.
  4. R2 pulls ~CS to 3V3 so SO stays released (high impedance) until the host drives ~CS low. While ~CS is low the output data is frozen; results update only while ~CS is high.
  5. The host drops ~CS and issues 32 SCK cycles; U1 shifts the frame out on SO through R1 into PMOD pin 3 (MISO). D31 appears within t_DV (100 ns max) of the ~CS falling edge; each later bit is valid within t_DO (40 ns max) of the SCK falling edge, so the host samples on the SCK rising edge (SPI mode 0, CPOL=0/CPHA=0-compatible).

4. Interfaces and pin maps#

J1 PMOD plug (Type 2 SPI footprint, MOSI unused)#

PMOD pin123456789101112
NetCS_NNC (no MOSI)MISOSCKGND3V3NCNCNCNCGND3V3

J2 thermocouple terminal (Phoenix MKDS 1,5/2-5,08 footprint)#

J2 pinNetThermocouple wire (type K)
1TC_PT+ = Chromel; yellow in the US ANSI color code
2TC_MT- = Alumel; red in the US ANSI color code

Caution: ANSI type-K color coding uses red for the negative lead, which is the opposite of most electrical intuition, and IEC-color thermocouples use green/white instead. Do not trust color alone; the polarity test in section 9.C is the authoritative check.

Usage contexts covered by this plan#

ContextPowerSPI master
(a) PMOD hostULX3S-class ECP5 FPGA board, 3.3 V PMODFPGA SPI/bit-bang HDL
(b) StandaloneBench supply set to 3.30 V, current limit 20 mALab MCU (e.g. RP2040/STM32 at 3.3 V) or USB SPI adapter

Both contexts are electrically identical to the module; the difference is who provides 3V3 and who drives SCK/~CS. In context (b), common the bench supply GND with the MCU/adapter GND at the module.

5. Component-by-component review#

This is the complete reference-designator list from generate_design.py: U1, J1, J2, C1, C2, R1, R2 (plus ERC-only power flags #FLG01/#FLG02, which are schematic artifacts, not physical parts).

Ref.Part / valueWhat it is and its roleWhy it is neededIf absent, open, or wrong
U1MAX31855KASA+, SOIC-8Cold-junction-compensated K-type thermocouple-to-digital converter; 14-bit, 0.25 C/LSB, read-only SPIThe entire measurement function: amplification of the ~41 uV/C signal, cold-junction correction, ADC, fault detectionNo function. A J/N/T/S/R/E-suffix variant would apply the wrong sensitivity (e.g. J = 57.953 uV/C vs K = 41.276 uV/C) and read plausibly but wrongly; reversed placement destroys the part
J112-pin PMOD plugHost interface: power, GND, ~CS, SCK, MISOMechanical/electrical standard connection to the FPGA hostNo power/communication; a rotated or offset plug can put 3V3 on signal pins
J2Phoenix MKDS 1,5/2 screw terminal, 5.08 mmField connection for the thermocouple pairScrew clamping accepts bare thermocouple wire without soldering (solder would add junctions and flux)No sensor input; loose clamping gives intermittent open faults; swapped wires give inverted readings (section 9.C)
C1100 nF 16 V X7R (Murata GRM188R71C104KA01D)U1 supply decoupling on 3V3Datasheet noise guidance: 0.1 uF ceramic close to VCC and GND to suppress power-supply-coupled noise on a uV-level measurementNoisier readings, susceptibility to host supply hash; the part still functions, which makes the omission easy to miss
C210 nF 50 V C0G (Murata GRM1885C1H103JA01D)Differential filter directly across TC_P/TC_MDatasheet rev 2 explicitly added this recommendation: a 10 nF SMT ceramic across T+/T- to filter noise picked up by the thermocouple leadsReadings become sensitive to EMI on the (antenna-like) thermocouple wires; jumpy LSBs. A leaky/wrong dielectric could add bias-current error paths
R1100 R 0603 (Yageo RC0603FR-07100RL)Series resistor between U1 SO and PMOD MISOProtects the sensor-driven line: limits current on host/module contention or hot-plug, damps reflectionsDirect pin-to-pin contention current if host misconfigures MISO as output; a grossly larger value plus bus capacitance would slow edges at high SCK
R210 k 0603 (Yageo RC0603FR-0710KL)Pull-up from CS_N to 3V3Keeps ~CS deasserted (SO released, conversions updating) while the host is unconfigured, in reset, or absent~CS can float: SO may drive the bus unexpectedly, conversion results freeze (they only update while ~CS is high), and shared-bus setups break
#FLG01, #FLG02Power flags (3V3, GND)ERC bookkeeping symbols onlySatisfy KiCad ERC power-driven checksNot physical; must never appear in a BOM or placement file

Cold-junction placement and thermal gradient review (layout-stage, open)#

The MAX31855 measures its own die temperature as the cold junction, so the accuracy budget assumes J2's screw contacts and U1's die are at the same temperature. The schematic already carries the layout note; since layout has not started, these are open review items:

6. Datasheet summary and design interpretation#

Source consulted: MAX31855 datasheet, Maxim Integrated document 19-5793 Rev 2, 2/12 — canonical copy at analog.com (product page: MAX31855 | Analog Devices); the identical Rev 2 PDF actually fetched and read for this review is the Adafruit-hosted mirror. Check for a newer revision before release.

Datasheet fact (Rev 2)ValueBoard interpretation
Supply, recommended / abs max3.0-3.6 V / 4.0 V3.3 V PMOD rail fits; not 5 V tolerant
Supply current I_CC900 uA typ, 1500 uA maxNegligible PMOD load; bench current sanity check value
K-type accuracy (TC -200..+700 C, T_A -20..+85 C)+/-2 CGoverns the ice/boiling checks in section 9.D
K-type accuracy (TC +700..+1350 C)+/-4 CFor flame/oven experiments
Thermocouple resolution14-bit, 0.25 C/LSB, sign + 13 bitsBits D[31:18]
Internal (cold-junction) sensor12-bit, 0.0625 C/LSB; +/-2 C error (T_A -20..+85 C)Bits D[15:4]; sanity reference at room temperature
Conversion time t_CONV70 ms typ, 100 ms maxPoll no faster than ~10 Hz for fresh data
Power-up first-valid t_CONV_PU>= 200 msFirmware must wait after power-on
Max SCK frequency f_SCL5 MHzHard host-side clock limit; verified against Rev 2 timing table
SCK high/low width>= 100 ns eachConsistent with 5 MHz at 50% duty
~CS fall to SO enable t_DV<= 100 nsFirst bit D31 valid shortly after ~CS drops
SCK fall to data valid t_DO<= 40 nsData changes on SCK falling edge; sample on rising = mode 0
~CS inactive time>= 200 nsMinimum gap between reads
Fault bitsD16 summary; D2 SCV, D1 SCG, D0 OCSection 9.E open-circuit test
Thermocouple input bias+/-100 nAWhy a low-leakage C0G filter cap (C2) is appropriate
Noise guidance0.1 uF at VCC; 10 nF differential across T+/T-Matches C1 and C2 exactly
K sensitivity41.276 uV/C (0-1000 C); linear model onlyExpect residual K-curve nonlinearity error; MAX31855 does not linearize
ESD+/-2 kV HBM, all pinsHandling and field-wiring caution

7. SPI details and first-transaction bring-up#

Configuration: read-only, SPI mode 0 compatible (CPOL=0, CPHA=0), MSB first, SCK <= 5 MHz. Start bring-up at 500 kHz-1 MHz. There is no MOSI and no command byte; the transaction is:

  1. ~CS high, SCK idle low, wait >= 200 ms after power-on.
  2. Drive ~CS low. D31 appears on SO within 100 ns.
  3. Issue exactly 32 SCK cycles, sampling SO on each rising edge (a 14-cycle read returns only the thermocouple field; do 32 to get faults + cold junction).
  4. Raise ~CS. Keep it high >= 200 ns (in practice, milliseconds, so the next conversion can update the register).

32-bit frame layout (datasheet Tables 2/3)#

BitsFieldCoding
D[31:18]14-bit thermocouple temperatureTwo's complement, 0.25 C/LSB (D31 sign, MSB weight 1024 C)
D17ReservedAlways 0
D16Fault summary1 if any of SCV/SCG/OC active
D[15:4]12-bit internal (cold-junction) temperatureTwo's complement, 0.0625 C/LSB (D15 sign, MSB weight 64 C)
D3ReservedAlways 0
D2SCV fault1 = thermocouple shorted to VCC
D1SCG fault1 = thermocouple shorted to GND
D0OC fault1 = thermocouple open (no connection)

Expected first response at room temperature#

With the thermocouple tip and the board both at ~25.0 C: thermocouple field = 25.00/0.25 = 100 = 0b00000001100100; internal field = 25.0000/0.0625 = 400 = 0x190. Ideal frame: 0x01901900 (fault bits all 0). Realistically both fields read "roughly room temperature, within a couple of C, all fault bits 0, D17 = D3 = 0" — e.g. anything decoding to 20-28 C on both fields on a normal bench. Immediate red flags: 0xFFFFFFFF or 0x00000000 (wiring/MISO problem, not a plausible reading), D17/D3 set (bit-alignment error in the host), or the two temperature fields wildly disagreeing at ambient.

8. Manual schematic and assembly review checklist#

9. Ordered bench-test procedure#

Stop at the first abnormal result. Record board serial, host/adapter identity, ambient temperature, and raw 32-bit frames (hex) for every step.

A. Unpowered inspection and resistance tests#

  1. Visual inspection under magnification: U1 orientation, solder bridges on the SOIC-8, C2 across the TC nets.
  2. Measure 3V3-to-GND resistance (expect high, no hard short in either meter polarity).
  3. With no thermocouple fitted, J2-1 to J2-2 should read as C2 charging (high/open at DC). J2-1 or J2-2 to GND must not be a short.
  4. Verify ~10 kΩ from CS_N (PMOD pin 1) to 3V3 and ~100 Ω from U1 pin 7 pad to PMOD pin 3.

B. First power and first transaction#

Context (b) standalone first: bench supply 3.30 V, current limit 20 mA, into PMOD 3V3/GND; lab MCU or SPI adapter on ~CS/SCK/MISO, common ground.

  1. Power on with no thermocouple fitted. Supply current should be roughly 0.9-1.5 mA (I_CC) — tens of mA indicates a fault; stop.
  2. Wait >= 200 ms. Run the section 7 transaction at <= 1 MHz.
  3. Expect D16 = 1 and D0 (OC) = 1 because no thermocouple is fitted, with a sane internal temperature in D[15:4]. Datasheet: with T+/T- unconnected the thermocouple sign bit D31 reads 0 and D[30:18] read all 1s.
  4. Fit the thermocouple in J2 (T+ to pin 1). Re-read: fault bits clear, both temperature fields near ambient (section 7 expected response).
  5. Scope check: confirm SO transitions follow SCK falling edges and the sampled mode is 0; try 5 MHz only after 1 MHz is solid.

Context (a) PMOD host: repeat steps 2-4 with the module plugged into the ECP5 host PMOD (3.3 V bank), using the HDL SPI master. Verify the host PMOD really supplies 3.3 V before insertion.

C. Thermocouple polarity test#

  1. With the reading stable at ambient, pinch the thermocouple tip between two fingers (or briefly bring a heat gun near it). The reading must move up by several degrees within a couple of conversions.
  2. If the reading moves down when the junction warms, the leads are swapped at J2: the thermoelectric voltage is inverted. Swap them and repeat. Do not rely on wire colors (ANSI type K: red is negative).
  3. Let the tip cool; the reading must return to ambient.

D. Ice-point and boiling-point sanity checks#

  1. 0 C: stirred ice-water slush (crushed ice, just enough water), tip in the slush not touching the container. Expect 0.0 C +/- 2 C per the datasheet K-type accuracy, plus the probe's own tolerance (a class 2 K probe adds up to +/-2.5 C — record the probe class).
  2. ~100 C: freshly boiling water, tip submerged, not touching the pot. Expect ~100 C +/- 2 C at sea level; the boiling point drops roughly 1 C per 285 m of altitude (e.g. ~96.7 C at 1000 m), so correct for local altitude/pressure before judging.
  3. Record the internal (cold-junction) field during both tests; it should stay near room temperature. If it tracks the bath, heat is conducting up the wires into J2/U1 — a cold-junction gradient problem.

E. Open-circuit and fault-bit tests#

  1. While polling, unscrew one thermocouple lead from J2. Within one or two conversions (t_CONV <= 100 ms each) D0 (OC) must go to 1 and D16 (fault) must go to 1. Reconnect; both must clear.
  2. Optional, current-limited and deliberate: short T+ to GND at J2 (expect D1 SCG + D16), then T+ to 3V3 through the probe (expect D2 SCV + D16). Restore wiring and confirm all faults clear and readings return.
  3. Confirm the host software surfaces D16 and refuses to report the temperature fields as valid while any fault bit is set.

F. Noise, gradient, and rate characterization (pre-release)#

  1. Log 10 minutes of readings at ambient; expect the thermocouple field to sit within 1-2 LSB (0.25-0.5 C) peak-to-peak on a quiet bench.
  2. Repeat with the host FPGA busy (context (a)) to check SCK/host-noise coupling; a visible worsening points at layout/filtering, C1/C2.
  3. Blow warm air across the board (not the tip) and watch for reading shifts with a constant-temperature tip: quantifies the cold-junction gradient error for the eventual layout.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
Frame reads all 1sMISO idle level, ~CS actually reaching U1MISO open/R1, ~CS stuck high, no power at U1
Frame reads all 0sSO activity on scope during readSO short to GND, SCK not reaching U1, U1 dead/reversed
D17 or D3 nonzeroBit alignment vs SCK count on scopeHost shifting by one bit, wrong SPI mode/phase
OC fault with TC fittedJ2 clamp tightness, lead continuityLoose screw contact, broken thermocouple wire
Reading falls when tip heatedSection 9.C polarity testT+/T- swapped at J2
Reading offset by several C at ambientInternal vs thermocouple field comparisonCold-junction gradient, heat source near U1, probe class
Jumpy readings (many LSB)Log with host idle vs busy; check C2 presenceMissing/wrong C2, EMI on TC leads, supply noise/C1
Wrong but plausible temperaturesU1 marking (suffix letter), decode mathNon-K variant fitted, or firmware scaling error (0.25 C/LSB)
Works at 1 MHz, fails at 5 MHzSO edges vs SCK on scopeBus capacitance with R1, marginal wiring in context (b)

11. Bench record template#

FieldRecord
Board revision / serial
Context (a) host or (b) supply+adapter IDs
Thermocouple probe type/class/serial
DMM/scope equipment and calibration date
Ambient temperature
First 32-bit frame (hex) and decode
No-TC OC fault frame (hex)
Polarity test result
Ice-point reading / error
Boiling-point reading / altitude correction / error
Fault-bit test results (OC/SCG/SCV)
Max verified SCK rate
Noise log summary (LSB p-p)
Deviations, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The schematic follows the MAX31855 datasheet's application guidance closely: 0.1 uF supply bypass (C1), the rev-2-recommended 10 nF differential input filter (C2), a released bus by default (R2), and a protected sensor-driven data line (R1). The design's honest weak points are all layout-stage and verification-stage: the cold-junction isothermal placement of J2 and U1 is a note, not yet copper; no first article exists, so the +/-2 C accuracy class, 5 MHz operation through R1, fault-bit timing, and gradient behavior are all unverified targets. The polarity, ice/boiling, and open-circuit tests in section 9 are the minimum evidence needed before trusting this module to teach correct numbers.